下林明正のブログ

個人的かつ雑多なブログです。

Google App Script(GAS)でスクリプトプロパティをユーザー入力で設定する方法

先に断っておくとGASについて詳しくないです。

APIトークン的な情報をGASで扱いたいけど外部には露出させたくないときに、調べてみるとプロパティストアというやつが使えそうだった。

しかし、どうやら新エディタではプロパティストアへのインターフェースが消滅しているらしく、プロパティストアにセットするコードを書き捨てましょうみたいな情報とか、セットしたいときだけ旧エディタを使いましょうみたいな情報しかパッと見つからなかった。

コードを書き捨てするのは汎用性が低いし、旧エディタもいつまで使えるのかよく分からない(もしかしたら一生使えるのかも知れないが、調べてない)。

ユーザー入力を受け取る何かしらの方法があるだろうと思って調べてみたところ、以下のような方法がありそうだった。

これらを統合すると、以下のようなコードになると思う。

function onOpen() {
  SpreadsheetApp.getUi()
      .createMenu('カスタムメニュー')
      .addItem('APIトークンを設定する', 'showApiTokenPrompt')
      .addToUi();
}
function showApiTokenPrompt() {
  var ui = SpreadsheetApp.getUi();
  var result = ui.prompt(
    'APIトークンを入力してください。',
    'APIトークン:',
    ui.ButtonSet.OK_CANCEL);

  var button = result.getSelectedButton();
  var text = result.getResponseText();
  if (button == ui.Button.OK) {
    const scriptProperties = PropertiesService.getScriptProperties();
    scriptProperties.setProperty('API_TOKEN', text);
  }
}

APIトークンを使いたいときは、

    const scriptProperties = PropertiesService.getScriptProperties();
    this.asanaToken = scriptProperties.getProperty('API_TOKEN');

こういう調子で動くことは確認できた(スプレッドシートの右上に少し待つと「カスタムメニュー」が表示されるので、そこから入力プロンプトを表示させられる)。

ちなみにGASエディタ上でこうした関数を直接実行するとGASが紐付いているスプレッドシートの方でプロンプトが出るようだった。 コード的には当然という気もするけど見えないタブで開いてたので気付かなくて、エディタからは実行できないのかな?とか当初は思ってた。

ただ、これだけだと全員が編集権限を持っている時に他人がGASのコードを書いたり旧エディタを使ったりすることで依然としてAPIトークンを取り出すことができてしまう。 その対策としては、自分以外は閲覧権限までに絞っておくことくらいしか今の所思いついていない(閲覧権限しか無い状態だと、GASのエディタが見えない・そもそもGASが実行されないようだった)。

ちゃんと調べてないけどきっとAPIトークンを隠蔽するもっと適した方法があっても良いはず。何かご存知でしたら教えて下さい。