Gmailのスレッドオブジェクト配列とは
GmailApp.searchメソッドでGmailのメールを検索して得られるのはスレッドオブジェクトの配列です。
GmailApp.searchメソッドの使い方と検索クエリについては過去記事を参照してください。
スレッドオブジェクトの配列をそのまま操作しようとしてもうまくいきません。
配列なので、いったん配列の中身であるスレッドオブジェクトを取り出してあげないといけないんですね。
動くコードと動かないコードを対比します。
動くコード
const searchGmail = () => {
const threads = GmailApp.search('from: Google')
const subjects = threads.map(thread => {
return thread.getFirstMessageSubject()
})
console.log(subjects)
}
このコードではスレッドオブジェクトの配列から、mapメソッドでスレッドオブジェクトを取り出しています。
さらに取り出したスレッドオブジェクトからgetFirstMessageSubject()メソッドで最初のメッセージの件名を取り出しています。
動かないコード
const searchGmail = () => {
const threads = GmailApp.search('from: Google')
const subjects = threads.getFirstMessageSubject()
console.log(subjects)
}
このコードではスレッドオブジェクトの配列に対して、getFirstMessageSubject()メソッドを適用しています。
これだとスレッドオブジェクトではなく、配列に対してgetFirstMessageSubject()を使っているため、エラーになってしまうんです。
getFirstMessageSubjectは配列のメソッドではないと怒られている図
エラーが起きる理由
エラーが起きる理由はデータ型に合わないメソッドを使ったからです。
つまり、「配列」というデータ型に対して、「スレッドオブジェクト」というデータ型に利用するgetFirstMessageSubjectメソッドを利用したからです。
あくまでGmailApp.searchで取得できるのはスレッドオブジェクトの「配列」なんですね。
スレッドオブジェクト配列の概念図
スレッドを操作するには配列からスレッドオブジェクトを取り出す必要があるってわけです。
では取り出す方法を説明します。
スレッドオブジェクトの配列からスレッドオブジェクトを取り出す方法
3つの方法をここでは紹介します。
方法1 mapメソッドを使う
const searchGmail = () => {
const threads = GmailApp.search('from: Google')
const subjects = threads.map(thread => {
return thread.getFirstMessageSubject()
})
console.log(subjects)
}
mapメソッドは配列に含まれている要素を一つずつ取り出して、新たな配列をつくるメソッドです。
スレッドオブジェクトからgetFirstMessageSubjectで最初のメッセージの件名を取り出しています。
下の例では1, 2, 3, 4, 5という配列をつくって、その配列に1を加えて新しい配列をつくっています。
const createNewArray = () => {
const array = [1, 2, 3, 4, 5]
const plusOneArray = array.map(int => {
return int + 1
})
console.log(plusOneArray)
}
// 出力結果は[ 2, 3, 4, 5, 6 ]
方法2 for文を使う
const searchGmail = () => {
const threads = GmailApp.search('from: Google')
const subjects = []
for (thread of threads) {
subjects.push(thread.getFirstMessageSubject())
}
console.log(subjects)
}
for文を使っても同じことができます。
まず、配列型のsubjects変数を作っておきます。
次にfor文の中でスレッドオブジェクトからgetFirstMessageSubjectで件名を取り出しています。
そして、配列型のsubjects変数に件名を格納しています。
同様に1, 2, 3, 4, 5という配列をつくって、その配列に1を加えて新しい配列をつくる例です。
const createNewArray = () => {
const array = [1, 2, 3, 4, 5]
const plusOneArray = []
for (int of array) {
plusOneArray.push(int + 1)
}
console.log(plusOneArray)
}
方法3 forEachメソッドを使う
const searchGmail = () => {
const threads = GmailApp.search('from: Google')
const subjects = []
threads.forEach(thread => {
subjects.push(thread.getFirstMessageSubject())
})
console.log(subjects)
}
forEachメソッドは配列に含まれている要素を一つずつ取り出して処理を行うメソッドです。
値を返さないのがmapメソッドとの違いです。
mapメソッド、for文と同様に1, 2, 3, 4, 5という配列をつくって、その配列に1を加えて新しい配列をつくる例です。
const createNewArray = () => {
const array = [1, 2, 3, 4, 5]
const plusOneArray = []
array.forEach(int => {
plusOneArray.push(int + 1)
})
console.log(plusOneArray)
}
スレッドオブジェクトの配列を扱うため3つの方法を紹介しましたが、用途によって適切な方法を選んでください。
新しい配列をつくる場合はmapメソッド
新しい配列をつくるかどうかにかかわらず処理をしたいときはfor文、forEachメソッド
チャオ