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

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

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

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

Gmail

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

Google Apps Script

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

Q&A

解決済

1回答

2974閲覧

GAS(Google Apps Script)にて日付指定してGmailをスプレッドシートに自動転記させたいです。

karasu124

総合スコア11

Google スプレッドシート

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

Gmail

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

Google Apps Script

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

1グッド

0クリップ

投稿2022/12/12 05:12

編集2022/12/15 03:01

前提

GAS(Google Apps Script)にて、Gmailより必要な本文情報をスプレッドシートに抽出して、自動転記できるようにしたいです。

実現したいこと

  • スプレッドシートのセルに入力している任意の日付以降のメールを抽出してくるように日付指定をしたいです。

試したこと

https://tetsuooo.net/gas/512/

こちらのURLサイトを参考に作成してみました。
毎度すべてのデータを拾ってきてしまうため、前回抽出してきたあと以降、もしくは日付指定ができたら、と考えております。

→// 抽出条件指定
let query = 'subject:"◎◎",after:2022/12/09';

と現在記入しておりますが、なにかほかに良い方法があればご教示いただきたく存じます。

◎2022/12/13追記

スプレッドシートセルF2にて日付を記載し、そこから定義できたらと思っているのですが、文字通り取得してきてからの抽出条件指定の部分、「after:」への紐づけがよくわからず困っております。
また、シートを定義した場合、「書き込むシートを取得、アクティブシートを取得しているが任意のシートでOK」の部分も同じくシート名を定義させた方が間違いないでしょうか?
アドバイスいただけましたらうれしく思います。何卒よろしくお願い申し上げます。

