スクリプト本体の実行前にユーザ設定値を変更しておき、本体実行後に元に戻す、という処理が頻出する。
特によくあるのが app.scriptPreferences
の設定。 enableRedraw
はほとんどの場合で disable したいだろうし、 measurementUnit
は意図しない設定になっていると絶対値の組み込まれたアルゴリズムが不具合を起こす。
この辺の〈保持→変更→復元〉という処理を main()
などに直接入れちゃうと煩雑なので、 scriptSettings.alter()
と scriptSettings.revert()
で本体ルーチンを挟むだけでいいようにメソッド化してみた。
// Make alter and revert methods
var scriptSettings = {
alter: function() {
var prefs = app.scriptPreferences;
var propStrs = ["enableRedraw", "measurementUnit", "userInteractionLevel"];
var tempVals = [false, AutoEnum.AUTO_VALUE, UserInteractionLevels.INTERACT_WITH_ALL]
var originalVals = [];
for (var i = 0; i < propStrs.length; i++) {
originalVals.push(prefs[propStrs[i]]); // Retain original values
prefs[propStrs[i]] = tempVals[i]; // Change to temporary values
}
// Make a function to revert to original values
this.revert = function() {
for (var i = 0; i < propStrs.length; i++) {
prefs[propStrs[i]] = originalVals[i];
}
};
}
};
以上を本体処理より前に declare しておくだけ。
メリット
- 変更不要のプロパティがあれば、
propStrs
とtempVals
の array から削るだけ - エラーなどで途中
exit()
する場面でも、その手前でscriptSettings.revert()
を call するだけ
scriptSettings
の declare 時ではなく、 alter()
を call した時点での設定値が保存される、という点にだけ注意。