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

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

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

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

Gmail

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

Google Apps Script

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

Q&A

解決済

2回答

1118閲覧

GASで空白文字の削除ができない

rgw

総合スコア1

Google スプレッドシート

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

Gmail

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

Google Apps Script

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

0グッド

1クリップ

投稿2023/03/13 00:44

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • Gmailの本文内にある、たとえば「Deadline: March 9, 3pm」という文字から、"March"など月の言葉のみ抜き出すようにする。

前提

GASとGmail、Google スプレッドシートを組み合わせて、納期表をつくろうとしています。
その過程で、.replaceを使って"March"の後にある空白文字を取り除こうとしているのですが、うまくいきません。
なお私は、GASを2年ほど使用していますが、コードに関しては素人で自学自習で覚えたので、コードの書き方について美しくないところなどあるとおもいます。その点についてはご容赦ください。

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

下のコードを実行すると、文字が一文字も抜き出せません。

該当のソースコード

GAS

1function Order () { 2 let threads = GmailApp.search('in:inbox from:★差出人★ subject: [Dispatch] -label:★ラベル名★'); 3 4 threads.forEach(function(thread) { 5 let messages = thread.getMessages(); 6 7let message = messages[0]; 8let plainBody = message.getPlainBody(); 9 10let today = new Date(); 11let year = today.getFullYear(); 12 13let monthEng = plainBody.match(/Deadline: [A-Za-z]{3,9} /)[0].replace("Deadline: ","").replace(" ","");

試したこと

最後のコードを
let monthEng = plainBody.match(/Deadline: [A-Za-z]{3,9} /)[0].replace("Deadline: ","");
に変えると、"March "のように空白文字が最後に残った形で抜き出せます。

最後のコードを
let monthEng = plainBody.match(/Deadline: [A-Za-z]{3,9} /)[0].replace(/\s+/g, "").replace("Deadline:","");
に変えると、文字は一文字も抜き出せません。

最後のコードを
let monthEng = plainBody.match(/Deadline: [A-Za-z]{3,9} /)[0].replace(/\s+/g, "").replace("Deadline","");
に変えると、"March:" と抜き出すことができて空白文字を取ることができますが、今度は":"が残ってしまいます。

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

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

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

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

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

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

Daregada

2023/03/13 01:43 編集

> "March:" と抜き出すことができて 設問からすると、抜き出されるのは ":March" なのでは?
Daregada

2023/03/13 01:53 編集

plainBodyに直接文字列を設定して、たとえば、 let plainBody = "適当な文字列その1 Deadline: March 9, 3pm 適当な文字列その2"; とした直後に「最後のコード」を実行すると、提示されている1つめと2つめのコードで想定通りに「March」が抜き出せ、3つめのコードでは「:March」が抜き出せます。 実際に得られているplainBodyの内容を先に確認すべきでは?
guest

回答2

0

ベストアンサー

function Order () { let threads = GmailApp.search('in:inbox from:★差出人★ subject: [Dispatch] -label:★ラベル名★'); threads.forEach(function(thread) { let messages = thread.getMessages(); let message = messages[0]; let plainBody = message.getPlainBody(); let today = new Date(); let year = today.getFullYear(); let monthEng = plainBody.match(/Deadline: ([A-Za-z]{3,9}) /)[1]; let monthNum = new Date(Date.parse(monthEng +" 1, "+year)).getMonth() + 1; let sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("シート名"); let lastRow = sheet.getLastRow(); let range = sheet.getRange(lastRow+1,1,1,4); range.setValues([[year, monthNum, "", ""]]); }); }

投稿2023/03/13 03:12

編集2023/03/13 03:13
NCsn

総合スコア15

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

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

rgw

2023/03/14 08:31

ありがとうございます! let monthNum = new Date(Date.parse(monthEng +" 1, "+year)).getMonth() + 1; の部分が大変参考になり、おかげさまで求める数字を抜き出すことができました。 let monthEng = plainBody.match(/Deadline: ([A-Za-z]{3,9}) /)[1]; の代わりにもともと使っていた let monthEng = plainBody.match(/Deadline: [A-Za-z]{3,9} /)[0].replace(/\s+/g, "").replace("Deadline",""); を入れ、そのあと let monthNum = new Date(Date.parse(monthEng +" 1, "+year)).getMonth() + 1; を入れたところ、数字を抜き出せました。 私はもともと、 if (monthEng == "Jan") { month = "01" }else if (monthEng == "January"){ month = "01" }else if (monthEng == "Feb"){ month = "02" }else if (monthEng == "February"){ month = "02" }else if (monthEng == "Mar"){ month = "03" }else if (monthEng == "March"){ month = "03" }else if (monthEng == "Apr"){ month = "04" }else if (monthEng == "April"){ という形で分岐を入れていたのですが、一行でMarch→3というように変換できるのですね! 非常に助かりました。ありがとうございます。
guest

0

現在の質問文のコードで上手くいくように見えます。

敢えて変更するなら、正規表現のキャプチャを使えばいいぐらいでしょうか。

js

1let monthEng = plainBody.match(/Deadline: ([A-Za-z]{3,9}) /)[1];

投稿2023/03/13 00:50

int32_t

総合スコア21207

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

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

rgw

2023/03/14 08:26

時間を割いてご回答いただき、ありがとうございました。 提示いただいたコードを入れてGASを実行してみたのですが、残念ながら文字を抜き出せませんでした(なにも抜き出せず実行修了となりました)。ですが、[1]を入れるという方法を知らなかったので、勉強になりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問