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

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

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

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

Google Apps Script

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

Q&A

解決済

1回答

1309閲覧

【GAS】Gmailの本文で、指定文字列〜指定文字列の間を抜き出す時、目に見えない不要な改行が入ってしまう(スプレッドシート転記)

cardamon

総合スコア19

Google スプレッドシート

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

Google Apps Script

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

0グッド

0クリップ

投稿2022/12/03 07:35

前提

Gmailをスプレッドシートに自動転記するスクリプトを作っています。

実現したいこと

メール本文の、指定文字〜指定文字の間を抜き出したいです。

発生している問題

文字列の間は抜き出すと、なぜか、目に見えない?改行が残ってしまいます。
イメージ説明

試したこと

htmlメールなのが問題かと考えたのですが、システム上、プレーンテキストで受け取ることができず手詰まりとなっています。

また、以下のコードを試しました。

該当のソースコード

GoogleAppsScript

1const testMessage = () => { 2 const condition = 'subject:(おしらせ) -label:(おしらせ転記済)'; 3 4 const start = 0; const max = 500; 5 const threads = GmailApp.search(condition, start, max); 6 const messages = GmailApp.getMessagesForThreads(threads); 7 const label = GmailApp.getUserLabelByName('おしらせ転記済') ?? GmailApp.createLabel('おしらせ転記済'); 8 9 10 //もし転記済ラベルのない該当メールがなければ戻る 11 if (messages.length === 0) { 12 console.log('検索条件に合致するメールが見つかりませんでした。'); 13 return; 14} 15 16 const data = messages.map(message => { 17 const body = message[0].getPlainBody(); 18 19 const date = message[0].getDate(); 20 21 //メール件名から"[formrun] 「🚨おしらせ🚨」(管理用フォーム名)にフォーム投稿/回答がありました ["という文字列を削除 22 const subject = message[0].getSubject().replace('[formrun] 「🚨おしらせ🚨」(管理用フォーム名)にフォーム投稿/回答がありました [', ''); 23 24 //(複数選択可)を探す(改行を含まず、"(複数選択可)"〜改行手前まで) 25 const goukei = body.split('(複数選択可)')[1].split('ログイン')[0]; 26 27 /*: ↑replaceは指定文字列の置換(削除) 28     \t=タブ文字削除、\n=改行削除、\s=空白、g=2個目以降もの意 29   trim=前後の空白・改行を削除 */ 30 31 // 場所、日付、時間を探す(改行の手前まで) 32 33 const datum = [date, subject, goukei]; 34 return datum; 35 }); 36 const ss = SpreadsheetApp.getActiveSpreadsheet(); 37 const sheet = ss.getSheetByName(‘おしらせ転記'); 38 39 // 記入可能な行(最終行の次の行) 40 const lastRow = sheet.getLastRow() + 1; 41 42 // 最終行の次の行を、A列から、入力 43 sheet.getRange(lastRow, 1, messages.length, data[0].length).setValues(data); 44 45 // 転記済ラベルをつける 46  threads.forEach(thread => thread.addLabel(label)); 47 48 delTrigger(); 49 setTrigger(); 50} 51 52function setTrigger() { 53 const time = new Date(); 54 const regWeekDay = /[1-7]/; //月曜~日曜を判定するための正規表現 55 const regWorkHours = /^(1[0-7]|[5-9])$/; //9~17の数字範囲を判定する正規表現 56 57 //★日時かえたら、↑プルダウンsetTriggerを選び実行を忘れず押す★ 58 59//実行した時間が9~17時 かつ 実行した日が月曜~日曜 ならば 60 if (regWorkHours.test(time.getHours()) && regWeekDay.test(time.getDay())) { 61 //次の時間 (hour) の 00分で testMessage を実行する時間指定タイマーをセット 62 time.setHours(time.getHours() + 1); //次の00分にしたい時は+1、でなければ;0 63 time.setMinutes(03); 64 ScriptApp.newTrigger('testMessage').timeBased().at(time).create(); 65 } 66} 67 68function delTrigger() { 69 70 const triggers = ScriptApp.getProjectTriggers(); 71 for (const trigger of triggers) { 72 if (trigger.getHandlerFunction() == "testMessage") { 73 ScriptApp.deleteTrigger(trigger); 74 } 75 } 76 77} 78

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

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

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

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

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

guest

回答1

0

ベストアンサー

.trim()で不要なスペースか改行を削除することができます。

例)

javascript

1const msg = ` 2 3 ダミーテキスト 4 5 6`; 7 8console.log(msg); 9console.log(msg.trim());

修正箇所

javascript

1const goukei = body.split('(複数選択可)')[1].split('ログイン')[0].trim();

コメントでご自身でもメモされているのでもう試されて、それで無理だったのでしょうか?
質問者様のコメント↓

/*: ↑replaceは指定文字列の置換(削除)     \t=タブ文字削除、\n=改行削除、\s=空白、g=2個目以降もの意   trim=前後の空白・改行を削除 */

投稿2022/12/03 14:28

Cocode

総合スコア2314

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

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

cardamon

2022/12/04 00:42

ありがとうございます。頂いたコードで無事うごきました! trimは、結論試せていませんでした。 実は、示していただいたコメントは、昔に本で読んだものをコピペして色んなスクリプトにメモがわりに貼っており、すっかり風景化しており見落としていました。(メモの意味がないですね…お恥ずかしい…) こんな矛盾するようなコードにも関わらず、的確なアドバイスと質問を投げかけていただき、ありがとうございます…!(この恥ずかしさで、もうtrimだけは一生忘れないと思います。。)
cardamon

2022/12/04 00:45

↑回答へのコメントをしようとすると、 >アプリケーション エラー: クライアント側の例外が発生しました (詳細については、ブラウザー コンソールを参照してください) 。 というエラーが出て、文章の語順が、ぐちゃぐちゃになり、日本語がおかしくなってしまいます…
cardamon

2022/12/04 00:53

(文章がぐちゃぐちゃになったり、正常に表示されたりするのは、teratail不具合のようです) ご回答ありがとうございます!
Cocode

2022/12/04 15:21

.trim()マスターおめでとうございます!💮
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問