久々にスクリプト組んだのでメモ兼で残しときます。
マークダウン記法も久々
#やりたいこと
特定の送信者からの定形メールを過去に渡ってその日時を取得したいという監査的な仕事です。
メール1つ1つ開いて時間を転記するなんてやってられないのでGAS使って取得したかったです。
#コード全文
忘れないうちにコピペ
function getMailInfo(){
/*---------------------------
1. 検索情報の設定
---------------------------*/
// 検索範囲を設定
const configSheet =SpreadsheetApp.getActiveSpreadsheet().getSheetByName("条件設定");
const start = 0;
const max = 500; //検索数上限(デフォは500)
// 検索条件をセット
const mFrom = "from:" + configSheet.getRange(1,2).getValue(); // from検索
const mSubject = "subject:" + configSheet.getRange(2,2).getValue(); // 件名検索
const query = mSubject + " " + mFrom; // 検索条件をセット
/*---------------------------
2. 検索の実行
---------------------------*/
// 検索メソッドを実行しスレッドを配列へ
const threads = GmailApp.search(query,start,max);
// スレッドの配列をメッセージの配列へ変換
const messagesForThreads = GmailApp.getMessagesForThreads(threads);
const messageValues = [];
// 各メッセージから情報を取得、recordへpush していく
for(const messages of messagesForThreads){
const message = messages[0];
const record = [
message.getDate(),
message.getFrom(),
message.getSubject()
];
messageValues.push(record);
}
/*---------------------------
3. スプレッドシートに転記する
---------------------------*/
// 転記するシート情報を設定
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("取得結果");
const lastRow = sheet.getLastRow();
// 転記
sheet.getRange(lastRow+1,1,messageValues.length, messageValues[0].length).setValues(messageValues);
}
1.検索情報の設定
一度きりじゃなくて、似た内容でまた検索する可能性も考慮して、設定(fromと件名)シートと情報を記入するシートは分けました。
B1セルにfrom(送信元メールアドレス)
B2セルにSubject(件名)
を入れるような仕組み
Gmailは仕様上、一度にsearch
メソッドで取得出来るのは500件、一日で20,000件が上限らしい。
コードでは上限の500にしてるけど、そんなにヒットしないなら100とか200とかにしといたほうが良さそうです。
2.検索の実行
search
で取得してくるのは個別のメールではなくて、まずはスレッド(threads
)のようです。個別のメールはmessages
というものらしく、スレッドから取得してくる必要があるらしいです。
だからsearch
してからgetMessagesForThreads
してます。
あとはfor~of~
で1つ1つ取り出しては配列にまとめています。
3.スプレッドシートに転記する
あとは簡単。毎度おなじみでgetRange
してsetValues
していきます。
補足など
Javascriptはlet
、const
で学んだのでGoogleAppsScriptでも使えるのはなんだか嬉しいです!
アラートやエラー回避などなど全くなにもやってないので必要なときにまたやります。