GASを別アカウント・他人アカウントで実行させるトリガーを作成するベストプラクティス

#GASを作成するお仕事って結構ありますよね
フリーランスになってから、細かいお仕事をいくつかいただいていますが、GASで実現することが少なくないです。
Googleスプレッドシート駆動のGASならば、スプレッドシートを開いたアカウントで実行されますから、実行アカウントを意識することはあまりないです。

でも、トリガーを作成する場合、トリガー作成アカウントが実行アカウントになりますね。

GASを作成するお仕事をもらって、トリガーで実現する必要があるとき、お客さんのアカウントで実行させるトリガーを作る方法として、すぐに思いつくことは次のようなものだと思います。

- お客さんにアカウント情報を教えてもらって、一時的にログインしてトリガーを作成
- お客さんに手順を教えて、トリガーを作成してもらう

前者はできればやりたくないです。
後者はちゃんとやってくれるか不安ですね。場合によっては設定誤りで想定外の動作をするかもしれません。

#本件のゴール
お客さんにできるだけ負担を与えずに、お客さんのアカウントを実行アカウントとするトリガーを作成したいです。

今思いついている１つを記載しますが、あとでいいアイディアがあったら追記していきたいと思います。

#別アカウント・他人アカウントで実行させるトリガーを作成するベストプラクティス
##GASでトリガーを作成する
想定通りに動作するトリガーをGASで作成できるファンクション「createTrigger」を作成します。
createTrigger を動作するのはお客さんです。

| メリット | □正しいトリガーを確実に作成できる。<BR/>□お客さんに、何が作成され、どのような権限が利用されるのかを、oAuth同意画面で確認してもらえる。|
|:---------|:---------|:---------|
| デメリット | ■お客さんに createTrigger を実行してもらわなければならない。|

###script
**次のスクリプトがやっていることは次の通りです。**

- MAIN_FUNCTION を実行するトリガーがすでに登録されていたら削除する
- MAIN_FUNCTION を実行するトリガーを、毎分実行するように作成する

```Javascript:createTrigger.js
function createTrigger(){
  var triggers = ScriptApp.getProjectTriggers();
  for(var i=0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == MAIN_FUNCTION) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
  ScriptApp.newTrigger(MAIN_FUNCTION).timeBased().everyMinutes(1).create();
}
```

その他カレンダーベースや、スプレッドシート起因のトリガー作成もできますが、ここでは割愛します。

### createTrigger を実行してもらう
ここはお客さんにも見てもらうので、詳しく書きます。

#### スクリプトを開く
**GASがスプレッドシート付属のもののときと、単体のときで、開き方が変わります。**

#####スプレッドシート付属のGASのとき
**GDriveから、目的のスプレッドシートを開きます。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366986/d8cf05d3-a5f6-901d-686f-b98cc09ee23f.png)
---
**スプレッドシート画面、上部メニュー - ツール - スクリプトエディタ を選択します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366986/35d28dcf-ee75-e5a8-4c86-8c79b605563b.png)


#####GAS単体のとき
**GDriveから、目的のスクリプトを開きます。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366986/966f0218-5dbb-3448-f6ff-414937d13800.png)

#### createTrigger を実行し、同意画面で実行を許可する
**スクリプトエディタ上部メニューの実行ファンクションを選択するプルダウンから、「createTrigger」を選択します。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366986/24eaf2b5-2658-4ea7-f567-0ae0a703b659.png)
---
**実行ボタン** ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366986/8b5ebda1-ecd0-72ca-8e7d-3c49d8bae6c4.png) **をクリックします。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366986/292a88e1-ee14-ad66-290c-27b813de0e32.png)
---
**許可を促すダイアログで** ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366986/f531653c-6278-c7c9-5822-cdee07a44487.png) **をクリックします。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366986/8d54a1b2-d648-a88b-5b84-bdd10bd6bceb.png)
---
**同意画面表示のために、Googleアカウントでログインします。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366986/f76dc6bb-f776-65e1-0ee8-4a2be8c329b8.png)
---
**アプリを確認するため「詳細」をクリックします。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366986/296cedbb-c1d8-4282-37e8-33a47323d857.png)
---
**画面下側に表示が追加されます。「 {スクリプト名}（安全ではないページ）に移動 」をクリックします。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366986/963bc921-f48e-8987-cbc0-bd62bd915287.png)
---
**このスクリプトが必要とする権限が表示されます。**
**これを確認して** ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366986/49fb9e81-9e2f-700d-dd55-44e983605d07.png) **をクリックします。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366986/062bd8b5-bd54-6b0a-8440-0bb652962bca.png)
---
**以上でトリガーが作成されます。**

#まとめ
GASを制作する受注案件ですから、お客さんにあまり負担をさせたくないです。
ましてやアカウントログイン情報をお借りするというのはやりたくないです。
制作者の権限で動作させたままお客さんに使ってもらうというのもできなくないですが、間違って削除したり、そもそもメール送信系スクリプトでは、お客さんのアカウントを実行アカウントにするほかないです。

スクリプトでトリガーを作成する方法ならば、少なくとも正しいトリガーが作成できますね。
できれば、お客さんに実行してもらうことも省ければいいのですが、今のところ思いついていません。

G Suite とかなら、なんかできるんでしょうかね。
でも、お客さんの組織に制作者のアカウントを属させなきゃならないとか、少なからず負担は発生しそうなので、今のところこの方法がベストプラクティスだと信じていますが、他に良い方法があったら、ぜひ教えてくださいまし。