【GAS】Googleフォームの回答受付開始と締め切りを自動で行う

# 背景
- Googleフォームは便利ですが、**標準の設定だと指定した時間に回答受付を開始したり締め切ることができません**（2022年11月14日現在）。手動でもいいじゃんと思うかもしれませんが、最近気になっていたGoogle Apps Script（GAS）の勉強にもなると思い、色々調べて自動化に取り組みました。
- GASとは、Google社が提供するプログラミング言語です（JavaScriptベースの言語のようです）。Googleのアカウントさえあれば使うことができます。

# やりたいこと
1. 指定した時間に回答の受付を自動で開始する
1. 回答の受付を開始したら、通知のメール（開始の知らせ）を受信する
1. 指定した時間に回答の受付を自動で締め切る
1. 回答の受付を締め切ったら、通知のメール（締め切った知らせ + 回答確認ページへのリンク）を受信する

# やり方
## 1.　自動化したいGoogleフォームを開き、【送信】の右隣りの点（【その他】）をクリックする（この時点で回答の受付を締め切っておきます）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/f7777fd6-b453-aa10-2c82-9f1eaad53a25.png)


## 2.　【<>スクリプトエディタ】をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/4e88efa2-431d-7886-37a0-d0b39645206b.png)

## 3.　現在表示されているコードを削除し、以下のコードを張り付けてください。**"メールを受け取りたいメールアドレス"の箇所を変更してください。**
- 名前（無題のプロジェクトと表示されている箇所）は変えなくても変えてもどちらでもいいです。

```
// 自動で受付を開始するプログラム
function openForm() {
  const form = FormApp.getActiveForm();  
  form.setAcceptingResponses(true);
  const formName = form.getTitle() 
  const recipient = "メールを受け取りたいメールアドレス"
  const subject = "\"" + formName + "\""
  const body = "\"" + formName + "\"" + " just has opened."
  GmailApp.sendEmail(recipient, subject, body) 
}

// 自動で受付を締め切るプログラム
function closeForm() {
  const form = FormApp.getActiveForm();
  form.setAcceptingResponses(false);
  const formName = form.getTitle()
  const url = form.getEditUrl() + "#responses"
  const recipient = "メールを受け取りたいメールアドレス"
  const subject = "\"" + formName + "\""
  const body = "\"" + formName + "\"" +" has just closed.\nCheck the URL below\n" + url
  GmailApp.sendEmail(recipient, subject, body) 
}
```
## 4.　問題なく作動するかテストする
- まず、自動で受付を開始するプログラム（openForm）が作動するかを確かめます。【実行ログ】の左が"openForm"になっているかを確認し、【実行】を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/30103dc1-355a-c7c0-af8e-3bce13e6c5a8.png)

* 権限の承認画面がでますので、【権限を確認】を押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/6bdbfb8a-3847-c441-1e87-5b6c0316e2ba.png)

* この画面が出たら、【詳細】をクリックし、一番下の青くハイライトされた箇所（無題のプロジェクトに移動）をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/811c0f7b-64f1-86cc-67c6-56305d0407dd.png)
- 画面の下半分に表示される【実行ログ】に黄色のバーで実行完了が表示されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/f71ee498-ed66-faa3-3211-554408ca3281.png)

- 次に、自動で受付を締め切るプログラム（closeForm）が作動するか確認します。【実行ログ】の左を"closeForm"に変更し（下矢印ボタンを押して選ぶ）、【実行】を押します。権限承認の画面はもう出ません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/49c62690-b49f-d336-1ab3-790182c8d527.png)

## 5.　実行する時間を選択する
- テストが無事に完了したら、実際に実行するために機能を設定します。画面の左端に目覚まし時計のマーク（【トリガー】）があるので、それをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/6defe720-ee18-e8b4-86e6-aadcf1d65f95.png)

- ページ下部の【+ トリガーを追加】をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/733bd715-af30-29b3-6514-6488bc6235da.png)

