以前投稿した『【GAS】スマホやタブレットからスプレッドシートのスクリプトを実行する方法』という記事が人気記事となり、毎日色々な人に読まれていることはとても嬉しいのですが、閲覧者が増えるにつれ、スクリプトエディタを編集されたり、削除されたりすることが多くなってきましたので、今回はそのような場合に使える対処法をご紹介しようと思います。
この記事を読まれている方の中にも、ファイル起動時や編集時に実行されるトリガーを設定したスプレッドシートを複数の人たちで編集するという運用をされている方もいると思うのですが、今回の方法を利用すれば編集者にスクリプトを見せないようにすることや、勝手に編集されないようにすることができますので、オススメの方法です。
この記事の内容が役立つターゲット読者
- 複数の編集者が利用するスプレッドシートでonEditやonOpenトリガーを利用している方
- バンドル型スクリプトのソースコードを見せたくない方
- バンドル型スクリプトのソースコードを編集させたくない方
- onEditやonOpenトリガーの関数を複数のファイルで利用している方
上記のような課題を抱えている方は本記事を読み進めて行くことで恩恵が受けられると思います。
記事の概要
結論から話しをすると、今回ご紹介する方法はバンドル型スクリプトをスタンドアロン型スクリプトにするという方法です。onEditやonOpenなどのトリガーはバンドル型スクリプトでしか実行できないと思っていた方も多いと思いますが、とてもシンプルな方法で外出しができます。それを利用することで、スプレッドシートにアクセスしている人にはスクリプトへのアクセスをさせないように設定することができます。
この場合、スクリプト実行者はスクリプトのオーナーになりますので、スプレッドシートの履歴管理はしづらくなることにご注意ください。
それでは、早速バンドル型スクリプトをスタンドアロン型スクリプトに外出しする方法をご紹介します。
バンドル型スクリプトを外出しする方法
バンドル型スクリプトを外出しする方法ですが、実はとてもシンプルな方法で実現できます。やり方の手順をまずは箇条書きで列挙します。
- スタンドアロン型スクリプトのファイルを作成
- バンドル型スクリプトからコードをコピーして1. のスクリプトに貼り付ける
- バンドル型スクリプトにトリガーを設定している場合はトリガーを削除
- トリガー設定用コードを1. で作成したスクリプトにコピペ(トリガー設定用コードは下記に記載しています)
- トリガー設定用コードを実行
手順としては以上です。
GASの操作に慣れている方であればおそらく上記の箇条書きでなにをしようとしているかわかると思いますが、GASではプログラムによってスクリプトのトリガーを設定するコードが用意してあります。そのコードを使って外部から対象のスプレッドシートに対してonEditなどのトリガーを設定するというのが今回の記事でやろうとしていることになります。
今回の例では、対象のファイルはスプレッドシートですが、GoogleドキュメントやGoogleフォームなどにも同じ様に設定することができますので、スプレッドシートという部分は対象のファイルタイプに読み変えてください。それでは、少し詳しく見ていきましょう。
スタンドアロン型スクリプトファイルの作成
まずは、スタンドアロン型スクリプトファイルを作成しましょう。スタンドアロン型スクリプトという言葉の意味がわからない場合は『3種類のスクリプトとスクリプトエディタの開き方』に説明が書いてありますので、こちらの記事をご確認ください。
バンドル型スクリプトから対象の関数をコピペ
すでにスクリプトにバンドルされたスクリプトがある場合には、バンドル型スクリプトから対象のファイルをコピーして作成したスタンドアロン型スクリプトファイルに貼り付けます。元のスクリプトはコピー後に削除してしまって構いません。バンドル型スクリプトがない場合には、スタンドアロン型スクリプトに直接コードを書き始めて良いです。
バンドル型スクリプトのトリガーの削除
バンドル型スクリプトからは元々あったスクリプトは削除してしまうため、編集時に起動するトリガーなどを手動で設定している場合にはトリガーの削除をしないとエラーが発生します。そのため、手動で設定したトリガーはこのタイミングで削除しましょう。
トリガー設定用コードをスタンドアロン型スクリプトにコピペ
下記のトリガー設定用コードをスタンドアロン型スクリプトにコピペしてください。
//トリガーを設定するプログラム var id = ""; //トリガー設定対象のファイルID function setTrigger() { var file = SpreadsheetApp.openById(id); //スプレッドシート以外であれば他のファイル用に変更してください。 var functionName = "runScript"; //トリガーを設定したい関数名 ScriptApp.newTrigger(functionName) .forSpreadsheet(file) .onEdit().create(); }
上記のコードをコピペしてください。
idにはトリガーを設定したいファイルIDを設定してください。今回はスプレッドシート用のスクリプトのため、forSpreadsheetというコードを利用していますが、この他に『forDocument』、『forForm』、そして『forUserCalendar』というメソッドが用意されています。その場合は適宜コードを置き換えてください。
functionNameには、トリガーによって実行したい関数名を指定します。
また、上記コードでは編集時に起動するonEditを設定する形にしておりますが、この他には『onChange』、『onOpen』、そして『onFormSubmit』というメソッドが用意されています。この部分も設定したいトリガーによって適宜置き換えてください。
トリガー設定用コードを実行
上記のトリガー設定用コード実行すると、idで指定したファイルに対してトリガーが設定されます。このスタンドアロン型ファイルはだれにも共有する必要はありませんので、コードを見せたくない場合やコードを編集されたくない場合などに有効な手段だと思います。
1つ注意点としては、コードの実行に関してはトリガーを設定したアカウントが実行する形になりますので、履歴管理をすることが少し難しくなるかもしれません。
まとめ
今回の記事では、バンドル型スクリプトをスタンドアロン型スクリプトに外出しする方法をご紹介しました。意外と簡単にこのような運用が構築できることがおわかり担ったと思いますが、スクリプトを開いて編集してしまう人が意外と多いのかなと思いましたので、皆様も同じことで困っているのかも?と思って記事にしてみました。
これで、コードの秘匿性を担保できますね。コードの内容によっては他のユーザーに見せたくないコードもあると思いますので、そのような場合に使ってみてください。
また、バンドル型ではありませんので、コードを部品化していろいろなコードで使い回すこともできるようになります。その場合はidを変更して複数のファイルに対して実行トリガーを設定してみてください。
ここまでお読みいただきありがとうございました。