先に断っておくとGASについて詳しくないです。
APIトークン的な情報をGASで扱いたいけど外部には露出させたくないときに、調べてみるとプロパティストアというやつが使えそうだった。
- 【GAS】コードにAPIトークンやIDのベタ書きを避ける(プロパティサービスの活用) - Qiita
- Class PropertiesService | Apps Script | Google Developers
しかし、どうやら新エディタではプロパティストアへのインターフェースが消滅しているらしく、プロパティストアにセットするコードを書き捨てましょうみたいな情報とか、セットしたいときだけ旧エディタを使いましょうみたいな情報しかパッと見つからなかった。
コードを書き捨てするのは汎用性が低いし、旧エディタもいつまで使えるのかよく分からない(もしかしたら一生使えるのかも知れないが、調べてない)。
ユーザー入力を受け取る何かしらの方法があるだろうと思って調べてみたところ、以下のような方法がありそうだった。
- Class Browser | Apps Script | Google Developers
This method is not recommended. Instead, use a UI prompt.
- とのことなのでおとなしくUI promptを見てみる👇
- Dialogs and Sidebars in Google Workspace Documents | Apps Script | Google Developers
- inputBoxと比較すると随分面倒だけど、やりたいことはできそう
これらを統合すると、以下のようなコードになると思う。
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トークンを隠蔽するもっと適した方法があっても良いはず。何かご存知でしたら教えて下さい。