- 実行テストと同じように、"openForm"と"coloseForm"の**両方を設定**します。まずは"openForm"からです。【実行する関数を選択】で"openForm"を設定。【イベントのソースを選択】で【時間主導型】を選択します。【時間ベースのトリガーのタイプを選択】で【特定の日時】を選択します。日時を指定したら忘れずに保存してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/ac4387d0-075a-4336-17a1-00a28a0c6bba.png)

- 画面のようにトリガーが追加されています。次に、"closeForm"を設定します。【+ トリガーの追加】を押して、【実行する関数を選択】で"closeForm"を設定。あとのやり方は"openForm"と同じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/79c8de06-a17b-df2a-29c5-fe88346ee58a.png)

- 下の画面のようになっていれば完成です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/26024f33-ae18-153a-1af0-963f318bee2d.png)

# 実行結果
- 以下の2通のメールを受信できました。
- 受付開始時
    - 件名にフォームのタイトルが入り、本文にもフォームの名前と開始したことが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/894343dd-f1b5-4335-048e-a6db40371a65.png)

- 受付終了時
    - 件名にフォームのタイトルが入り、本文にもフォームの名前と終了したこと、そして回答の集計が確認できるURLが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/360e2cf7-10ca-6be2-413e-6e5c4b91a139.png)

# 注意すること
## 時間の誤差
- 設定した時間に命令を実行しますが、**実行時間に誤差がある**と報告している記事がありました（[こちら](https://sumukoto.com/google-forms-time-execusion/)）。Googleフォームを配布する際には、5分くらいの余裕を持たせて時間を設定する方がよいかもしれません。

## メール送信の上限
- 無料のGoogleアカウントの場合、GASを使って送信できるメールの数が**1日100件**という上限があります。Google Workspaceだと1500件送信できるようです。以下のスクリプトであとどれくらい送信できるのかを確認できます。

```
function myFunction(){
  Logger.log(MailApp.getRemainingDailyQuota())
}
```
- 僕の場合、あと79通のメールを本日送れるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344524/c6410611-aa0d-d784-c542-c4fe6adabc1c.png)


# 最後に
- 「GASを使ったこんな便利なことできるよ！」もしくは「こんなことできませんか？」という意見があればコメント欄で是非共有していただけると幸いです。

# 参考資料

## 書籍
- [GoogleAppsScript実践プログラミング](https://www.amazon.co.jp/GoogleAppsScript%E5%AE%9F%E8%B7%B5%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E4%BB%8A%E8%A5%BF-%E8%88%AA%E5%B9%B3/dp/4798061271/ref=sr_1_2_sspa?keywords=google+apps+script%E5%AE%9F%E8%B7%B5%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0&qid=1668412815&qu=eyJxc2MiOiIwLjgwIiwicXNhIjoiMC43MiIsInFzcCI6IjAuODEifQ%3D%3D&sprefix=google+apps+script%E5%AE%9F%E8%B7%B5%2Caps%2C176&sr=8-2-spons&psc=1&spLa=ZW5jcnlwdGVkUXVhbGlmaWVyPUFEUE9FTDc4TDBBWlgmZW5jcnlwdGVkSWQ9QTAxNTA3ODQxTk84QjlJTUJPTFcyJmVuY3J5cHRlZEFkSWQ9QTJVTU1IWFdGVkNVWVkmd2lkZ2V0TmFtZT1zcF9hdGYmYWN0aW9uPWNsaWNrUmVkaXJlY3QmZG9Ob3RMb2dDbGljaz10cnVl)（GASについて）

## ウェブサイト
- [Googleフォームを自動で受付終了にする方法 (時間指定・件数指定)](https://web-breeze.net/form-autoclose/#toc1) (プログラム)
- [Googleフォームを朝の時間だけ受け付けたい。自動で回答の開始・締切時間を設定する方法。](https://note.com/edup/n/nefbdc5e562ca)(プログラム)
- [Googleフォームの回答受付と閉鎖を時間指定する方法を知ろう！](https://sumukoto.com/google-forms-time-execusion/) (実行開始時間の誤差)
- [GASのメール送信は実行上限に注意！残り回数確認と上限以上のメールを送る方法](https://auto-worker.com/blog/?p=2638#) (メール送信の上限と確認プログラム)