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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Google Apps Script

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

Q&A

1回答

12921閲覧

GASでスプレッドシートの改行を取り除く方法

idrgon

総合スコア6

Google Apps Script

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

0グッド

0クリップ

投稿2017/09/11 10:06

編集2017/09/21 06:13

###前提
GASでスプレッドシートの改行を取り除きたい
###<実行結果> ※改行コードを取り除く前
これまでGmail本文からテキストを抽出してシートに貼り付け

イメージ説明
###<実現したいこと>
①最初の表整理
・余分な改行コードを取り除く
・1つセルに格納された文字を抽出して、2つのセルに分別(A列:英文字,B列:数字)
②2つ目の表整理
・余分な改行コードを取り除く
・1列に転記されたものを横に転置する

イメージ説明

それぞれ完成イメージのように整理データで保存したいです。
①と②を実現できるGASコードについてアドバイスいただけますでしょうか。

よろしくお願いいたします。

###<実行コード②> 空白削除&データ整理(文字列と数字の分割)
下記にGmail本文&表のスクレイピング、そしてアドバイスに従い
空白削除および表整理の処理コードを追加しました。

function getMail() { /* メールを検索し本文を変数に保存 */ var threads = GmailApp.search('subject:Softbank Daily Results - SIM Box Detection'); // メールを検索し一覧を取得 var thread_top = threads[0]; // そのうちいちばん新しいメールを取得 //var mail_body = thread_top.getMessages()[0].getPlainBody(); // <br/>タグなしの本文を取得 ※本文のHTMLテキストが表示されず var mail_body = thread_top.getMessages()[0].getBody(); // 本文のテキストを取得 //var mail_body_split = mail_body.split(/\r\n|\r|\n/); // メールの本文を改行ごとに配列に格納 /* テキストに含まれているHTMLタグを除去する */ var str = mail_body; var str2 = str.replace(/<('[^']*'|'[^']*'|[^''>])*>/g,''); //()内の文字列を空欄に置き換え /* HTMLテキストの前置き箇所を除外 */ var str3 = str2.replace('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">',''); var str4 = str3.replace(/<!-- tell the browser to not use it's cache for this page -->/g ,""); var str5 = str4.replace(/body {font-weight:normal; font-size:14px; background-color:#cccccc; font-family:Arial, Helvetica, sans-serif; margin:0px;}/g ,''); var str6 = str5.replace(/table.contentwithborder {border:1px solid black;border-collapse:collapse;text-align:left;vertical-align:top;}/g, ''); var str7 = str6.replace(/td.grid {border:1px solid black;text-align:left;border-collapse:collapse;}/g,''); var str8 = str7.replace(/td.transposecolgrid {background-color:#f6f6f6;}/g, ''); var str9 = str8.replace(/SIGOS SBD REPORTING Report/g ,''); /* 表の件名のみ抽出 */ var str11 = str9.replace('<span style="color:#000080; line-height:150%; padding-left:5px"><strong></strong></span>', ''); /* 表フォーマットの除外 */ var str12 = str11.replace('<table style="font-size:-12px;font-weight: normal; font-style: normal;border:1px solid; border-collapse:collapse;">' ,''); /* Daily test overviewの表タグを除外 */ var str13 = str12.replace('<table style="border-collapse:collapse;font-size:12px;font-weight: normal; font-style: normal;text-align:right;background-color:#f6f6f6;">' ,''); var str14 = str13.replace('<tr style="background-color:#ffffff;color:#000000;font-size:12px;text-align:center;vertical-align:center;">', ''); var str15 = str14.replace('<th style="background-color:#ffffff;font-size:12px;border:1px solid; font-weight: normal; font-style: normal;"><p></th><th style="background-color:#ffffff;font-size:12px;border:1px solid; font-weight: normal; font-style: normal;writing-mode:tb-rl;filter:flipv fliph;"><p></th></p></tr>', ''); var str16 = str15.replace('<td style="border:1px solid; color:#000000;background-color:#ffffff;font-weight: normal; font-style: normal;text-align:left;vertical-align:center;font-size:12px;"></td><td style="border:1px solid; vertical-align:center;"></td></tr>', ''); /* 表項目のタグ置換え */ var str17 = str16.replace('<th style="font-size:-12px;font-weight: normal; font-style: normal;text-align:center;vertical-align:center;border:1px solid; border-collapse:collapse;"></th>', ''); /* 表データのタグ置換え */ var str18 = str17.replace('<td class = "grid" style="text-align:right;vertical-align:center;border:1px solid; border-collapse:collapse;"></th>', ''); Logger.log(str18.replace(' ','')); var mail_body_split = str18.split(/\r\n/); // メールの本文を改行ごとに配列に格納 /* シート名用にタイムスタンプを取得 */ var today = new Date(); // 現在のタイムスタンプを取得 var timestamp = today.getFullYear()+"/"+(today.getMonth()+1)+"/"+today.getDate(); // タイムスタンプを整形(YYYY/MM/DD) /* シートを追加(シート名はタイムスタンプ */ var objSpreadsheet = SpreadsheetApp.getActiveSpreadsheet(); objSpreadsheet.insertSheet(timestamp); /* シートの移動(上記で作成したシートに移動) */ var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spreadsheet.getSheetByName(timestamp); spreadsheet.setActiveSheet(sheet); /* セルにデータを追加(A1のセル) */ for(var i=0; i<mail_body_split.length; i++) { // 配列のデータの数(改行の行数)だけ繰り返す sheet.getRange(i+1,1).setValue(mail_body_split[i]); // 1行ごとに貼り付ける(貼り付けるセルを1行ずつ下にする) } /* 空行を削除 Bパターン */ var str19 = mail_body_split.replace(/\n+/g, "\n"); // 文字列と数字を分割 var str20 = str19; var numberIndex = str20.search(/\d/); var str21= str20.slice(0, numberIndex); // var str21= str20.slice(numberIndex); // 12345 }

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

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

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

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

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

guest

回答1

0

処理データや現在のソースコードが分からないため参考程度ですが。
※改行コードを \n ⇒ \r\n に修正

コード

function myFunction() { // 空行を削除 var str1 = "aaa\r\n\r\nbbb\r\n\r\n\r\nccc"; Logger.log("空行を削除"); Logger.log(str1); Logger.log(str1.replace(/(\r\n)+/g, "\r\n")); // 文字列と数字を分割 var str2 = "abcde12345"; var numberIndex = str2.search(/\d/); Logger.log("文字列と数字を分割"); Logger.log(str2); // abcde12345 Logger.log(str2.slice(0, numberIndex)); // abcde Logger.log(str2.slice(numberIndex)); // 12345 // 横に転置(6行1列 ⇒ 2行3列) // 改行コードで split した配列を range.setValues() の引数に変換するイメージ var values = [[1], [2], [3], [4], [5],[6]]; var newValues = []; for (var i = 0; i < values.length; i = i + 3) { var tmpValues = []; tmpValues.push(values[i][0]); tmpValues.push(values[i+1][0]); tmpValues.push(values[i+2][0]); newValues.push(tmpValues); } Logger.log("横に転置"); Logger.log(values); Logger.log(newValues); }

実行結果

[17-09-21 15:59:42:846 JST] 空行を削除 [17-09-21 15:59:42:847 JST] aaa bbb ccc [17-09-21 15:59:42:848 JST] aaa bbb ccc [17-09-21 15:59:42:848 JST] 文字列と数字を分割 [17-09-21 15:59:42:849 JST] abcde12345 [17-09-21 15:59:42:849 JST] abcde [17-09-21 15:59:42:850 JST] 12345 [17-09-21 15:59:42:850 JST] 横に転置 [17-09-21 15:59:42:851 JST] [[1.0], [2.0], [3.0], [4.0], [5.0], [6.0]] [17-09-21 15:59:42:851 JST] [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]

投稿2017/09/12 09:49

編集2017/09/21 07:01
rokuni

総合スコア174

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

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

idrgon

2017/09/21 06:27

お疲れ様です。ご返信が遅くなりました、申し訳ございません。 ご回答いただきありがとうございます! アドバイスに基づいた実行コードを質問内容のUpdateしています。(こちら実施した処理コードです) こちら色々カスタマイズしていますが思うような結果が出てきません。 毎回送られてくるGmail本文をスクレイピングしてスプレッドシートにコピペするところまで 実行していますがそこから空白削除、そしてデータ整理が実行できるようにしたいのですが、 Gmail本文の内容が毎回変わるため、データ整理という点については以下で対処可能でしょうか。 ​最後の所に、「sheet.getRange(i+1,1).setValue(mail_body_split[i]); 」があると思うのですが、 上記の位置を指定する部分を操作すれば可能かなと思っていたのですが。。 →2行目に出しければ、「(i+2,1)」にする もう少し情報が欲しいという点がありましたらご指摘ください。 すみませんが、よろしくお願いいたします。
rokuni

2017/09/21 07:15

空行を削除する処理は、改行コード(\r\n)で split する前でしてください。 (var mail_body_split = … の前) また、改行コードが \n ではなく \r\n とのことですので、私のサンプルコードを編集しています。 あと、 var str2 = str.replace ... という風に変数を定義されていますが、 str = str.replace ... という風に記述することもできます。 変数がたくさん定義されていると読み解くのが大変なので、必要がなければ同じ変数で処理するのが良いと思います。 > ​最後の所に、「sheet.getRange(i+1,1).setValue(mail_body_split[i]); 」があると思うのですが、 > 上記の位置を指定する部分を操作すれば可能かなと思っていたのですが。。 > →2行目に出しければ、「(i+2,1)」にする これは何についての確認でしょうか? なにが「可能」になる想定なのか分かりません。 ちなみに i+1 を i+2 に変更した場合、書き込み開始位置が現在より1つ下になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問