Googleアンケートなどの結果を「毎月末メールで送ってね!」っていうクライアントがたまにいます。しかし、月末は戦場なのです・・・
忘れてしまうと問題ですので、GoogleスプレットシートをExcelに変換してから定期的にメール送信することにしました。
送りたいスプレットシートのメニューから、拡張機能→App Scriptに進み、以下をコピペ。
const FILE_NAME = '件名を入れます';
const TO = '宛先のメールアドレス';
const FROM_ALIAS = '自分のメールアドレス'; // Gmailで別名設定済みであること
const SENDER_NAME = '送信者名';
const SUBJECT = '件名を入れます';
const BODY = `メール本文
メール本文を入れます。
メール本文を入れます
;
function runDaily() {
if (!isLastDay_(new Date())) return; // 月末のみ送信
const file = pickLatestByName_(FILE_NAME);
if (!file) throw new Error('指定名のファイルが見つかりません: ' + FILE_NAME);
const xlsxBlob = exportXlsx_(file.getId())
.setName(`${file.getName()}_${formatYmd_(new Date())}.xlsx`);
GmailApp.sendEmail(
TO,
SUBJECT,
BODY,
{from: FROM_ALIAS, name: SENDER_NAME, attachments: [xlsxBlob]}
);
}
function pickLatestByName_(name) {
const it = DriveApp.getFilesByName(name);
let latest = null;
while (it.hasNext()) {
const f = it.next();
if (!latest || f.getLastUpdated() > latest.getLastUpdated()) latest = f;
}
return latest;
}
// 置き換え:エクスポート関数
function exportXlsx_(fileId) {
const url = `https://docs.google.com/spreadsheets/d/${fileId}/export?format=xlsx`;
const res = UrlFetchApp.fetch(url, {
headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() },
muteHttpExceptions: true,
followRedirects: true,
});
if (res.getResponseCode() !== 200) throw new Error('エクスポート失敗: ' + res.getResponseCode());
return res.getBlob();
}
function isLastDay_(d) {
const next = new Date(d);
next.setDate(d.getDate() + 1);
return next.getDate() === 1;
}
function formatYmd_(d){ return Utilities.formatDate(d, 'Asia/Tokyo', 'yyyyMMdd'); }
後は左側のトリガーで希望のタイミングに設定。