ラブグラフでエンジニアをしています横江 (@yokoe24 ) です。
ラブグラフでは、エンジニア以外で Google Apps Script (GAS) を書く方も多く、
Slack通知の自動化など、業務の効率化がおこなわれています。
マジですごいと思います!
一方で、コードを見るとプログラマーからするとムズムズするところもあります。
getValue()
を回しているgetValue()
メソッドはコストが高く、何度も実行するとタイムアウトの可能性が高まる==
で比較している"
と single quotes'
が混ざっているこういうコードを見ると直したくてウズウズしてしまいます。
とはいえ、プログラマーが書く時間もなかなか割けないのが実情です。
Google Apps Script を書いてもらうため、
ChatGPT にこう聞いてみました。
Google フォームの回答が連携されるスプレッドシートの回答を、質問と回答の関係が見やすいように Slack 通知する Google Apps Script を書いてください。
なお、Slack への通知が済んだらスプレッドシート側にマークを付けて、同じ回答が再び通知されないようにしてください。
let や const を使う ES2015 らしい書き方で、trailing comma, single quotes を使うようお願いします。定数名は大文字とアンダーバーで表現してください。関数には必ず JSDOC の形式で日本語のコメントを、他もなるべく日本語のコメントをつけてください。
(あとで説明しますが、この3行目のところがけっこう大事です)
すると ChatGPT はこう返してくれました。
以下は、Google フォームからの回答を Slack に通知し、通知済みのものにマークをつける Google Apps Script です。
/** * Google スプレッドシートと Slack 連携用の Google Apps Script *@fileoverview Google フォームの回答を Slack に通知し、通知済みはスプレッドシートにマークを付ける */// Slack への Webhook URL と、通知済みマークを設定する列のインデックスconstSLACK_WEBHOOK_URL='https://hooks.slack.com/services/XXXXXXXXX/YYYYYYYYY/ZZZZZZZZZZ';constNOTIFIED_COLUMN_INDEX=10;// 10列目に通知済みマークをつけるとする/** * スプレッドシートの新しい回答を Slack に通知する関数 */functionnotifyNewResponsesToSlack(){const sheet=SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();const rows= sheet.getDataRange().getValues();// ヘッダー行(質問)を取得const headers= rows[0];for(let i=1; i< rows.length; i++){const row= rows[i];// すでに通知済みの場合はスキップif(row[NOTIFIED_COLUMN_INDEX-1]==='通知済み')continue;let message='*新しい回答があります:* \n';for(let j=0; j< headers.length; j++){ message+=`>${headers[j]}:${row[j]}\n`;}// Slack にメッセージを送信sendToSlack(message);// 通知済みとしてマークを付ける sheet.getRange(i+1,NOTIFIED_COLUMN_INDEX).setValue('通知済み');}}/** * Slack へのメッセージ送信を行う関数 *@param{string}message - Slack に送信するメッセージ */functionsendToSlack(message){const payload={text: message,};const options={method:'post',contentType:'application/json',payload:JSON.stringify(payload),};// Slack へのリクエストを行うUrlFetchApp.fetch(SLACK_WEBHOOK_URL, options);}
注意事項:
- 上記のスクリプトは仮想のものであり、動作保証はありません。利用の際は適切にテストしてください。
- `SLACK_WEBHOOK_URL` を実際の Slack Incoming Webhook URL に置き換えてください。
- `NOTIFIED_COLUMN_INDEX` は通知済みマークを付ける列のインデックスを指定します。10列目に通知済みマークをつけるとしていますが、実際のシートの列の配置に応じて適宜変更してください。
このスクリプトは、スプレッドシートに新しい回答があるたびに手動で実行するか、トリガーを設定して自動実行することを想定しています。
注意事項まで記載してくれているのがいいですよね。
ちなみに、Googleフォームの回答時のトリガーはたまに適切に動かないことがあるそうなので、
回答を記録するスプレッドシートに対して1時間ごとに実行するトリガーを設定することを想定しています。
上のコードは、質問してから30秒程度で 書き上げてくれます!
仮に私が書いたら、1時間以上はかかっていることでしょう。
そして私が書くよりもきれいなコードです。
コメントはややエンジニアからすると冗長かもしれませんが、
関数に対しての説明コメントがわかりやすいですし、
「通知済み」と記載される列を定数にするなど、メンテナンスしやすいコードで書かれています。
getValues()
で最初に全ての値をとってから
その二次元配列を回す構成は、Google Apps Script を書くことに熟練している人のものです。
ChatGPT に Google Apps Script を書くのを任せると、
速い上にメンテナンス性の高いコードを書いてくれるのです!
たまに動かないコードを書くことがあるので、その場合はエンジニアに確認してもらうといいですが、
もはや Google Apps Script は、人間の手で1から書き上げるものではなくなっています!
質問をする際は、こういうふうにするといいです。
〜〜〜〜〜〜〜する Google Apps Script を書いてください。
let や const を使う ES2015 らしい書き方で、trailing comma, single quotes を使うようお願いします。定数名は大文字とアンダーバーで表現してください。関数には必ず JSDOC の形式で日本語のコメントを、他もなるべく日本語のコメントをつけてください。
var
で書いてきます。また、`a: ${a}`
のような文字列内の変数展開も使うようになってくれます『ChatGPT Enterprise』を使っていない限りは、社内の機密情報を書かないようにしましょう。
学習に利用されるためなんらかの事故につながる危険性があります。
社内で扱う商品名など具体的な情報を書かずに、なるべく抽象的な言い回しにして質問するようにしてください。
生成AIは時代を変えてくれましたね!
なお、同じ質問を Bing Chat にもしてみたのですが、
そちらは以下のようなonFormSubmit
を使うやり方で出力してきました。
トリガーをどう設定するかこちら側が言及していないせいではあるのですが、
メソッドとしてコードを切り分けてくれたりはせず、
ChatGPT のほうが、コードを書くことに関して上手いことチューニングされているように感じました!
/** * Google フォームの回答を Slack に通知する * *@param{Object}e - フォームの回答情報 */functiononFormSubmit(e){constSLACK_WEBHOOK_URL='https://hooks.slack.com/services/...';// ここに Slack の Webhook URL を設定してくださいconstSPREADSHEET=SpreadsheetApp.getActiveSpreadsheet();constSHEET=SPREADSHEET.getSheets()[0];// 最初のシートを取得constROW=SHEET.getActiveRange().getRow();// 現在の行を取得let message=''; e.namedValues.forEach((value, key)=>{ message+=`${key}:${value}\n`;// 質問と回答をメッセージに追加});// Slack への通知UrlFetchApp.fetch(SLACK_WEBHOOK_URL,{method:'post',payload:JSON.stringify({text: message}),});// スプレッドシートにマークを付けるSHEET.getRange(ROW,SHEET.getLastColumn()+1).setValue('通知済み');}
バッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。