その他

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'); }

後は左側のトリガーで希望のタイミングに設定。