Skip to content

Instantly share code, notes, and snippets.

@shingorow
Last active September 14, 2016 08:08
Show Gist options
  • Save shingorow/778510adf2ee11cfca2febd4ac4e57fc to your computer and use it in GitHub Desktop.
Save shingorow/778510adf2ee11cfca2febd4ac4e57fc to your computer and use it in GitHub Desktop.
Send emails with GmailApp in Google Apps Script
// 最初にスクリプトエディタの "スクリプトのプロパティ" に情報を登録します。
// ssId: 宛先リストが記載されているスプレッドシートの ID
// sheetName: 宛先リストが記載されているスプレッドシートのシート名
// confSheet: 宛先リストが記載されているスプレッドシートに作成したセッティングが記載されているシート名
// docId: メール本文のテンプレートになる文章が記載されている Document の ID
// "スクリプトのプロパティ" から設定を読み込む
var props = PropertiesService.getScriptProperties();
// スクリプト内で使う設定を登録する
var config = {}
// スプレッドシートに関する情報
config.spreadsheet = {
ssId: props.getProperty('ssId'),
sheetName: props.getProperty('sheetName'),
confSheet: props.getProperty('confSheet')
};
// ドキュメントに関する情報
config.document = {
docId: props.getProperty('docId')
};
// Email に関する情報を初期化
config.email = {
options: {
from: '',
name: '',
bcc: ''
}
};
// Email に関する設定を登録する
(function() {
var ss = SpreadsheetApp.openById(config.spreadsheet.ssId),
sheet = ss.getSheetByName(config.spreadsheet.confSheet),
range = sheet.getDataRange(),
values = range.getValues(),
settings = {},
i, length;
for (i = 0, length = values.length; i < length; i++) {
settings[values[i][0]] = values[i][1];
}
config.email.options.from = settings.from;
config.email.options.name = settings.name;
config.email.options.bcc = settings.bcc;
})();
// スプレッドシートから宛先リストを作成する
var getRecipients = function(ssId, sheetName) {
var ss, sheet, range, values, keys, list, recipients = {};
this.ssId = config.spreadsheet.ssId;
this.sheetName = config.spreadsheet.sheetName;
ss = SpreadsheetApp.openById(this.ssId);
sheet = ss.getSheetByName(this.sheetName);
range = sheet.getDataRange();
values = range.getValues();
keys = values.shift();
list = values.filter(function(v, i, arr) {
return v.join('') !== '';
});
recipients = list.map(function(v, i, arr) {
var buff = {}, j, length = keys.length;
for (j = 0; j < length; j++) {
buff[keys[j]] = v[j];
}
return buff;
});
return recipients;
}
// ドキュメントからメッセージのテンプレートを取得する
var getMessageTemplate = function(docId) {
var doc, subject, template;
this.docId = docId
doc = DocumentApp.openById(this.docId);
subject = doc.getName();
template = doc.getBody().getText();
return {subject: subject, template: template};
}
// 宛先と宛先別のメッセージ、送信先メールアドレスのオブジェクトを作成する
var createRecipientDataSet = function(template, replacements) {
var results;
this.template = template;
this.replacements = replacements;
results = this.replacements.map(function(v, i, arr) {
var i, re, body;
this.data = v;
body = this.template
for (i in this.data) {
re = new RegExp('{ ' + i + ' }', 'g');
body = body.replace(re, this.data[i]);
}
this.data.body = body;
return this.data;
});
return results;
}
// メールを送信する
var sendEmail = function(recipient, subject, body) {
var options = config.email.options; // config からメール送信のオプションを登録する
GmailApp.sendEmail(recipient, subject, body, options);
}
// 全ての関数を実行し、宛先リストに対してメールを送る
function sendEmailToList() {
var ssId = config.spreadsheet.ssId,
sheetName = config.spreadsheet.sheetName,
docId = config.document.docId,
recipients, docData, subject, recipientData, replacements, i, length, buff;
recipients = replacements = getRecipients(ssId, sheetName);
docData = getMessageTemplate(docId);
subject = docData.subject;
recipientData = createRecipientDataSet(docData.template, recipients);
for (i = 0, length = recipientData.length; i < length; i++) {
buff = recipientData[i];
sendEmail(buff.email, subject, buff.body);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment