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

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

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

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

Gmail

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

Google Apps Script

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

Q&A

解決済

1回答

3149閲覧

【GAS】ラベルの付いていないメールを取得しスプレッドシートへ転記したい

shz4x4

総合スコア5

Google スプレッドシート

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

Gmail

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

Google Apps Script

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

0グッド

1クリップ

投稿2021/09/20 07:05

#前提・実現したいこと
GAS(Google Apps Script)を使用して、「転記済み」ラベルの付いていないメールを取得したのち、スプレッドシートへ転記したい。

<前提>
・重複して転記することを防ぐため、「転記済み」ラベルの付いていないメールのみを抽出する。
・スレッド内のすべてのメールを転記すると煩雑になるため、最初のメールのみ転記する。
・メールは本文に以下のような内容が記載されているものとする。

(メール本文)
お名前:山田太郎
住所:東京都千代田区

#発生している問題
10件メールをスプレッドシートへ転記した後、11件目からは転記されない。

具体的には以下の状況が発生しています。

受信ボックスにはラベルの付いていない11件のメールがあります。
以下コードを実行すると、
10件のメールを取得し、スプレッドシートへ転記します。
転記したメール10件には「転記済み」ラベルが付き、転記していない1件にはラベルが付いていない状態です。
再度、コードを実行すると、残り1件は転記されず、「転記済み」ラベルも付きません。

何が問題なのでしょうか。
ご教示いただけますと幸いです。

#該当のソースコード

GAS

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 const label = GmailApp.getUserLabelByName('転記済み') || GmailApp.createLabel('転記済み'); 11 12 const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール転記'); 13 14 const regName = new RegExp(/お名前:(.*)/); 15 const regAdress = new RegExp(/住所:(.*)/); 16 17 for (const messages of messagesForThreads) { 18 const message = messages[0]; 19 const from = message.getFrom(); 20 const date = message.getDate(); 21 const plainbody = message.getPlainBody(); 22 23 const Name = plainbody.match(regName); 24 const Adress = plainbody.match(regAdress); 25 26 // 名前・住所いずれかがマッチしない場合は、スキップする 27 if (Name == null || Adress == null) continue; 28 29 const lastrow = sheet.getLastRow() + 1; 30 sheet.getRange(lastrow,1).setValue(from); 31 sheet.getRange(lastrow,2).setValue(date); 32 sheet.getRange(lastrow,3).setValue(Name[1]); 33 sheet.getRange(lastrow,4).setValue(Adress[1]); 34 35 message.getThread().addLabel(label) 36 37 } 38}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/09/20 11:21

回答依頼をいただいて恐縮なのですが、こちらでは状況を再現できませんでした。 ・ラベルがついていない11通を受信箱に入れた状態で、 1回目実行で10件にラベルがつき 2回目実行で残った1件にもラベルが付きました。 転記ラベルがつかないメール1件には、本当に「お名前:○○、 住所:○○」のパターンが含まれているでしょうか? 念のためご確認願います。
shz4x4

2021/09/20 11:38

ありがとうございます。 確認したところ、「お名前:」の記載がなく、「住所:」のみ記載がありました。 大変失礼いたしました。 この場合、差出人や受信日時、「住所:」部分も転記されないのはなぜでしょうか。
退会済みユーザー

退会済みユーザー

2021/09/20 11:53 編集

コードでは、「お名前:」「住所:」両方の記載がある場合のみ、スプレッドシートに転記し、ラベルを付けるようになっています。 下記の場合は、スプレッドシートに転記されず、ラベルも付きません。 ・「お名前:」の記載がなく、「住所:」だけある。 ・「お名前:」の記載はあるが、「住所:」がない。 ・「お名前:」も「住所:」もない もし、「お名前:」と「住所:」どちらか一方に記載がある場合にも転記したいならば、 下記の部分を以下のように変えてください。 // 名前・住所いずれかがマッチしない場合は、スキップする   if (Name == null || Adress == null) continue;     ↓ これを // 名前・住所両方マッチしない場合は、スキップする if (Name == null && Adress == null) continue; に変えてください。(「||」を「&&」に変える)     あと、下の2行も次のように変えてください sheet.getRange(lastrow,3).setValue(Name[1]); sheet.getRange(lastrow,4).setValue(Adress[1]);     ↓ これを if (Name) sheet.getRange(lastrow,3).setValue(Name[1]); if (Adress) sheet.getRange(lastrow,4).setValue(Adress[1]); に変えてください。
shz4x4

2021/09/20 12:20

ご回答ありがとうございます。 解決いたしました。 何度もご丁寧にありがとうございました。
guest

回答1

0

ベストアンサー

const max = 10;
const threads = GmailApp.search(query,start,max);

10件しか取得していないからじゃないですか?

投稿2021/09/20 07:20

itagagaki

総合スコア8402

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

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

shz4x4

2021/09/20 07:27

ご回答ありがとうございます。 指摘いただいた箇所は、 「「転記済み」ラベルの付いていないメールを10件取得」 と認識しております。 1度コードを実行した後は、取得した10件はラベルが付くため、 2度目にコードを実行したときには、ラベルの付いていない1件のみを取得し、 スプレッドシートへ転記すると考えたのですが、、、
itagagaki

2021/09/20 07:49

失礼しました。 うーん、-label:転記済み が怪しいですかね。 in:inbox (has:nouserlabels OR label:-転記済み) だとどうでしょう。
shz4x4

2021/09/20 11:06

ありがとうございます。 回答いただいたコードに修正しましたが、うまく動いてくれません、、、
itagagaki

2021/09/20 11:41

そうですか…もしこの質問がまだ未解決で、私のほうで何かわかったら、また回答しますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問