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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Gmail

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

Google Apps Script

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

Q&A

解決済

1回答

3041閲覧

GASでのGmailラベルの指定方法

keisuzuki

総合スコア1

Gmail

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

Google Apps Script

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

0グッド

0クリップ

投稿2022/11/03 08:57

編集2022/11/03 18:50

前提

GASでGmailからシートにデータを書き込みたいのですが、シートへの書き込みまでは出来ましたがGASのラベルごとの取り込み指定がうまくできません

ご存知の方いらっしゃいましたらお教えいただければと思います。

先ず、Gmailでのラベルの階層、検索で取得したいラベルは階層的になっており、

イメージ説明

という感じになっています

実現したいこと

  • GASでラベルを取得して、ラベルごとにスプレッドシートの各タブに未読メールを記載し既読にする
  • ラベルの数は結構多い(分けたいサブラベルは6つで親ラベルは08_ZOOM相談予約)

以下のリストはサブラベル
・01_無料予約
・02_卒業予約
・03_fp有料相談予約 ←ここからさらにサブラベルが追加
|-・01_三原
|-・02_三原:老後のお金
|-・03_柴田
|-・04_田島
|-・05_渡辺
という感じでラベルはついている

  • Gmailの自動振り分けは済みで、各予約ラベルに入るようになっています
  • 画像の赤枠のメールだけを取得したい

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

GASでラベル指定、完全一致など試したが、他のメールもシートに記載されてしまうので必要なメールのみ記載がしたい

調べて、Gmailの検索窓で、ラベルが、「08_zoom相談予約」の中のサブラベルが「01_無料予約」の場合、
・label:08_zoom相談予約-01_無料予約
とGmail検索窓と同じ様にGASに書けばいいと書いてあったので記述していますが、実行してみるとメール取得はするのですが対象のメール以外も取得してしまいます

添付画像のラベルの「08_zoom相談予約-02_卒業予約」
も一緒に取得して、書き出してしまいます

該当のソースコード

