scriptPreferencesをバッチ変更→復元

スクリプト本体の実行前にユーザ設定値を変更しておき、本体実行後に元に戻す、という処理が頻出する。

特によくあるのが 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 しておくだけ。

メリット

  1. 変更不要のプロパティがあれば、 propStrstempVals の array から削るだけ
  2. エラーなどで途中 exit() する場面でも、その手前で scriptSettings.revert() を call するだけ

scriptSettings の declare 時ではなく、 alter() を call した時点での設定値が保存される、という点にだけ注意。