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

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

ただいまの
回答率

91.01%

  • Google Apps Script

    575questions

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

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,090

idrgon

score 0

前提

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

処理データや現在のソースコードが分からないため参考程度ですが。
※改行コードを \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

  // 横に転置(61列 ⇒ 23列)
  // 改行コードで 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/21 15:27

    お疲れ様です。ご返信が遅くなりました、申し訳ございません。
    ご回答いただきありがとうございます!

    アドバイスに基づいた実行コードを質問内容のUpdateしています。(こちら実施した処理コードです)
    こちら色々カスタマイズしていますが思うような結果が出てきません。

    毎回送られてくるGmail本文をスクレイピングしてスプレッドシートにコピペするところまで
    実行していますがそこから空白削除、そしてデータ整理が実行できるようにしたいのですが、
    Gmail本文の内容が毎回変わるため、データ整理という点については以下で対処可能でしょうか。

    ​最後の所に、「sheet.getRange(i+1,1).setValue(mail_body_split[i]); 」があると思うのですが、
    上記の位置を指定する部分を操作すれば可能かなと思っていたのですが。。
    →2行目に出しければ、「(i+2,1)」にする

    もう少し情報が欲しいという点がありましたらご指摘ください。
    すみませんが、よろしくお願いいたします。

    キャンセル

  • 2017/09/21 16: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つ下になります。

    キャンセル

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

  • ただいまの回答率 91.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Google Apps Script

    575questions

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