はじめに
本シリーズでは、GASの始め方や便利な使い方、ビジネス活用まで幅広く解説します。シリーズをひと通り読んでいただければ、あなたもきっとGASマスターになれるはずです。
シリーズの対象者
- そもそもGASってなんだかわからない方
- GASを学びたいけど何から始めればいいかわからない方
- GASはわかり始めたけど、もっと活用ができないかと模索している方
- とにかくGoogleが好き! という方
前回記事
Googleフォームと連携する
では早速始めていきましょう。【0からGASを学ぶ】シリーズの第10回は「GASを用いてGoogleフォームからThanksメールを送ろう」です。今回からはGoogleフォームとGASの連携を中心にお伝えしていこうと思います。第5回や第7回では、スプレッドシートを起点としてメールを自動送信しました。今回はこれのGoogleフォーム版です。
今回やること
- Googleフォームのフォーム項目をGASで取得する。
- 回答内容をGASで取得して、Thanksメールを送信する。
- Googleフォームで回答送信時にGASが動くようトリガーを紐づける。
事前準備
Googleフォームを作成
今回の起動元となるフォームを作成していきましょう。回答送信後にThanksメールを送付したいので、フォーム内にメールアドレスの入力欄を設けてください。
試しに一度回答
Googleフォームを作成したら、右上の「プレビュー」ボタンを押下して、一度回答してみましょう。
どうでしょうか、特にメールが来たりはしませんよね、そりゃそうです。まだ何もしてないので、それではスタートしていきましょう。
プログラム開始
GASエディタを開く
準備したGoogleフォームからコンテナバインド型でGASプログラムを記述していきましょう。Googleフォームからコンテナバインド型のGASを開く場合は、以下のようにメニューを開き「<> スクリプトエディタ」をクリックしてください。では、どんどんいきますよ、ついてきてください。
STEP.1 Googleフォームのフォーム項目をGASで取得する
function Qiita010_formSubmit(e) {
// フォームの回答(イベント)オブジェクトから内容を取得する。
const itemResponses = e.response.getItemResponses();
console.log(itemResponses);
}
ここのポイントはお気づきでしょうが、引数であるe
です。上記関数はこのあとのSTEPでフォームの回答を送信した際に起動するようトリガーを設定します。このトリガーを設定した場合に、その発生したイベントに紐づく情報がe
に設定されます。そのため、このe
をイベントオブジェクトと呼びます。
では上記をGASエディタから実行するとどうなるでしょうか。
23:31:52 お知らせ 実行開始
23:31:53 エラー
TypeError: Cannot read properties of undefined (reading 'response')
動きません。それはそのはずです。
e
はイベントに紐づく情報が設定されるため、GASエディタからの実行は決してイベントではないため、この場合はe
が設定されません。
じゃあGoogleフォームのGAS連携は一発勝負なのか!?
上述の通りGASエディタからの実行ができないとなると、GASの実行結果を確かめるには、トリガーを設定して、フォームの回答を行い、結果を得るという非効率な方法しかできないのでしょうか。
安心してください。小技により、これも解決できます。先ほどのプログラムを以下のように書き換えましょう。
function Qiita010_formSubmit(e) {
// フォームの回答をイベントオブジェクトまたはフォーム自身から取得する。
const itemResponses = (e !== undefined)
? e.response.getItemResponses()
: FormApp.getActiveForm().getResponses()[FormApp.getActiveForm().getResponses().length-1].getItemResponses();
console.log(itemResponses);
}
少々複雑ですが、実際は大したことないです。ここでは三項演算子を利用して、イベントオブジェクトが設定されている場合はイベントオブジェクトから(e.response.getItemResponses()
)、設定されていない場合はフォーム自身から(FormApp.getActiveForm().getResponses()[FormApp.getActiveForm().getResponses().length-1].getItemResponses()
)取得するようにしています。
配列のIndex値をFormApp.getActiveForm().getResponses().length-1
としていますが、これによりフォームの最終回答を得ることができます。例えば、最初の回答であればFormApp.getActiveForm().getResponses()[0].getItemResponses()
、2番目の回答であればFormApp.getActiveForm().getResponses()[1].getItemResponses()
といった具合でそれぞれ取得することができます。
ではこれを実行してみましょう。
23:49:51 お知らせ 実行開始
23:49:51 情報 [ { toString: [Function],
getItem: [Function],
getResponse: [Function],
setFeedback: [Function],
getFeedback: [Function],
setScore: [Function],
getScore: [Function] },
{ toString: [Function],
getItem: [Function],
getResponse: [Function],
setFeedback: [Function],
getFeedback: [Function],
setScore: [Function],
getScore: [Function] },
{ toString: [Function],
getItem: [Function],
getResponse: [Function],
setFeedback: [Function],
getFeedback: [Function],
setScore: [Function],
getScore: [Function] } ]
23:49:52 お知らせ 実行完了
今度は問題なく取得することができましたね。
STEP.2 回答内容をGASで取得して、Thanksメールを送信する
では、GASエディタから実行することができるようになりましたので、回答を確認していきましょう。
function Qiita010_formSubmit(e) {
const itemResponses = (e !== undefined)
? e.response.getItemResponses()
: FormApp.getActiveForm().getResponses()[FormApp.getActiveForm().getResponses().length-1].getItemResponses();
// 取得したフォームの内容を全量取得する。
itemResponses.forEach(function(itemResponse){
console.log(itemResponse.getItem().getTitle());
console.log(itemResponse.getResponse());
});
}
こちらを実行すると、以下のような出力になります。
事前準備で作成したフォームおよび回答によって、内容は変わってきますが、各フォーム項目のタイトルと回答の順に表示されるかと思います。
23:53:34 お知らせ 実行開始
23:53:34 情報 お名前をお答えください。
23:53:34 情報 gas-suke
23:53:34 情報 あなたはGASが好きですか。
23:53:34 情報 はい
23:53:34 情報 サンクスメールの送り先メールアドレスを記載してください。
23:53:34 情報 ********@gmail.com
23:53:35 お知らせ 実行完了
各フォーム項目に対して、タイトルや説明といった質問項目を取得する場合はgetItem()
を、回答者の回答を取得する場合はgetResponse()
を使用します。詳細は以下を確認下さい(今後のシリーズでどんどん紹介しますので参考までに)。
それでは、「サンクスメールの送り先メールアドレスを記載してください。」の回答と、「お名前をお答えください。」の回答を利用して、Thanksメールを送信しましょう。
function Qiita010_formSubmit(e) {
const itemResponses = (e !== undefined)
? e.response.getItemResponses()
: FormApp.getActiveForm().getResponses()[FormApp.getActiveForm().getResponses().length-1].getItemResponses();
let recipient = ''
, toName = '';
// 取得したフォームの内容を全量取得する。
itemResponses.forEach(function(itemResponse){
switch (itemResponse.getItem().getTitle()){
case 'お名前をお答えください。':
toName = itemResponse.getResponse();
break;
case 'サンクスメールの送り先メールアドレスを記載してください。':
recipient = itemResponse.getResponse();
break;
default:
}
});
// 神回で紹介した方法でメールを送信する。
sendEmailEx(recipient, 'Thanks', toName+'さんへ');
}
function sendEmailEx(_recipient, _subject, _body, _option) {
// 引数の内容でメールを下書き保存する
const mailDraft = GmailApp.createDraft(_recipient, _subject, _body, _option);
// 下書き保存したメールIDから下書きを取得し、メール送信を依頼する
GmailApp.getDraft(mailDraft.getId()).send();
}
さ、これでメールが届きましたね。あとはトリガーを設定するだけです!
STEP.3 Googleフォームで回答送信時にGASが動くようトリガーを紐づける
こちらの記事を参考にトリガーの設定画面を開いてください。トリガーの設定画面において、「イベントのソースを選択」を[フォームから]に、「イベントの種類を選択」を[フォーム送信時]に設定してください。
これで、Googleフォームにて回答者の回答が送信されると、本トリガーにより作成したメソッド(例ではQiita010_formSubmit
)が起動し、回答内容が引数であるイベントオブジェクト:e
に設定されます。
STEP.おまけ 動かしてみよう
それではすべての準備が整いましたので、試しにフォームに回答してみましょう。
↓
↓
おわりに
お疲れ様でした。
第10回は「GASを用いてGoogleフォームからThanksメールを送ろう」ということで、今回からは新たにGoogleフォームをメインに扱い始めました。今回はItemResponses
に関して多くを語りませんでしたが、Googleフォームで提供しているテキスト形式やプルダウン形式、マトリクス形式などにどうアクセスすればよいかを今後お伝えしていきます。Googleフォームはノーコードで誰でも簡単にフォームが作れますので業務活用も非常に容易にできるかと思います。そこにさらにGASが加われば鬼に金棒です。引き続き、GASを楽しんでいきましょう!!
記事を読んで、「良いな」や「今後に期待できる!」と感じて頂けたらいいねやフォロー、コメントいただけると幸いです。それではまた次回をお楽しみに!