名簿に記載されている方の個人別にメールを送りたい
Google Spreadsheet に名前とメールアドレスなどがまとめてある場合、Bcc:などで一斉メールを送ることもできますが、本文中にお名前を入れて個々に送りたい時がありますね。
コピペするのも手ですが、せっかくなので Google Apps Script で自動化できると嬉しいと思ってスクリプトを書いていましたが、今回それを使おうとしたら、「このプロジェクトは Chrome V8 を搭載した新しい Apps Script ランタイムで実行しています。」というメッセージが出ていて、動作しませんでした。困った!
そこで、Chrome V8について調べると、
https://developers.google.com/apps-script/guides/v8-runtime
に説明があったので、この際、V8対応で書いてみました。
準備するもの
Google Document ファイル
メールの本文となるテキストを書いておきます。
氏名など置き換え用に {宛先名} などのキーワードを書いておきます。
またドキュメント名を Subject: に使用するようにしました。
Google Spreadsheet
送信相手の名前とメールアドレスなどが入っているもの。
1行目はタイトル行として無視しています。
列番号はA列が[0],B列が[1] のようになります。
ソース
onOpen でスプレッドシートにメニューが追加されますので、メニューの「メール送信」から「リストからメール送信」を選ぶと行ごとにメールを編集して送信します。
function onOpen() {
var ui = SpreadsheetApp.getUi(); // Or DocumentApp, SlidesApp, or FormApp.
ui.createMenu('メール送信')
.addItem('リストからメール送信', 'menu.item1')
.addToUi()
}
var menu = {
item1: function() {
sendEmail();
}
}
function sendEmail() {
// Googleドキュメントからメールの件名と本文を取得
var doc = DocumentApp.openById('<ドキュメントのID>');
var subject = doc.getName(); // ドキュメント名を subject とする
var text = doc.getBody().getText();
// Googleスプレッドシートからデータ取得
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getActiveSheet();
var range = sheet.getDataRange();
var rangeValues = range.getValues();
for(var i = 1; i < rangeValues.length; i++) { // 1行目[0]は対象外としている
// メール本文の置き換えとメール送信の処理
var name = rangeValues[i][1]; // 本文の置き換え用氏名のカラム
var email = rangeValues[i][2]; // 送信先メールアドレスのカラム
var replacedText = text.replace('{申込者名}', name);
// 送信前の確認処理(不要なら if文まで削除)
var ui = SpreadsheetApp.getUi();
var result = ui.alert(
'送信の確認(Press OK to SendEmail)',
(name + '\n' + email + '\n' + replacedText),
ui.ButtonSet.YES_NO);
if (result == ui.Button.YES) {
GmailApp.sendEmail(
email,
subject,
replacedText,
{
from: '<送信元メールアドレス>',
cc: '<Cc:のメールアドレス>',
noReply: false,
replyTo: ''
}
);
}
}
}