はじめに
GASで処理した結果をスプレッドシートで他人に見せたいが、そのGASでの処理内容は見せたくない。
ということがしばしば起こります。
例えば、何らかのWebサービスにログインした結果をスプレッドシートに出して他人に見せたいが
ログインに必要なIDパスワードは知られたくない。などなど。
本記事のようにすることで、
他人にソースコードを見せないようにすることができます。
実現方法
やり方をざっくりいうと、以下のようにします。
- スプレッドシートとスクリプトを別々に管理する。
- スプレッドシートには他人への閲覧権限を与える。
- スクリプトの権限は自分のみにする。
ちなみに
スプレッドシートとくっついたスクリプトをContainer-bound Scripts、
今回のように別々で管理するスクリプトをStandalone Scriptsと言います。
サンプル
スクリプトで生成した「Hello World」という文字列をスプレッドシートに表示させるというサンプルを通して
具体的にどうするか見ていきましょう。
スプレッドシート
準備
新規でスプレッドシートを作ります。
名前を適当につけます。
ここでは「HelloWorldSheet」という名前にします。
権限設定
HelloWorldSheetのスプレッドシートは他人に見せたいので、
招待したり、URLを知っている人に公開にしたりと
適当に権限を設定します。
スプレッドシートID
スクリプトからスプレッドシートを指定するときにHelloWorldSheetのスプレッドシートIDを使います。
スプレッドシートのURLは
https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXXXXXXXXXXXX/edit#gid=0
のようになっていますが、XXXXXXXXXXXXXXXXXXXXXXXX
の部分がスプレッドシートのIDになります。
スクリプトで使うのでメモっておきます。
スクリプト
準備
Standalone Scriptでスクリプトを作ります。
Googleドライブを開き、
新規 > その他 > Google Apps Script
でスクリプトを作成します。
ソースコード
const SPREADSHEET_ID = 'XXXXXXXXXXXXXXXXXXXXXXXX'; // HelloWorldSheetのID
function myFunction() {
const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getActiveSheet();
sheet.getRange('A1').setValue('Hello World');
}
通常のContainer-bound Scriptsの場合はgetActiveSpreadsheet()で書き込み対象のシートを取得していたのですが、__openById()__でIDを指定しているところが要注意です。
権限設定
このスクリプトのソースコードを見られたくないので、権限は自分のみにします。
完了
スクリプトで myFunction() を実行すると、HelloWorldSheetのA1にHello Worldと表示されます。
もちろん、他のアカウントでスクリプトを見ようとしても権限がないので
ソースコードは見られませんし、処理結果のスプレッドシートは他アカウントから見ることができます。
おわりに
ログインに必要なIDパスワードを隠すのであればUserPropertiesをうまく使えばできそうなのですが、
GUI上であらかじめ設定しておくということができないようで、
現状ではこのように処理部分と表示とを分ける方法しかなさそうです。
他にいい方法があれば教えていただけると幸いです。