function savedata() { //シート const ss_id = "●●"; //スプレッドシートのIDを指定 const sh_name = "無料相談"; //スプレッドシートのシート名を指定 const sh = SpreadsheetApp.openById(ss_id).getSheetByName(sh_name); //ID、シート名を変数で指定 // 検索条件に該当する未読スレッド一覧を取得 const query = 'is:unread label:08_zoom相談予約-01_無料予約' ←ここが指定できない const threads = GmailApp.search(query, 0, 30); // // スレッドを一つずつ取り出す threads.forEach(function(thread) { // スレッド内のメール一覧を取得 const messages = thread.getMessages(); // メールを一つずつ取り出す messages.forEach(function(message) { // メールIDを取得 const MessagId = message.getId(); // 受信日時 const strDate = message.getDate(); // メール本文を取得 const plainBody = message.getPlainBody(); // フォーム部分を取り出す const fname = new RegExp('フォーム名:' + '.*?' + '\r'); const formname = plainBody.match(fname)[0].replace('フォーム名:', '').replace('\r', ''); console.log( formname ); // 予約日時部分を取り出す const zmday = new RegExp('日時:' + '.*?' + '\r'); const zmdate = plainBody.match(zmday)[0].replace('日時:', '').replace('\r', ''); console.log( zmdate ); // 名前部分を取り出す const nam = new RegExp('名前:' + '.*?' + '\r'); const username = plainBody.match(nam)[0].replace('名前:', '').replace('\r', ''); console.log( username ); // ふりかな部分を取り出す const firikana = new RegExp('フリガナ:' + '.*?' + '\r'); const kana = plainBody.match(firikana)[0].replace('フリガナ:', '').replace('\r', ''); console.log( kana ); // メールアドレス部分を取り出す const usermail = new RegExp('メールアドレス:' + '.*?' + '\r'); const user_mail = plainBody.match(usermail)[0].replace('メールアドレス:', '').replace('\r', ''); console.log( user_mail ); // 電話番号部分を取り出す const usertel = new RegExp('電話番号:' + '.*?' + '\r'); const user_tel = plainBody.match(usertel)[0].replace('電話番号:', '').replace('\r', ''); console.log( user_tel ); //シートへ書き込み sh.appendRow([strDate, formname, zmdate, username, kana, user_mail, user_tel, plainBody, MessagId ]); }); }); }

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

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

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

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

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

YAmaGNZ

2022/11/03 09:30

label:08_zoom相談予約-01_無料予約 とは書かずに "label:08_zoom相談予約-01_無料予約" と書かれています
keisuzuki

2022/11/03 10:51 編集

早速のコメントありがとうご座います const query = 'label:08_zoom相談予約-01_無料予約'; と書き直して実行しても結果は同じでした 何故か卒業予約も取ってしまいます
macaron_xxx

2022/11/03 23:42

同一スレッドの中に「01_無料予約」と「02_卒業予約」が存在することはありませんか?
keisuzuki

2022/11/04 03:54

同一スレッドというのはもしかして親ラベルの「label:08_zoom相談予約」のことでしょうか? 一応Gmail上で「label:08_zoom相談予約」で検索かけても出てこなかったので同一スレッドではないと思っていたのですが私の認識違っていますでしょうか?
macaron_xxx

2022/11/04 03:57

いえ、Gmailにはスレッドの機能があります。 Gmailの設定より「スレッド表示」を切り替えることができます。 GmailAppの検索では、スレッド単位での検索になるので、labelで検索した際に、messageを辿っていくと、違うラベルのメッセージがあたります。
keisuzuki

2022/11/05 12:00

お返事遅くなりました、 スレッドの機能のこと、ありがとうございます。 スレッド表示しメール追っていきますと他のラベルも出てきました、、 目的を行う為、(各メールから各シートタブにデータ記入)取得時の他のラベルの除外が出来ないので他のやり方を考えてみます
guest

回答1

0

自己解決

一応自己解決しましたのでご報告

function myFunction(){ //文字列を検索条件に指定して抽出命令 let query = 'label:08_zoom相談予約-01_無料予約 is:unread'; let gmail = getGmail(query); //スプレッドシートに書き出し let ss_id = "1T0qpPMgSCFgBH9j4Ww-7lNGl0OAt_Sf6apNBANHJ22c"; //スプレッドシートのIDを指定 let sh_name = "文面削除テスト"; //スプレッドシートのシート名を指定 let sh = SpreadsheetApp.openById(ss_id).getSheetByName(sh_name); //ID、シート名を変数で指定 let lastRow = sh.getLastRow() +1; //既存データが入っている最終行番号 let row = gmail.length; //書き込みたいデータの行数 let col = gmail[0].length; //書き込みたいデータの列数 let range = sh.getRange(lastRow, 1, row, col); //書き込み範囲指定 range.setValues(gmail); } function getGmail(query){ let ss_id = "1T0qpPMgSCFgBH9j4Ww-7lNGl0OAt_Sf6apNBANHJ22c"; //スプレッドシートのIDを指定 let sh_name = "文面削除テスト"; //スプレッドシートのシート名を指定 let sh = SpreadsheetApp.openById(ss_id).getSheetByName(sh_name); //ID、シート名を変数で指定 let values = sh.getDataRange().getValues(); //無料相談シートすべてのデータを取得する values.shift(); //1行目の見出しを除外する let messagid_list = values.map(x => x[8]); //無料相談タブシートI列のメッセージIDのみ取得する //新着メール情報を格納する配列を宣言 let array = []; //Gmailの履歴からマッチするメールをスレッド化、最新のメールから30通取得 let threads = GmailApp.search(query,0,30); //一覧化したメールの件数分繰り返し threads.forEach(function(thread) { // スレッド内のメール一覧を取得 let messages = thread.getMessages(); // メールを一つずつ取り出す messages.forEach(function(message) { // メール本文の取得 let plainBody = message.getPlainBody(); // 正規表現で取得したい箇所を取得 //メール受信日、メッセージIDの取得 let strDate = Utilities.formatDate(message.getDate(), "JST", "yyyy/MM/dd HH:mm:ss"); let messagid = message.getId(); //フォーム名取得 let fname = new RegExp('フォーム名:' + '.*?' + '\r'); let formname = plainBody.match(fname)[0].replace('フォーム名:', '').replace('\r', ''); let zmcorse = formname.includes("無料相談予約フォーム(k2g4j)"); //ここでフォーム名で絞り込む //本文に特定のフォーム名があれば全データ取得 if ( zmcorse == true ){ let zmday = new RegExp('日時:' + '.*?' + '\r'); let zmdate = plainBody.match(zmday)[0].replace('日時:', '').replace('\r', ''); let nam = new RegExp('名前:' + '.*?' + '\r'); let username = plainBody.match(nam)[0].replace('名前:', '').replace('\r', ''); let firikana = new RegExp('フリガナ:' + '.*?' + '\r'); let kana = plainBody.match(firikana)[0].replace('フリガナ:', '').replace('\r', ''); let usermail = new RegExp('メールアドレス:' + '.*?' + '\r'); let user_mail = plainBody.match(usermail)[0].replace('メールアドレス:', '').replace('\r', ''); let usertel = new RegExp('電話番号:' + '.*?' + '\r'); let user_tel = plainBody.match(usertel)[0].replace('電話番号:', '').replace('\r', ''); let honbun = message.getPlainBody(); let contactinfo = honbun.split('-')[1].split('以上の内容で予約を受け付けました。') [0]; // IDの重複チェック if (messagid_list.includes(messagid)) { console.log("【スキップ】: 既に " + messagid + " は存在します。"); return; } //配列に落としこみ array.push([ strDate, formname, zmdate, username, kana, user_mail, user_tel, contactinfo, messagid ]); } }); }); return array; }

としてメール本文からgmailのスレッド内でラベルが違うのも取得してしまうが、絞り込んでシートに書き出すことが出来ました,
コメント頂いた皆様ありがとうございました

投稿2022/11/08 16:16

keisuzuki

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問