今回はGAS(Google Apps Script)に関して書いていきます。
GASで「スプレッドシート」と「Gmail」を操作します。
スプレッドシートでは以下の情報を管理します。
- 会社名
- 名前
- メールアドレス
- メール件名
- メール本文
上記の内容を取得し、Gmailを組み立てるプログラムをGASで実装してみます。
「定型文だけど宛先だけ違うメールを送る」みたいな業務はよくあるはずで、それをGASで自動化してみます。
それでは本題へ。
GASとは?
まずは「GASとは?」について書いておきます。
Google Apps Script(GAS)は、ひとことで言えばGoogleが提供する各種サービスの自動化/連携を行うためのローコード開発(※1)ツールです。GASを使うと、Gmailやカレンダー、Googleスプレッドシート、Googleドライブなど、Googleが提供する様々なサービス上で処理を自動化したり、複数のサービスを連携させたりできます。
※1:ローコード開発:可能な限りソースコードを書かずにアプリケーションを開発する手法出典:【入門】GASとは?できること&活用法を解説(サンプルコード付き) - マーケティングオートメーションツール SATORI
やりたいこと
記事の冒頭でも触れた通り、スプレッドシートで管理している宛先情報を基にGmailを組み立てます。
スプレッドシートの内容は以下の通りです。
GASで上記の内容を取得し、Gmailを組み立てます。
メール本文の{{会社名}}や{{名前}}を、宛先一覧の当該項目と対応させます。
GASで置換処理を実装して差し込みます。
とりあえず「{{ }}」で囲んでおけば、意図しない置換は防げるかなと。
なお、メールアドレスには自分自身のGmailアドレスを指定しています。
そのGmailアドレスにエイリアス設定して送信テストしてみます。
Gmailのエイリアス設定に関しては以下を参考にして頂ければと。
www.android.com
シーケンス図
全体像をシーケンス図にまとめてみました(ざっくりですが)。
ちなみに上記のシーケンス図はMermaidで書いています。
Mermaidに関しては記事も書いています。
こちらも良ければぜひ。
miya-moto-memo.hatenablog.com
今回のシーケンス図のMermaidコードも載せておきます。
%%{init:{'theme':'default'}}%% sequenceDiagram autonumber actor User User->>GAS: プログラム実行 GAS->>スプレッドシート: データ取得(メールアドレス等) GAS->>GAS: データ加工 GAS->>Gmail: 下書きメール作成
事前準備
スプレッドシートの準備
先ほど画像を載せましたが、スプレッドシートを事前に作成しておきます。
スプレッドシートを作成したら、以下2つの操作をしておきます。
- ファイルIDを控えておく
- シート名を決めておく
GASとスプレッドシートの連携
スプレッドシートのファイルIDをスクリプトプロパティに設定しておきます。
詳細は以下の記事を見てもらえればと思います。
miya-moto-memo.hatenablog.com
プログラム
準備が整ったところで、プログラムです。
※事前準備が完了している前提です。
// スプレッドシートのファイルID const SS_FILE_ID= PropertiesService.getScriptProperties().getProperty('SPREADSHEET_FILE_ID'); // スプレッドシート const SS = SpreadsheetApp.openById(SS_FILE_ID); /** * メイン処理 */ function main() { // 宛先一覧からデータ取得 const addresses = getAddresses(); // 下書きメール作成 for (const address of addresses) { // メールアドレス const to = address.mailAddress; // メール件名 const subject = getSubject(); // メール本文 let body = getBody(); // メール本文を置換 body = replaceBody(body, address); // 下書きメール作成 GmailApp.createDraft(to, subject, body); } } /** * 宛先一覧からデータ取得 */ function getAddresses() { const sheet = SS.getSheetByName('宛先一覧'); const lastRow = sheet.getLastRow(); const lastColumn = sheet.getLastColumn(); const sheetValues = sheet.getRange(2, 1, lastRow, lastColumn).getValues(); const objectArray = []; for (const value of sheetValues) { if(value.includes('')) continue; objectArray.push({ company: value[0], // 会社名 name: value[1], // 名前 mailAddress: value[2], // メールアドレス }); } return objectArray; } /** * メール件名取得 */ function getSubject() { const sheet = SS.getSheetByName('メール本文'); const subject = sheet.getRange('B1'); return subject.getValue(); } /** * メール本文取得 */ function getBody() { const sheet = SS.getSheetByName('メール本文'); const body = sheet.getRange('B2'); return body.getValue(); } /** * メール本文を置換 */ function replaceBody(body, address) { body = body.replaceAll('{{会社名}}', address.company); body = body.replaceAll('{{名前}}', address.name); return body; }