1年ほど前、わたしは、Google Formで、フォーム入力者にフォーム回答の後からの編集を許可する設定のものを作成したことがあります。この設定にすると、入力者がフォーム入力して送信後に「回答を編集」リンクが表示されます。
しかし、この画面を閉じてしまうと、もうそのリンクを取り出せません。
そこで、フォーム入力後に、入力者にメールを送るGASを組み込み、その中で回答を編集するURLも記載するようにしました。しかし、この「回答更新用のURL」をどう取得したらよいかが、なかなかわからずに苦労しました※。探し回って、ようやくGoogleのGoogle Apps API Japanのフォーラムの回答 からパラメタ名を見つけ出し、どうにかGASを組むことができました。
最近 chatGPT が話題です。chatGPTはコードも書けるというのを見て、この時のことを思い出しました。そこで、chatGPTでGASを書くことにトライしてみました。
chatGPTへの質問と回答
1.「メールを入力者に送る」と指示
質問:
Google Formsへの入力があったら、入力内容と、入力内容の変更ができるURLを記載したメールを入力者に送るGASを書いてください。
回答:
回答のコード部分を以下に引用します。
function sendConfirmationEmail(e) {
// フォームの回答データを取得する
const response = e.response;
const itemResponses = response.getItemResponses();
// メールの本文を作成する
let body = "以下の内容で、お申し込みを受け付けました。\n\n";
for (const itemResponse of itemResponses) {
body += `${itemResponse.getItem().getTitle()}: ${itemResponse.getResponse()}\n`;
}
// フォームの回答編集用URLを作成する
const editUrl = response.getEditResponseUrl();
// メール送信する
GmailApp.sendEmail({
to: response.getRespondentEmail(),
subject: "お申し込みありがとうございます",
body: `${body}\n\n上記の内容に誤りがある場合は、以下のURLから修正してください。\n${editUrl}`
});
}
回答ではこれに加えて、Formのスクリプトへの貼り方、スクリプトのトリガーの設定への解説も語ってくれるので、親切です。
実行結果:
実行したところ、エラーになりました。メール宛先に「response.getRespondentEmail()」を指定していますがこれがエラーになっているようです。このコードは、Google Formの設定で「メールアドレスを収集する」がなされていることを前提にしているのではないかと気づき、Google Formの設定の方を「メールアドレスを収集する」をオンにする変更をしたら、うまくいきました。
しかし、欲しいのは、「メールアドレスを収集する」はオフにするFormでのコードです。メールアドレスは入力項目の一つとして設定してもらいます。
(ちなみに「メールアドレスを収集する」をオフにするのは、reCAPCHA認証表示を避けるためです。)
2.「メールアドレスをフォーム入力から入手してメールを送信する」と指示
そこで、メールアドレスはフォーム入力から取得するよう指示しました。また、メールの体裁を整えるべく、本文冒頭に宛名を書くよう指示しました。
質問:
Google Formsへの入力があったら、フォームの1番目の項目に入力されたメールアドレスを送信先とし、入力内容と、入力内容の変更ができるURLを記載したメールを送るGASを書いてください。メール本文の先頭には、フォームの2番目の項目に入力された氏名を記載し、氏名の後ろに”様”を付けてください。
回答:
回答のコード部分を以下に引用します。コードの前後のchatGPTの出力も記載します。
以下のGoogle Apps Script (GAS) コードは、Google Forms に入力された回答に対して、回答者のメールアドレスにメールを送信するものです。メールの本文には、回答者の氏名と入力内容、および入力内容の変更ができるURLが記載されます。フォームの1番目の質問がメールアドレス、2番目の質問が氏名であることを前提としています。
function sendConfirmationEmail(e) {
// フォームの回答を取得する
var responses = e.response.getItemResponses();
var email = responses[0].getResponse();
var name = responses[1].getResponse() + "様";
// メールの件名と本文を作成する
var subject = "フォーム回答の確認";
var body = name + "、この度はフォームに回答いただきありがとうございます。\n\n以下は、あなたが入力した情報です。\n\n";
for (var i = 0; i < responses.length; i++) {
body += responses[i].getItem().getTitle() + ":" + responses[i].getResponse() + "\n";
}
var editResponseUrl = e.response.getEditResponseUrl();
body += "\nこの回答を変更するには、以下のリンクをクリックしてください。\n" + editResponseUrl;
// メールを送信する
GmailApp.sendEmail(email, subject, body);
}
このコードを使用するには、以下の手順に従ってください。
Google Forms を開きます。
フォームを作成し、2番目の質問が「氏名」、1番目の質問が「メールアドレス」になっていることを確認します。
「スクリプトエディタ」を開きます。
上記のコードを貼り付けます。
「ファイル」メニューから「保存」を選択して、プロジェクトに名前を付けます。
「トリガー」メニューを開き、新しいトリガーを追加します。
「送信時」を選択し、「フォーム送信時」から、関数を「sendConfirmationEmail」として設定します。
トリガーを有効化します。
これで、フォームに回答が送信されるたびに、回答者のメールアドレスに回答の確認メールが送信されます。メール本文には、回答者の氏名、入力内容、および入力内容の変更ができるURLが含まれます。
実行結果:
このスクリプトは意図通り動き、入力された氏名をメール本文に置いて後ろに「様」を付けたので、メールらしくなりました。
ただし、途中経過で、要素の取り出し方を間違えたりし、何度か再生成をしました。
chatGPTを使った感想
- 昨年私が見つけるのに苦労した「 e.response.getEditResponseUrl()」というパラメータを、chatGPTはあっさり見つけました。chatGPTは1年前にはなかったので、仕方がないのですが、あったらだいぶ時間が節約できたかもしれません。
- ただ、同じ指示を出しても、生成されるコードは異なりました。1回だけ、スプレッドシート側のGASが生成されましたが、おそらくそれは、同時書き込みに対応できていないコードと思われます。※
それ以外にも、動作に問題のあるコードを生成する場合があるので、GASを全く知らない状態でchatGPTの結果を使うことはできないと思います。 - 質問を具体的にしていくことで、使えるコードを出してくれるようになるところは、面白い経験でした。面倒なところを書いてくれるので助かります。
- 指示は日本語で書いたのですが、回答は、生成するメールが日本語になったり英語になったりするのは、chatGPT の気まぐれ?
- コメントも適切なのに驚きました。
- バグがあるコードを生成した際、指示を書き換えなくても、再作成を指示するだけで次は適切なコードを出したりします。おかしいと思ったら再作成、でもよい場合もあります。
- 「変数を表すのは let を使ってください。」を付け加えたら、GAS実行時にエラーとなるコードを出してしまいました。下手な指示はすべきではないようです。
※Google Formの「回答更新用のURL」については、ネットで検索すると、回答を書くGoogle スプレッドシートのGASにURLを書き込む例が出てきます。しかしそれは「回答を編集するURLをまとめて取得し、その最新のものを選ぶ」という実装で、これだとほぼ同時にフォーム入力があった場合に、一瞬前の入力者にも後の入力者のURLを送ってしまう事象があり、採用できませんでした。
コメントを残す