notebook

都内でWEB系エンジニアやってます。

GASを使ってメール添付されたCSVファイルをスプレッドシートへ転記する

なんかしらのレポートCSVをメールでは送れるけどAPIはない…などの場合にスプレッドシートまで落とし込めればGASでよしなに自動化できたりするので便利

あまりやりすぎると負債化しそうだが個人タスクの自動化レベルだったら十分活用できる

カンペ的なサンプルコード

function mailCsvToSpreadsheet() {
  const message = getMail();
  const csvFile = message.getAttachments()[0];

  const driveFolderId = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';

  const tmpDir = DriveApp.getFolderById(driveFolderId);
  const tmpFile = DriveApp.createFile(csvFile).moveTo(tmpDir);

  csvToSpreadsheet(tmpFile);
}

function csvToSpreadsheet(csvFile) {
  const ss = SpreadsheetApp.openById('yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy');
  const sheet = ss.insertSheet();
  sheet.setName("newSheet");

  const data = csvFile.getBlob().getDataAsString('UTF-8');
  const csv = Utilities.parseCsv(data);

  sheet.getRange(2,1, csv.length, csv[0].length).setValues(csv);
}

function getMail() {
  const searchConfig = 'from:hoge@gmail.com has:attachment subject:"CSV送信します"';

  const threads = GmailApp.search(searchConfig);
  const messages = threads[0].getMessages();

  return messages[0];
}

サンプルだと

  • スレッドとメッセージは検索結果から1件目で決め打ち
  • 添付ファイルは1つ目決め打ち
  • GoogleDriveのフォルダID決め打ち
  • スプレッドシートのID決め打ち

なので実際に使う場合は状況に合わせて調整が必要

対象のメールを検索するクエリはこのページが参考になる

Gmail で使用できる検索演算子 - Gmail ヘルプ

support.google.com

CSVに限らずメール添付の中身を閲覧できるのは割と便利だと思うので覚えておく