質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

6239閲覧

【GAS】Gmailのスレッドにラベルを付けたい

shz4x4

総合スコア5

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2021/09/19 13:42

編集2021/09/19 13:52

前提・実現したいこと

GAS(Google Apps Script)を使用して、Gmailをスプレッドシートへ転記したい。
重複して転記することを避けるため、転記したメールにはラベルを付け、
ラベルの付いていないメールのみをスプレッドシートへ転記したい。

発生している問題・エラーメッセージ

転記まではうまくいくのですが、転記済みのメールへのラベル付けがうまくいきません。

エラー
TypeError: messagesForThreads.addLabel is not a function
myFunction @ コード.gs:24

該当のソースコード

function myFunction() { const query = 'in:inbox -label:転記済み'; const start = 0; const max = 10; const threads = GmailApp.search(query,start,max); const messagesForThreads = GmailApp.getMessagesForThreads(threads); for(const messages of messagesForThreads){ const message = messages[0]; const from = message.getFrom(); const date = message.getDate(); const plainbody = message.getPlainBody(); const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール転記'); const lastrow = sheet.getLastRow() + 1; sheet.getRange(lastrow,1).setValue(from); sheet.getRange(lastrow,2).setValue(date); sheet.getRange(lastrow,3).setValue(plainbody); const label = GmailApp.getUserLabelByName('転記済み'); messagesForThreads.addLabel(label); } }

試したこと

初学者のため、ネット上の情報を繋ぎ合わせてコードを作成しました。
スレッド内のすべてのメールを転記すると煩雑になるため、
スレッド内の最初のメールのみを転記したく、上記のコードを作成しました。

スプレッドシートへの転記までは希望通り動作しましたが、
スレッドへのラベル付けがうまくいきません。

ご教示ください。

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/09/19 13:48

「転記済みのメールへのラベル付けがうまくいきません。」とのことですが、具体的にどううまく行かないのでしょうか。 何かエラーが出ているのであれば、そのエラーメッセージを記載してください。
shz4x4

2021/09/19 13:52

ありがとうございます。 エラーメッセージを追記しました。
guest

回答1

0

ベストアンサー

getMessagesForThreads() の戻り値(messagesForThreads)は、GmailMessageオブジェクトの2次元配列になっています。
参照:getMessagesForThreads

一方、addLabel()は GmailThread オブジェクトからしか呼び出せません。
参照:Class GmailThread

元のコードでは、GmailMessageオブジェクトの配列 から addLabel()メソッドを呼ぼうとしたため、エラーになっています。

したがって、message.getThread() によって スレッド(GMailThread オブジェクト)を取得し、
その addLabel() メソッドを呼ぶようにします。

diff

1- messagesForThreads.addLabel(label); 2+ message.getThread().addLabel(label);

また、labelはループごとに取得する必要はなく、最初の1回取得すればよいです。
「転記済み」というラベルが存在ないのにラベルを付けようとするとエラーになるため、下記ではラベルが存在しない場合生成するようにしています。
(存在する場合は||の右側のGmailApp.createLabel~は実行されません)

const label = GmailApp.getUserLabelByName('転記済み') || GmailApp.createLabel('転記済み');

まとめると全体は下記のようになります(行頭+は追加、-は削除)

diff

1function myFunction() { 2 3 const query = 'in:inbox -label:転記済み'; 4 const start = 0; 5 const max = 10; 6 7 const threads = GmailApp.search(query,start,max); 8 const messagesForThreads = GmailApp.getMessagesForThreads(threads); 9 10+ // ラベルはループ前に一回取得すればよい。「転記済み」ラベルがない場合は作る。 11+ const label = GmailApp.getUserLabelByName('転記済み') || GmailApp.createLabel('転記済み'); 12 for(const messages of messagesForThreads){ 13 const message = messages[0]; 14 const from = message.getFrom(); 15 const date = message.getDate(); 16 const plainbody = message.getPlainBody(); 17 18 const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール転記'); 19 const lastrow = sheet.getLastRow() + 1; 20 21 sheet.getRange(lastrow,1).setValue(from); 22 sheet.getRange(lastrow,2).setValue(date); 23 sheet.getRange(lastrow,3).setValue(plainbody); 24 25- const label = GmailApp.getUserLabelByName('転記済み'); // ラベル付加処理はループ前に移動 26- messagesForThreads.addLabel(label); // 修正 27+ message.getThread().addLabel(label); 28 } 29 30}

投稿2021/09/19 14:42

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shz4x4

2021/09/19 14:48

配列からaddLabel()メソッドを呼ぼうとしたためエラーとなっていたのですね! 大変勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問