[GAS] 実行タイミングはどれがいい？ボタンクリック、カスタムメニューそれともトリガー？

# はじめに
GASを実行するタイミングは、お見積りや開発のご相談を受けた際によくある確認事項の一つです。ご相談時には具体的なイメージを持たれていないことが多いですが、実行方法を指定している場合においても、その他の方法は検討されていないことが多いです。

本稿では、**実行タイミング** の種類とそのメリット・デメリットをざっくりと極簡単に、私見度合いたっぷりで紹介したいと思います。主に当方のクライアント様へ向けた内容となりますのでご了承ください。

::: note
前提条件
スプレッドシートがメインUIであるプロジェクトを前提とします。スタンドアロンスクリプトを始め、一部サービス（ドキュメントやスライドなど）には対応していないものもあります。また、**Html Service** や **App Sheet** は考慮しません。
:::

# 実行タイミングの種類とそのメリット・デメリット
## 実行タイミングの種類
よく使用されるのは以下の４種類かと思います。
- シンプルトリガー
- ボタンクリック
- カスタムメニュー
- 時間主導型トリガーによる定期実行

その他、**インストーラブルトリガー** や **GASによるカスタム関数** などもありますが、本稿では触れません。また、同様に、稀にある **サイドバー表示による実行** についても **Html Service** になりますので触れません。

なお、**インストーラブルトリガー** については拙記事ではございますが、以下を参照ください。

https://qiita.com/STSHISHO/items/73606c402af0a770684d

### シンプルトリガー
具体的には「ファイルを開いた時に」や「特定のセルが編集されたら」実行する、というものです。

> Simple triggers are a set of reserved functions built into Apps Script

GASに標準で組み込まれている関数のセットとなり、面倒な「承認」作業が不要です。その反面、原則として外部ファイルへのアクセスが不可、実行時間３０秒等の **制限事項** があります。また、利用するサービスによって対応内容は異なりますので、これらの詳細は [公式ガイド](https://developers.google.com/apps-script/guides/triggers) にてご確認ください。

なお、私見ではありますが、特に `onEdit()` の使用については積極的には推奨しません。

https://qiita.com/STSHISHO/items/8cec8041951d182c937e

「承認」作業については拙記事ではございますが、以下を参照ください。

https://qiita.com/STSHISHO/items/f2ce468ab78682c26699


### ボタンクリック
ボタン画像を設置し、押下することで実行するというものです。UI的には一番わかり易いと思いますが、ボタン設置用のスペースが必要、UX的に押下感（クリックやタップ）が無いことがデメリットと言えます。

また、環境にもよると思いますが、**ボタン画像が非表示になる** ことがあります。非表示になっているだけで、オブジェクトは存在しているため、クリックすると実行されます。多くの場合、リロードすると表示されるようになりますが、改善しない場合は都度、再設置が必要になります。

### カスタムメニュー
各サービス上部のメニュー項目に、ユーザーオリジナルの項目を追加し、該当の処理を選択して実行する、というものです。通常は上記シンプルトリガー `onOpen()` と連動させて使用します。ボタンクリックと異なり、メインUIの邪魔をしませんが、実行までの手数が多いこととメニューが表示されるまでの待ち時間が発生することがデメリットと言えます。

### 時間主導型トリガーによる定期実行
具体的には「特定の日時」や「毎日定期的に」実行する、というものです。ユーザー自身は何もせず、一度設定するだけで定期的に自動で処理を行ってくれる、ということが最大のメリットと言えます。１アカウントあたりの実行トリガー数等の制限はありますが、実行にはタイムラグが生じるため、厳密な時間指定がない、重たい処理を頻繁に行わない、といった場合には積極的に利用してもよいかと思います。

ただ、エラー発生時、メール通知かスクリプトエディタ画面での確認となるため、リアルタイムに捕捉することは難しいです。そのため、マニュアル実行（手動実行）に比較すると、初動対応は遅れることになります。

なお、トリガーの設定が少し面倒とは思いますが、 設定方法については 拙記事ですが、以下 にて解説していますので、よろしければ参照ください。

https://qiita.com/STSHISHO/items/9efe8e7308ba49ca3e74

### メリットとデメリットまとめ
本当にざっくりと極簡単ですが、あくまでも私見によるメリットとデメリットを表にしました。

|  | メリット | デメリット |
|:------------------------|:--|:--|
| シンプルトリガー | 「承認」作業が不要 | 外部参照不可、実行時間３０秒など制限事項あり |
| ボタンクリック | UI的にわかりやすい | ボタン設置用のスペースが必要<br>UX的にわかりにくい<br>画像が表示されない時がある |
| カスタムメニュー | メインUIの邪魔をしない | 表示に時間がかかる<br>実行までの手数が増える |
| 時間主導型トリガー | ユーザーは何もしなくて良い | 設定が少し面倒<br>タイムラグが生じる<br>エラー発生時のリアルタイム捕捉が困難<br>トリガー設置数など制限事項あり |

:::note
対象となる関数に引数を設定している場合には、ラップした関数を指定するなどの工夫が必要になります。
:::

# 最後に
処理内容やプロジェクトの構成内容等でも変わりますが、個人的には **カスタムメニュー** による実行を推奨することが多いです。理由としては、任意のタイミングで実行できること、マニュアル実行のためエラー時の初動対応がしやすいことと、挙動が安定していることです。あと、余談ですが、実装コストも低いため、クライアント様にも優しいです。

誰かのお役に立てたなら幸いです。

# [参考・引用]
- [Simple Triggers  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/guides/triggers)
- [[GAS] onEditはできれば使いたくないが使わざるを得ない場合の注意点と対処例など](https://qiita.com/STSHISHO/items/8cec8041951d182c937e)
- [[GAS] インストーラブルトリガーの設定方法など（１）～トリガーの追加から保存、編集、削除の基本プロセス](https://qiita.com/STSHISHO/items/73606c402af0a770684d) 
- [[GAS] 主に初回実行時「承認が必要です」ダイアログが出た場合の承認作業とアクセス権限の確認プロセス](https://qiita.com/STSHISHO/items/f2ce468ab78682c26699) 
- [[GAS] インストーラブルトリガーの設定方法など（２）～ 時間主導型トリガー](https://qiita.com/STSHISHO/items/9efe8e7308ba49ca3e74)
- [Quotas for Google Services  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/guides/services/quotas#current_quotas)