前回のおさらい
前回はGmailAppクラスのsearchメソッドで検索して、該当のメールを取得するところまでやりました。
厳密に言うと、取得したのはメールではなくてスレッドオブジェクトの配列でございました。
Gmailを操作するときはGmailAppクラスをインスタンス化しました。
const gmail = GmailApp
インスタンス化してからsearchメソッドを使って検索しました。
const searchedMail = gmail.search('検索条件が入ります')
検索条件は下の3つでした。
- 送信者が 株式会社 インボイス送信元
- 件名が 【請求書】送付のご案内
- 未読
const searchedMail = gmail.search('from:株式会社 インボイス送信元 subject: 【請求書】送付のご案内 is:unread')
結果、スレッドオブジェクトの配列を軽やかにゲットしました。
ちなみにこのメールの本文はこのようになっています。

本文中と添付ファイルに請求書がありますね。
添付ファイルを取得する方法もありますが、いったん本文中の税抜請求額と税込請求額を取得する方向でいきましょう。
今回はゲットしたスレッドオブジェクトの配列からメッセージを読み出すところまでをしばきたいと思います。
スレッドオブジェクトの配列からメッセージオブジェクトを取得
searchメソッドで取得したスレッドオブジェクトの配列からメッセージオブジェクトを取得します。
スレッドオブジェクトにはgetMessagesなんていうメソッドがあります。これを使えば良さそうですね。
※クラスを具現化したものがオブジェクトなのでスレッドクラスとスレッドオブジェクトはほぼ一緒の概念です
ではやってみましょう。
const searchGmail = () => {
const gmail = GmailApp
const searchedMail = gmail.search('from:株式会社 インボイス送信元 subject: 【請求書】送付のご案内 is:unread')
const messages = searchedMail.getMessages()
console.log(messages)
}
結果は、、、

オーマイガッ、ジーザス!!!
TypeError(型がちげぇよ!ブラザー!)というエラーが起きてしまいましたね。
理由は、スレッドオブジェクトが持っているgetMessagesメソッドを配列に使ってしまったからです。
ここで誤って操作しようとしてしまったのはまごうかたなき配列。スレッドオブジェクトじゃなくてね。
スレッドオブジェクトをいじくり回すには、いったん配列から取り出さないといけないんです。
わからない人は下の記事を読んでください。
配列を操作するにはいくつかの方法がありますが、今回はmapメソッドを使います。
const searchGmail = () => {
const gmail = GmailApp
const searchedMail = gmail.search('from:株式会社 インボイス送信元 subject: 【請求書】送付のご案内 is:unread')
const messages = searchedMail.map(thread => {
return thread.getMessages()
})
console.log(messages)
}
実行結果は、

このようになります。
メッセージオブジェクトの配列がスレッドオブジェクトごとの配列に格納されたものを取得しました。

どういう状態ですか?それ食べれます?
そんな気持ちを解消するために状態の説明をします。
入れ子になった配列
結論から言いますと配列が入れ子になっています。配列の中に配列がある状態です。
[ [メッセージオブジェクト] ] という状態ですね。
外側の[ ]はスレッドオブジェクトの配列で、内側の[ ]がメッセージオブジェクトの配列となっており、内側の[ ]にメッセージオブジェクトが入っている状態です。
マトリョーシカをイメージされると良いかもしれません。
メッセージオブジェクトから本文を取り出す
メッセージオブジェクトを取り出す
まず、メッセージオブジェクトを取り出します。
const searchGmail = () => {
const gmail = GmailApp
const searchedMail = gmail.search('from:株式会社 インボイス送信元 subject: 【請求書】送付のご案内 is:unread')
const messages = searchedMail.map(thread => {
return thread.getMessages()
})
const message = messages[0][0]
console.log(message)
}
コードの const message = messages[0][0] で格納されたメッセージオブジェクトを取り出しています。
messages[0][0]は、外側の配列の1番目、内側の配列の1番目という意味です。
配列の順番は0から始まりますので「0=1番目」なんですね。
実行結果は、

メッセージオブジェクトのみがmessage変数に格納されました。
メッセージオブジェクトから本文を取り出す
メッセージオブジェクトから本文を取り出すときはgetPlainBodyメソッドを使います。
const searchGmail = () => {
const gmail = GmailApp
const searchedMail = gmail.search('from:株式会社 インボイス送信元 subject: 【請求書】送付のご案内 is:unread')
const messages = searchedMail.map(thread => {
return thread.getMessages()
})
const message = messages[0][0]
const messageBody = message.getPlainBody()
console.log(messageBody)
}
実行結果

おお、なんとなくうまくいっている気配がしますね。
ちなみに、やたらと使っているconstってなんすか?という人は下の記事を読んでみてください。
次回は本文から税抜請求額と税込請求額を取り出します。
アディオスアミーゴ
