たぷつきません

おなかがでてきた。もうたぷついてるやん。

Apps Scriptのトリガの依存関係

 トリガの依存関係というかプロジェクト(スクリプト*1の依存関係が分かりにくすぎるので整理する。
 まずはTriggersメニューから。
「現在プロジェクトのトリガー」と「全てのトリガー」があるが、後者の「全てのトリガー」とは、開いているスプレッドシートに紐付いている全てのプロジェクトを指している。そのスプレッドシートにしかないものもあれば、ギャラリーから取得できる複製もある。
 スプレッドシートの「コピーを作成」すると、全てのプロジェクトもコピーが作成される。なので、複数スプレッドシートから1つのプロジェクトを参照することはできない*2
 次に、トリガー設定画面上に表示される、各トリガの話。
 まずはシンプルイベント(onOpen,onEdit,onInstall)から。スプレッドシートから起動時に実行されるトリガーとしていて依存関係としてはこのトリガの所有者はプロジェクト自身になる。onOpenで言えば、「onOpenというメソッド名がある」ことが条件で自動的に追加される。現在プロジェクトのトリガだろうと、全てのプロジェクトのトリガだろうと関係なく、いくつものプロジェクトにonOpenがあっても1行だけ操作できない状態で表示される。onOpenが定義されていないプロジェクトからは「現在のプロジェクトのトリガー」でも「全てのトリガー」でも何も表示されない。実行コンテキスト上の権限は実際に開いたり編集したりインストールしたユーザーのアクセス者権限で行われる。実行者権限はスクリプトを書いたオーナーになる。しかしOAuthの承認などアクセス権をもらいたいコードの場合、スクリプトマネージャからの直接実行しないと「承認が必要です。」と言われるだけでケアしてくれない*3
 時刻主導型トリガは、ユーザーに紐付けられる。エラー時の通知先もアクセス中のユーザー宛になる。このためシンプルイベントのようにスクリプトが独立して動作できる定周期のトリガが作れない。
 これもスプレッドシートの「コピーの作成」で失われる。シンプルイベント以外の手動で追加したトリガーはどれもコピーされない。残念。

*1:Google自身文言がスクリプトと言ったりプロジェクトと言ったり一定じゃない。例えば現在のスクリプトのトリガーをクリックすると現在のプロジェクトのトリガーというタイトルの画面が出てくる

*2:というわけで、バグがあってスクリプトに変更を加えたら以前複製したスプレッドシート内の同じ名前のスクリプトにも同じ変更を加えないといけない。コード(プロジェクト)とデータ(スプレッドシート)は分離できずセットになる

*3:こちらに遷移してくれないという意味です。