GASでGmailを取り扱う方法の説明、第2回です。
前回は受信したメールを検索する側を検索してログ表示するところまでやってきました。前回の記事は以下をご参照ください。
ログ表示できれば、もちろんスプレッドシートに書き込むことも可能です。今回はこのスプレッドシートに書き込む方法を紹介していきます。
おさらい:Gmailを検索して取得するスクリプト
さて、今回は前回使った検索スクリプトを改変していきますので、まずは前回のスクリプトを再掲しておきます。
function search_email() {
//①検索する条件を作成
const start = 0;
const max = 10;
const query = "after:2020/05/21 before:2020/05/26"
var threads = GmailApp.search(query, start, max)
//②該当するメッセージ(GmailMessage)のリストを取得する(今回は単一スレッド検索)
var messageForThds = GmailApp.getMessagesForThreads(threads)
//③メッセージリストからメッセージを取得する(2次元配列->1次元配列に変更)
for(var message of messageForThds){
//④1次元のメッセージ配列から1つ目の要素を取得
let message_data = message[0];
//⑤メッセージから内容を取得する(今回は題名とメッセージIDを取得する)
Logger.log(message_data.getSubject());
Logger.log("messageId:", message_data.getId());
}
}⑤でメッセージリストからメッセージを取得している部分さえ変更すれば必要データが取得できそうですね。
検索で取得したGmail情報をスプレッドシートに書き出す方法
参考スクリプト
まずは何より、実際に書き出すためのスクリプトを紹介します。色々リファクタリングすべきスクリプトですが、基本前回のスクリプトに付け加えていく形をとっているので、ご容赦ください。
追加や、変更部分は黄色くハイライトしてあります。スプレッドシートに書き出すための必要な変数や、メッセージの実際データを取得して配列に入れているあたりが変化点です。
function search_email_and_write() {
//追加A.スプレッドシートの指定と書き出しデータを保持するためのlist作成
const targetSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("test");
let output = []
//①検索する条件を作成
const start = 0;
const max = 10;
const query = "after:2020/05/21 before:2020/05/26"
var threads = GmailApp.search(query, start, max)
//②該当するスレッドのリストを取得する(今回は単一スレッド検索)
var messageForThds = GmailApp.getMessagesForThreads(threads)
//③メッセージリストからメッセージを取得する(2次元配列->1次元配列に変更)
for(var message of messageForThds){
//④1次元のメッセージ配列から1つ目の要素を取得
let message_data = message[0];
//変更⑤メッセージから内容を取得する(今回は日付・送信者・題名・メッセージIDを取得する)
var msg_date = message_data.getDate();
var msg_from = message_data.getFrom();
var msg_subject = message_data.getSubject();
var msg_body = message_data.getPlainBody().slice(0,100)
//追加:⑤で取得したデータを一旦list貸して、書き出しデータを作成するようのoutput変数(list)に追加する
let record = [msg_date, msg_from, msg_subject, msg_body]
output.push(record)
}
//追加:対象シートに書き込む(1行目はカラムのデータ、2行目以降に実際のメールデータ)->1回目だけのみカラム欄を入力するようする方が、本来はいいです。
var columns = [["date","from","subject","body"]];//->変数として本来は頭の方に記載した方がいいですね。
targetSheet.getRange(1,1,columns.length, columns[0].length).setValues(columns);
var lastRow = targetSheet.getLastRow();//->カラムを入力後に最終行を取得するためここに記載(本来はもっといいやり方もありますが。。)
targetSheet.getRange(lastRow + 1,1, output.length, output[0].length).setValues(output)
}メッセージから詳細データを取得する方法
今回は変更⑤メッセージから内容を取得する時に使うメソッド群を紹介します。今回例題で使っている、題名や送付元みたいな情報を取得するために利用するメソッドです。
| メソッド | 取得できる情報 | response type |
| getAttachments() | 対象メッセージに添付された添付ファイルの一式を取得 | |
| getBcc() | 対象メッセージのBcc受信者 | 文字列 |
| getBody() | 対象メッセージのHTML contentを取得 | 文字列 |
| getCc() | 対象メッセージのcc受信者 | 文字列 |
| getDate() | 対象メッセージの日付 | 日付 |
| getFrom() | 対象メッセージの送信元 | 文字列 |
| getHeader(name) | 対象メッセージのヘッダー内容 | 文字列 |
| getId() | 対象メッセージのID | 文字列 |
| getPlainBody() | 対象メッセージのプレーンテキスト | 文字列 |
| getRawContent() | 対象メッセージのraw content | 文字列 |
| getReplyTo() | 対象メッセージの返信先(一般的に送信者) | 文字列 |
| getSubject() | 対象メッセージの題名 | 文字列 |
| getTo() | 対象メッセージの受信者一覧 | 文字列 |
getXX()というメソッドで、XX部分に欲しい情報を入力すれば取得できます。このメソッドの作り方は、スプレッドシートとかと同様で統一されていてわかりやすいですよね。
よく使うものや日頃使わなくて、よくわからない要素もあるかもしれませんが、上のサンプルで挙げた4つとattachmentが一般的にはよく利用されているかと思います。attachment(添付ファイル)は、返されるのがGmailAttchmentクラスなので、その後さらに処理が必要ですね。
まとめ
さて、今回は検索で取得したメールをスプレッドシートに書き出していきました。書き出ししたいデータの指定方法の説明がメインですかね。
次回は検索クエリでよく使う検索演算子とかの説明をしていきたいなと思います。
第1回:概要・基本的な検索による取得方法・カテゴリ別の取得
第2回(今回):取得したメールをスプレッドシートに書き込む
第3回:検索クエリでよく使う検索演算子と正規表現
第4回:スレッドフィルターではなくメール単位のフィルターの作り方
第5回:messageID(unique ID)を使って新規メールだけシートに追加していく方法


