🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google スプレッドシート

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

Gmail

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

3033閲覧

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

aki-taka

総合スコア6

Google スプレッドシート

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

Gmail

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

Google Apps Script

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/10/25 01:51

前提・実現したいこと

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

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

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

該当のソースコード

GAS

1function myFunction() { 2 var sheet = SpreadsheetApp.getActiveSheet(); 3 4 var query = 'label:(00_hp問合せ-10-23資料dw)'; 5 var threads = GmailApp.search(query, 0, 30); 6 var messages = GmailApp.getMessagesForThreads(threads); 7 8 var valMsgs = []; 9 10 for(var i=0; i < messages.length; i++) { 11 for(var j=0; j < messages[i].length; j++) { 12 var id = messages[i][j].getId(); 13 var date = messages[i][j].getDate(); 14 var from = messages[i][j].getFrom(); 15 var body = messages[i][j].getPlainBody(); 16 var lastRow = sheet.getLastRow() + 1; 17 var range = sheet.getRange(lastRow, 1); 18 19 sheet.appendRow([ 20 date, 21 from, 22 fetchData(body, '会社名:', '\r'), 23 fetchData(body, 'お名前(姓):', '\r'), 24 fetchData(body, 'お名前(名):', '\r'), 25 fetchData(body, '電話番号:', '\r'), 26 fetchData(body, 'メールアドレス:', '\r'), 27 fetchData(body, '携帯電話:', '\r'), 28 fetchData(body, '登録者:', '\r'), 29 fetchData(body, '顧客主担当:', '\r'), 30 fetchData(body, '担当エリア:', '\r'), 31 fetchData(body, '資料:', '\r'), 32 ]); 33 } 34 } 35} 36 37function fetchData(str, pre, suf) { 38 var reg = new RegExp(pre + '.*?' + suf); 39 var data = str.match(reg)[0] 40 .replace(pre, '') 41 .replace(suf, ''); 42 return data; 43}

試したこと

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

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

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

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

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

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

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

guest

回答3

0

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

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'), ]);

投稿2019/10/25 06:04

編集2019/10/25 06:05
macaron_xxx

総合スコア3191

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

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

0

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

投稿2019/10/25 01:54

y_waiwai

総合スコア88040

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

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

aki-taka

2019/10/25 02:00

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

2019/10/27 14:21

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

0

ベストアンサー

スプレッドシートは予め全セル「書式なしテキスト」に設定しているのですが、

GASを実行すると「自動」に切り替わります。
GAS内で書式なしにすることができるのでしょうか?

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

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

javascript

1function myFunction() { 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 4 const query = 'label:(00_hp問合せ-10-23資料dw)'; 5 const threads = GmailApp.search(query, 0, 30); 6 const messages = GmailApp.getMessagesForThreads(threads) 7 .reduce(function(a,c){ return a.concat(c.map(messageToArray));},[]); 8 sheet.getRange(sheet.getLastRow() + 1, 1, messages.length, 12).setValues(messages); 9} 10 11function messageToArray(m) { 12 const body = m.getPlainBody(); 13 return [ 14 m.getDate(), 15 m.getFrom(), 16 fetchData(body, '会社名:', '\r'), 17 fetchData(body, 'お名前(姓):', '\r'), 18 fetchData(body, 'お名前(名):', '\r'), 19 fetchData(body, '電話番号:', '\r'), 20 fetchData(body, 'メールアドレス:', '\r'), 21 fetchData(body, '携帯電話:', '\r'), 22 fetchData(body, '登録者:', '\r'), 23 fetchData(body, '顧客主担当:', '\r'), 24 fetchData(body, '担当エリア:', '\r'), 25 fetchData(body, '資料:', '\r'), 26 ]; 27} 28 29function fetchData(str, pre, suf) { 30 const res = str.match(new RegExp(pre + '(.*?)' + suf)); 31 return res === null ? '' : res[1]; 32}

投稿2019/10/25 04:47

編集2019/10/27 14:01
papinianus

総合スコア12705

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

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

aki-taka

2019/10/28 09:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問