今回は、最小限の知識で入門する Google Apps Script〜自動化の構想編〜 から作り続けてきた通院を記録するシステムを完成させ、フォームから回答が送られると自動的にドキュメントが作成され、関係者にメール通知が送られるようにします。
目次
これまでに作った関数を振り返る
Google フォームから送られてきた回答はGoogle スプレッドシートに記録されるようになっていました。これはもともとGoogle スプレッドシートやGoogle フォームが持っている機能で、わざわざプログラミングをすることなく使えるものでした。
また、Google Apps Script でプログラミングをして以下のような関数を作りました。
- Google スプレッドシートに記録された情報を二次元配列として取り出す関数 getAllData
- 関数 getAllData の戻り値として得られる二次元配列から、Google ドキュメントを作る関数 writeToDoc
- Google ドキュメントが作られたことを Gmail で関係者に知らせる関数 sendNotification
ではここで、それぞれの関数について、引数、処理内容、戻り値を確認しておくことにします。
関数 getAllData
引数はありません。
戻り値は二次元配列で、スプレッドシートに記録されているすべての情報が含まれています。
const all_data = getAllData();
とすることにより、スプレッドシートに記録されているすべての情報を二次元配列 all_data に格納します。
関数 writeToDoc
引数はありません。
この関数は、その内部で関数 getAllData を呼ぶように作られていました。そして関数 getAllData の戻り値を使って Google ドキュメントが作られるようになっていました。
また、戻り値はありません。
関数 sendNotification
引数はありません。
この関数は、 関数 writeToDoc によって作られる Google ドキュメントを閲覧するための URL を関係者に Gmail で送信するということを行うのでした。
また、戻り値はありません。
一連の処理を順に実行する関数 main を作る
関数 getAllData は関数 writeToDoc の中で呼び出されるため、一連の処理を実行するには、まず関数 writeTodoc を実行し、それに続けて関数 sendNotification を実行すればよいということになります。そこで、これら一連の処理を行う関数を作ることにし、関数の名前を main としてみます。すると次のようになります。
function main(){
writeToDoc();
sendNotification();
}
トリガーを設定する
さて、一連の処理を順に実行する関数 main を作りましたが、関数 mainがいつ実行されるべきなのかというと、それはもちろん、Google フォームから回答が送信されたときです。また、フォームから送信された回答は自動的にスプレッドシートに記録されるのですから、関数 main は、スプレッドシートの内容が更新されたときに実行してもよいということになります。
ところで、Google Apps Script には、このようなことに対処するための仕組みが用意されています。それがトリガーと呼ばれるものです。
ここで言うトリガーとは、ある決められた時刻やある決められた出来事をきっかけに関数を実行する機能のことです。
Google Apps Script では、日にち単位、時間単位、分単位で関数を実行することもできますし、例えば、スプレッドシートの内容が更新されたときやフォームから回答が送信されたときなどの出来事をきっかけにして関数を実行することができます。
ここでは、スプレッドシートの内容が更新されたときに関数 main を実行することにします。
まず、次のように、Google Apps Script の編集を行っている画面の左側で縦に並んでいるメニューから「トリガー」をクリックします。

すると次のように、トリガー一覧が表示されている画面が開きます。ここで、画面右下の「トリガーを追加」をクリックします。

すると次のように、トリガーを設定する画面が開きます。

上のように、トリガー設定では、いくつかの項目を設定するようになっていますが、今回は以下のように各項目の選択をします。
- 実行する関数
関数 main を選びます。 - 実行するデプロイ
選択できないようになっているはずです。(Head しか選べないはずです。最終的に編集された関数 main を実行するということになります。 ) - イベントのソース
「スプレッドシートから」を選択します。つまり、スプレッドシートに何かが起きたら関数を実行するというように設定したわけです。 - イベントの種類
「変更時」を選択します。つまり、スプレッドシートの内容が変更されたときに関数を実行するということです。」 - エラー通知設定
ここでは「毎日通知を受け取る」としておきます。
何らかの理由で、トリガーで設定したとおりに関数が正しく実行されないことがあります。そのようなときにGmailで毎日通知してもらうようにしたわけです。
以上のように設定し、「保存」をクリックします。
これで、関数 main はフォームから回答が送信されスプレッドシートの内容が変更されたときに自動的に実行されるようになるわけです。
トリガー一覧画面に戻ると、次の図のように、トリガーが実行されるたびに、どの関数を実行したのか、実行した時刻、成功したのか失敗したのかということが記録されていくようになっているのがわかります。

これで、通院記録システムは完成です。
落穂拾い
出力される Google ドキュメントはこの下の図の左側(スマホで見ている人は上)のようなもので、目次(Google ではドキュメントの概要と呼んでいるようです)には文書のタイトルである「通院記録」だけが表示されます。なぜかというと、関数 writeToDoc では、「通院日」、「医療機関」…などは段落として扱っている(見出しとして扱っていない)ため、これらは左側の目次欄には表示されないわけです。
下の図の右側(スマホで見ている人は下)の図は、関数 writeToDoc を少し変更し、「通院日」と「医療機関」をつなげて「見出し1」として出力する(さらに青字にし、フォントサイズも大きくして出力する)ようにしたものです。「見出し1」として出力したので、左側の目次欄に表示されるようになるわけです。このほうが良さそうですね。JavaScript での文字列の連結の仕方とGoogle Apps Script での Google ドキュメントの基本的な扱い方 を知っていると簡単に変更できます。チャレンジしてみてください。

