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

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

ただいまの
回答率

88.10%

GASでのG-mailからスプレッドシート転記(0落ち問題)

解決済

回答 3

投稿

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

score 6

前提・実現したいこと

GAS初心者です。
問合せフォームからGmailに届いたデータをスプレッドシートに転記し、
対応状況の管理を行いたいと思っております。

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

転記は上手くいったのですが、電話番号及び携帯電話の「0」落ちが
起きてしまい、対応に困っています。
追記スタイルでかつ、0落ちも防ぐにはどのような記述をすればよいでしょうか・・・

該当のソースコード

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();

  var query = 'label:(00_hp問合せ-10-23資料dw)';
  var threads = GmailApp.search(query, 0, 30);
  var messages = GmailApp.getMessagesForThreads(threads);

  var valMsgs = [];

  for(var i=0; i < messages.length; i++) {
    for(var j=0; j < messages[i].length; j++) {
      var id = messages[i][j].getId();
      var date = messages[i][j].getDate();
      var from = messages[i][j].getFrom();
      var body = messages[i][j].getPlainBody();
      var lastRow = sheet.getLastRow() + 1;
      var range = sheet.getRange(lastRow, 1);

        sheet.appendRow([
        date,
        from,
        fetchData(body, '会社名:', '\r'),
        fetchData(body, 'お名前(姓):', '\r'),
        fetchData(body, 'お名前(名):', '\r'),
        fetchData(body, '電話番号:', '\r'),
        fetchData(body, 'メールアドレス:', '\r'),
        fetchData(body, '携帯電話:', '\r'),
        fetchData(body, '登録者:', '\r'),
        fetchData(body, '顧客主担当:', '\r'),
        fetchData(body, '担当エリア:', '\r'),
        fetchData(body, '資料:', '\r'),        
      ]);      
    }
  }
}

function fetchData(str, pre, suf) {
  var reg = new RegExp(pre + '.*?' + suf);
  var data = str.match(reg)[0]
    .replace(pre, '')
    .replace(suf, '');
  return data;  
}

試したこと

var lastRow = sheet.getLastRow() + 1;
var range = sheet.getRange(lastRow, 1);
range.setNumberFormat('@');
range.setValue(fetchData(body, '携帯電話:', '\r')); 

fetchData(body, '資料:', '\r'),        
]);
のすぐ後ろに付けて試したところ、0落ちはなくなったのですが、
次の行に追記されてしまいます。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+1

その「0落ち」ってのはなぜ起きるのかを考えてみましょう。
セルの設定を文字列にすればいいのでは

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/25 11:00

    早速のご回答ありがとうございます。
    スプレッドシートは予め全セル「書式なしテキスト」に設定しているのですが、
    GASを実行すると「自動」に切り替わります。
    GAS内で書式なしにすることができるのでしょうか?

    キャンセル

  • 2019/10/27 23:18

    clearFomat()とか?

    キャンセル

  • 2019/10/27 23:21

    あれ、コメントしたと思ったらされてないや。
    Excelなんかでは ’ を先頭に付けてれば文字列として解釈されるってのがあるけど、そこらへんはどうでしょう

    キャンセル

+1

文字列にすればよさそう。

sheet.appendRow([
  date,
  from,
  fetchData(body, '会社名:', '\r'),
  fetchData(body, 'お名前(姓):', '\r'),
  fetchData(body, 'お名前(名):', '\r'),
  "'" + fetchData(body, '電話番号:', '\r'),
  fetchData(body, 'メールアドレス:', '\r'),
  "'" + fetchData(body, '携帯電話:', '\r'),
  fetchData(body, '登録者:', '\r'),
  fetchData(body, '顧客主担当:', '\r'),
  fetchData(body, '担当エリア:', '\r'),
  fetchData(body, '資料:', '\r'),        
]);      

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

0

スプレッドシートは予め全セル「書式なしテキスト」に設定しているのですが、
GASを実行すると「自動」に切り替わります。
GAS内で書式なしにすることができるのでしょうか? 

おそらく、GASを実行すると自動になるのではなく、appendRowだとそうなる、だと思います。例えば、こういう事例が見つかりました。
GAS (Google Apps Script)で数値を文字としてsetValueする方法についてあれこれ模索した結果
マウス操作で考えると、appendRowは範囲を指定して右クリック→挿入みたいな動作なのだと推測します。

lastRowを得ているのですから(ここで得るのはどうかと思いますが)、Range.setValuesで書き込めば書式は維持されると想像します。

function myFunction() {
    const sheet = SpreadsheetApp.getActiveSheet();

    const query = 'label:(00_hp問合せ-10-23資料dw)';
    const threads = GmailApp.search(query, 0, 30);
    const messages = GmailApp.getMessagesForThreads(threads)
        .reduce(function(a,c){ return a.concat(c.map(messageToArray));},[]);
    sheet.getRange(sheet.getLastRow() + 1, 1, messages.length, 12).setValues(messages);
}

function messageToArray(m) {
    const body = m.getPlainBody();
    return [
        m.getDate(),
        m.getFrom(),
        fetchData(body, '会社名:', '\r'),
        fetchData(body, 'お名前(姓):', '\r'),
        fetchData(body, 'お名前(名):', '\r'),
        fetchData(body, '電話番号:', '\r'),
        fetchData(body, 'メールアドレス:', '\r'),
        fetchData(body, '携帯電話:', '\r'),
        fetchData(body, '登録者:', '\r'),
        fetchData(body, '顧客主担当:', '\r'),
        fetchData(body, '担当エリア:', '\r'),
        fetchData(body, '資料:', '\r'),
    ];
}

function fetchData(str, pre, suf) {
    const res = str.match(new RegExp(pre + '(.*?)' + suf));
    return res === null ? '' : res[1];
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/10/28 18:43

    ありがとうございます。
    mobile.setNumberFormat('@');
    mobile.setValue(fetchData(body, '携帯番号:', '\r'));
    phone.setNumberFormat('@');
    phone.setValue(fetchData(body, '電話番号:', '\r'));
    として解決しました。

    キャンセル

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

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

関連した質問

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