コード function getValue() { // スプレッドシート&シートオブジェクトを取得 const ss = SpreadsheetApp.getActiveSpreadsheet(); const sheet = ss.getSheetByName('抽出'); // F2セルを選択 var range = sheet.getRange('F2'); // セルの値を取得 var value = range.getDisplayValue(); } function myFunction(){ // 抽出条件指定 let query = 'subject:"お問い合わせ",after:"F2"'; //問合せごとの情報が要素になった二次元配列を取得 let gmail = getGmail(query); // 書き込むシートを取得、アクティブシートを取得しているが任意のシートでOK let sheet = SpreadsheetApp.getActive().getActiveSheet(); //要素ごとにappendRowメソッドを呼び出して最終行に書き込む繰り返し処理を実行 gmail.forEach(info => sheet.appendRow(info)); }

◎2022/12/15追記

いろいろとお教えいただき修正をさせていただいておりますがエラーが出てしまっているのかスプレッドシートに反映がされない状態です……。

イメージ説明

https://tetsuooo.net/gas/512/ のサイトさまのコードに、after:後、日付を手打ちで追加し、正常に拾ってくることが確認できているコードも記載させていただきます。↓

コード function myFunction(){ // 抽出条件指定 let query = 'subject:"お問い合わせ",after:2022/12/09'; //問合せごとの情報が要素になった二次元配列を取得 let gmail = getGmail(query); // 書き込むシートを取得、アクティブシートを取得しているが任意のシートでOK let sheet = SpreadsheetApp.getActive().getActiveSheet(); //要素ごとにappendRowメソッドを呼び出して最終行に書き込む繰り返し処理を実行 gmail.forEach(info => sheet.appendRow(info)); } function getGmail(query) { //Gmail取得ここから //Gmailの履歴からマッチするメールを一覧化 let threads = GmailApp.search(query); let gmailInfo = new Array(); //一覧化したメールの件数分繰り返し threads.forEach(function(thread) { // スレッド内のメール一覧を取得 let messages = thread.getMessages(); // メールを一つずつ取り出す messages.forEach(function(message) { // メール本文 let plainBody = message.getPlainBody(); // Logger.log(plainBody); // 受付日 let date = plainBody.match(/受付日:(.*)/); // Logger.log(data); // 代表者・ご担当者様氏名 let name = plainBody.match(/代表者・ご担当者様氏名:(.*)/); // Logger.log(name); // 事業形態 let mail = plainBody.match(/事業形態:(.*)/); // Logger.log(mail); // 電話番号 let tel = plainBody.match(/電話番号:(.*)/); // Logger.log(tel); //各メール情報を組みとした二次元配列として格納 gmailInfo.push([date[1],name[1],mail[1],tel[1]]); }); }); return(gmailInfo); }
Cocode🎉を押しています

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

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

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

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

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

YAmaGNZ

2022/12/12 06:29

>→// 抽出条件指定 >let query = 'subject:"◎◎",after:2022/12/09'; >と現在記入しておりますが そのように組んでいるけどその条件で抽出されないということですか? それともその日付部分を可変にする方法が分からないということですか?
karasu124

2022/12/12 06:38

YAmaGNZさま ご解答ありがとうございます。 先ほどいただきましたURLより修正をかけて試しているところです。 GASをいじれるアカウント以外でも使用予定なので、日付を手打ちすることなく 日付指定ができたらうれしいのですが、そんなことは可能でしょうか? 全くコードに詳しくないためどうしたものかと悩みつつ検索をかけております。 素人質問で申し訳ございません。
Cocode

2022/12/12 07:20

> 日付を手打ちすることなく、日付指定ができたらうれしいのですが、そんなことは可能でしょうか? |     | A列 | B列 | C列 | D列      | | 1行目 | 年▼ | 月▼ | 日▼ | [出力ボタン] | ↑こんな感じで、ドロップダウンリストから年月日を選ばせるのはどうでしょう? [出力ボタン]をクリックしたら、選択した年月日以降のデータを抽出して2行目以降に出力してくれるようにGASを組めば…
YAmaGNZ

2022/12/12 07:20

>GASをいじれるアカウント以外でも使用予定 その時、取得するメールのアカウントも変わるということですか? それともどのアカウントが実行してもメールアカウントは変更ないのですか? アカウントが変化した時、出力するスプレッドシートは同じなのですか?別なのですか? >日付を手打ちすることなく日付指定ができたら これは誰がどのようにして決定するのですか? 現状どのようなコードを作成されているのかは分かりませんが、仕様によってはできないことがある可能性もあります。
karasu124

2022/12/12 08:03

Cocodeさま ご回答ありがとうございます。 そのセルをGASに組み込めば確かに出力してくれそうですね! コードのコの字も知らないままGoogleで検索したまま微妙に 変えているだけなので難しそうですが少し調べてみたいと思います。 ありがとうございます。
karasu124

2022/12/12 08:11

YAmaGNZさま >その時、取得するメールのアカウントも変わるということですか? それともどのアカウントが実行してもメールアカウントは変更ないのですか? アカウントが変化した時、出力するスプレッドシートは同じなのですか?別なのですか? スプレッドシートは各アカウントで共有しており、 そのスプレッドシート1データのみに出力予定です。 メールアカウントは変わらず、Aというメインのアカウントで POP3経由で取得しておりますメールを抽出している状態です。 >日付を手打ちすることなく日付指定ができたら 日々お問い合わせがくるため、事務員が何日までか確認して、 その先を改めて抽出、データ入力をしたい状態です。 (例:2022/12/09まで確認→2022/12/10-12/12の分が 入力されていないため、12/09以降のデータを拾いたいと 事務員から要望がある→日付変更したいといった流れです) 手打ちでしたら変更→再取得自体はできたのでとりあえずは こちらでも大丈夫なのですが、事務員の負担なく修正が できたらと思い、ご質問させていただきました次第です。
YAmaGNZ

2022/12/12 13:50

事務員さんが取得される日を決定するのであればCocodeさんがおっしゃるようにシートに入力する欄を設けるのがよろしいかと思います。
Cocode

2022/12/12 14:04

最初にDate型で入力しておいたら、次回からはセルをダブルクリックしたらカレンダーがでてきて、カレンダーから選択できますね!Googleスプレッドシートすごい! データ入力規則でDateのみにしておいて、カレンダークリックさせるのが簡単かもです。。
karasu124

2022/12/13 07:07

YAmaGNZさま ご解答ありがとうございます。 各事務員全員が別の日付で検索がかけたいので可能ならスプレッドシート上で 変更できたら、と思っていたのでうれしいです。いろいろとお教えいただき ありがとうございました!
karasu124

2022/12/13 07:09

Cocodeさま カレンダー上での選択、とても便利でした。こちらで日付が選択できたらと思います。 GASへの組み込みはうまくいっていないのでまた追記してご質問させていただく可能性が 高いですが……こんな日付の選択ができることすら知らなかったので勉強になります、 ありがとうございます!
guest

回答1

0

ベストアンサー

文字通り取得してきてからの抽出条件指定の部分、「after:」への紐づけがよくわからず困っております。

検証していないので正常に動作するか分かりませんが、こんな感じはどうでしょう?

javascript

1function getValue_() { 2 const ss = SpreadsheetApp.getActiveSpreadsheet(); 3 const sheet = ss.getSheetByName('抽出'); 4 5 const range = sheet.getRange('F2'); 6 const value = range.getDisplayValue(); 7 8 return value; // F2の値を戻す 9} 10 11function myFunction() { 12 const val = getValue_(); // F2の値を取得 13 const query = `subject:"お問い合わせ",after:${val}`; // F2の値をafterにいれる 14 15 const gmail = getGmail(query); 16 const sheet = SpreadsheetApp.getActive().getActiveSheet(); 17 gmail.forEach(info => sheet.appendRow(info)); 18}

ちなみに、getValue_()のように関数名の末尾にアンダースコア(_)を記入すると、GASのスクリプトエディタの[実行▷]の関数一覧から除外されます。
外部から呼び出す必要のない関数はアンダースコアをつけておくと良いです。
一覧から無駄な関数が減ってスッキリもしますしね。

投稿2022/12/14 22:54

編集2022/12/14 22:59
Cocode

総合スコア2314

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

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

karasu124

2022/12/15 02:53

Cocodeさま ご回答、詳しいコードをありがとうございます! いただきましたコードを貼り付けてみたのですがスプレッドシートに反映されず…。 「const val = getValue_(); // F2の値を取得」部分の「val」がクレーアウトしており 豆電球マークで「Remobe unused declaration for: 'val'」と出ている状態で、 valをvalueにしようがdateにしようが豆電球マークは出続けてしまいます…。 あっちこっちで調べてたり質問したりしているところ、Cocodeさまのように「return value;」を getValueのところにつけつつ、「//抽出指定」の前に「//日付取得 const date = getValue();」を 入れてみてはどうかというアドバイスがあり(抽出条件はおのずと「let query = 'subject:"お問い合わせ",after: + date'」となりました。)、試したのですがこちらもできませんでした。 (「after:' + date」とアポストロフィ(')の外にdateを出したときにはconst dateのdateはグレーアウト せず、豆電球はでませんでした。) それとは別ですが、アンダースコア(_)を付けるとたしかに実行の部分に出てこずに混乱せずに済みました! ついでなのでこれを機に基礎を学ぼうかと参考書を買おうかと思っていましたのでとても今後役に立つと 思います。お教えいただきましてありがとうございます。
Cocode

2022/12/15 03:25 編集

スクショありがとうございますー!すごく助かりました。 私のコードちゃんとコピペできてないです!!笑 const query = `subject:"お問い合わせ",after:${val}`; ↑ここ、バックダッシュです。シングルクォテーションではありません。 テンプレートリテラルという記法です。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Template_literals
Cocode

2022/12/15 03:31

それから const query = `subject:"お問い合わせ",after:${val}`; の下に、 Logger.log(query); と追記したいただいて、実行した結果、コンソールにはなんと表示されますか?
karasu124

2022/12/15 05:43 編集

Cocodeさま ご回答ありがとうございます。 記号の違い、大変失礼いたしました。完全にわたしが見間違えておりました。 バックダッシュにして無事に……ようやく…セルから抽出して反映されるようになりました…!! もう手打ちでも…と思っていたのですが、ずっともやもやしていたのでとっってもうれしいです、 これで事務員の方々も日付を変更できます! 12月というお忙しい中本当にありがとうございます。感謝申し上げます。
karasu124

2022/12/15 05:45

毎度何もわからないわたしに記法や方法をURLなども込みでご教示いただきましてとても勉強になりました。 ようやくこれで業務が楽になります。この度は誠にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問