gmail本文内の特定文字の後を、スプレッドシートに出力する方法についてご存知ではないでしょうか?

5,031 views
Skip to first unread message

Naoki Yamamoto

unread,
Apr 17, 2016, 3:54:58 AM4/17/16
to Google Apps API Japan
はじめまして。
当方専門知識はほとんどございません。そのため的外れな質問でしたら失礼致しますが、
どなたか知恵をお貸しいただけないでしょうか?


以下のようなメールのうち、お客様情報のみ自動でスプレッドシートに項目ごとにまとめて管理したいと思っております。
りんご、バナナ、ももの部分が問い合わせ商品で、お客様によって数が変わります。

======================

Webサイトより、お問い合わせがありました。
送信内容は下記の通りです。

りんご
バナナ
もも

・お名前
山田 太郎

・フリガナ
ヤマダ タロウ

・メールアドレス

・電話番号
090-0000-0000

・住所
〒000-0000
東京都◯◯区◯◯0-00-00
山田マンション00

======================


取得したい情報は、

山田 太郎様
090-0000-0000
〒000-0000
東京都◯◯区◯◯0-00-00
山田マンション00

です。

実はググったりしながら一度はカタチになったのですが
私の実践した方法は「本文を改行ごとに、文章を変数として保存している?」やり方のため、

りんご
バナナ
もも

の部分が、

りんご
バナナ

だったりすると、段落がズレてしまい違う行を抽出してしまいます。。。

そこで、質問タイトルに戻りますが、「・お名前」の下の情報の「山田 太郎」を取得するにはどのようにコードをかけばよろしいでしょうか?
他のサイトの問い合わせメールも受信しているのですが、そちらは「・お名前」の右横に「山田 太郎」が記載しているので
そちらの場合もご教授いただけますと助かります。

お手数ですがよろしくお願い致します。
以下一度カタチになったコードです。

function getMail(){
  var sheet = SpreadsheetApp.getActive().getSheetByName('イエイ');
  var start = 0;
  var max = 500;
  var threads = GmailApp.search('label:イエイ  is:unread',start,max);
  var row = sheet.getLastRow() + 1;
  
  for(var n in threads){
    var the = threads[n];
    
    var msgs = the.getMessages();
    for(m in msgs){
    var msg = msgs[m];
    var body = msg.getBody();
    var res  = body.split('<br />\n')
    var date = msg.getDate();
 
        sheet.getRange(row,1).setValue(date);//1列目に内容
 
        var customer = res[16].replace('様', '')
        sheet.getRange(row,2).setValue(customer);//2列目に内容
 
        var mailaddress = res[17].
        sheet.getRange(row,3).setValue(address);//3列目に内容
      
        var tel = res[18].
        sheet.getRange(row,4).setValue(tel);//4列目に内容

        var address1 = res[19].
        sheet.getRange(row,5).setValue(address1);//5列目に内容

        var address2 = res[20].
        sheet.getRange(row,6).setValue(address2);//6列目に内容

        var address3 = res[21].
        sheet.getRange(row,7).setValue(address3);//7列目に内容
      
 
    the.markRead();
      row++;
    }
    Utilities.sleep(1000);
  }
}





杉浦聡

unread,
Apr 17, 2016, 10:43:13 PM4/17/16
to google-app...@googlegroups.com
> りんご
> バナナ
> もも

りんご,バナナ,もも

送信側を変更できるなら、区切り文字を含めて1行にしてはどうでしょうか?
フォーマットを固定すれば行数決め打ちで取得できます。

送信側が変更できない場合は、配列のindexOfでできました。
「・お名前」の右横にある場合は取得後に加工すればできそうです。

function getMail(){
var sheet = SpreadsheetApp.getActive().getSheetByName('イエイ');
var start = 0;
var max = 500;
var threads = GmailApp.search('label:イエイ is:unread',start,max);
var row = sheet.getLastRow() + 1;

for(var n in threads){
var the = threads[n];

var msgs = the.getMessages();
for(m in msgs){
var msg = msgs[m];
var body = msg.getBody();
var res = body.split('<br />\n')
var date = msg.getDate();


sheet.getRange(row,1).setValue(date);//1列目に内容

var customer = res[res.indexOf('・お名前')+1].replace('様', '')
sheet.getRange(row,2).setValue(customer);//2列目に内容

var mailaddress = res[res.indexOf('・メールアドレス')+1]
sheet.getRange(row,3).setValue(mailaddress);//3列目に内容

var tel = res[res.indexOf('・電話番号')+1]
sheet.getRange(row,4).setValue(tel);//4列目に内容

var address1 = res[res.indexOf('・住所')+1]
sheet.getRange(row,5).setValue(address1);//5列目に内容

var address2 = res[res.indexOf('・住所')+2]
sheet.getRange(row,6).setValue(address2);//6列目に内容

var address3 = res[res.indexOf('・住所')+3]
if(address3){//必要ならundefined対策
sheet.getRange(row,7).setValue(address3);//7列目に内容
}

the.markRead();
row++;
}
Utilities.sleep(1000);
}
}



2016年4月17日 16:54 Naoki Yamamoto <laptou...@gmail.com>:
> --
> このメールは Google グループのグループ「Google Apps API Japan」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> google-apps-api-...@googlegroups.com にメールを送信してください。
> このグループに投稿するには google-app...@googlegroups.com にメールを送信してください。
> その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

Lap

unread,
Apr 21, 2016, 1:03:10 AM4/21/16
to Google Apps API Japan
杉浦様

ご親切に回答いただきましてありがとうございます!!
フォーマットは変更できないため、記載していただいた方法で成功しました!!!
indexOfというのがあるんですね...!

また、大変申し訳無いのですが、

「・お名前」の右横にある場合は取得後に加工すればできそうです。 

というのはどういう事なのでしょうか?


2016年4月18日月曜日 11時43分13秒 UTC+9 杉浦聡:
> google-apps-api-japan+unsub...@googlegroups.com にメールを送信してください。

杉浦聡

unread,
Apr 21, 2016, 3:32:13 AM4/21/16
to google-app...@googlegroups.com
> 「・お名前」の右横にある場合は取得後に加工すればできそうです。
>
> というのはどういう事なのでしょうか?

var customer = res[res.indexOf('・お名前')];
で、対象の行の文字列を取得してから加工する、という意味でしたが
そもそも以下の値になっていたらres.indexOf('・お名前')で検索できないですね‥・

・お名前山田太郎


「・お名前~」のindexをfor文で先にみつければできました。別の方法もあると思います。

function getMail(){
var sheet = SpreadsheetApp.getActive().getSheetByName('イエイ');
var start = 0;
var max = 500;
var threads = GmailApp.search('label:イエイ is:unread',start,max);
var row = sheet.getLastRow() + 1;

for(var n in threads){
var the = threads[n];

var msgs = the.getMessages();
for(m in msgs){
var msg = msgs[m];
var body = msg.getBody();
var res = body.split('<br />\n')
var date = msg.getDate();

var indexOfOname = -1

for (var i = 0; i < res.length; i ++) {
if(res[i].substring(0, '・お名前'.length) === '・お名前'){;
indexOfOname = i;
}
}

var customer =
res[indexOfOname].substring('・お名前'.length).replace('様', '');
sheet.getRange(row,2).setValue(customer);//2列目に内容

the.markRead();
row++;
}
Utilities.sleep(1000);
}
}


2016年4月21日 14:03 Lap <laptou...@gmail.com>:
>> > google-apps-api-...@googlegroups.com にメールを送信してください。
>> > このグループに投稿するには google-app...@googlegroups.com にメールを送信してください。
>> > その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。
>
> --
> このメールは Google グループのグループ「Google Apps API Japan」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> google-apps-api-...@googlegroups.com にメールを送信してください。

Lap

unread,
Apr 21, 2016, 4:41:34 AM4/21/16
to Google Apps API Japan
早々にご回答いただきましてありがとうございます!
早速コピペして試してみたのですが、以下のエラーが出てしまいました…

TypeError: undefined のメソッド「substring」を呼び出せません。(行 26、ファイル「コード」)

という

2016年4月21日木曜日 16時32分13秒 UTC+9 杉浦聡:
>> > google-apps-api-japan+unsub...@googlegroups.com にメールを送信してください。
>> > このグループに投稿するには google-app...@googlegroups.com にメールを送信してください。
>> > その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。
>
> --
> このメールは Google グループのグループ「Google Apps API Japan」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> google-apps-api-japan+unsub...@googlegroups.com にメールを送信してください。

杉浦聡

unread,
Apr 21, 2016, 7:38:05 AM4/21/16
to google-app...@googlegroups.com
undefinedなので配列からオブジェクトが取得できていないようですね。
Logger.log(i)でログ出力やステップ実行してデバッグしてみてください。

よくあるミスはfor文のなかで使うiやj,k,l,m,nなどの添え字ですが
すでに上の階層(というか外側で使っているfor文)で同じものを使うと
その変数を上書きしてまってうまく動かないことがあります。



2016年4月21日 17:41 Lap <laptou...@gmail.com>:
>> >> > google-apps-api-...@googlegroups.com にメールを送信してください。
>> >> > このグループに投稿するには google-app...@googlegroups.com にメールを送信してください。
>> >> > その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。
>> >
>> > --
>> > このメールは Google グループのグループ「Google Apps API Japan」に登録しているユーザーに送られています。
>> > このグループから退会し、グループからのメールの配信を停止するには
>> > google-apps-api-...@googlegroups.com にメールを送信してください。
>> > このグループに投稿するには google-app...@googlegroups.com にメールを送信してください。
>> > その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。
>
> --
> このメールは Google グループのグループ「Google Apps API Japan」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> google-apps-api-...@googlegroups.com にメールを送信してください。

Lap

unread,
May 9, 2016, 12:21:44 AM5/9/16
to Google Apps API Japan
杉浦様

何度もご回答いただきましてありがとうございます。
ご指示のとおり、デバッグをしてみるのですが、どこが原因なのか分からない状況です。。。

とりあえず、
function getMail(){ 
  var sheet = SpreadsheetApp.getActive().getSheetByName('イエイ'); 
  var start = 0; 
  var max = 500; 
  var threads = GmailApp.search('label:イエイ  is:unread',start,max); 
  var row = sheet.getLastRow() + 1; 

  for(var n in threads){ 
    var the = threads[n]; 

    var msgs = the.getMessages(); 
    for(m in msgs){ 
      var msg = msgs[m]; 
      var body = msg.getBody(); 
      var res  = body.split('<br />\n') 
      var date = msg.getDate(); 

      var indexOfOname = -1 

      for (var i = 0; i < res.length; i ++) { 
        if(res[i].substring(0, '・お名前'.length) === '・お名前'){; 
          indexOfOname = i; 
        } 
      } 

      var customer = 
res[indexOfOname].substring('・お名前'.length).replace('様', ''); 
      sheet.getRange(row,2).setValue(customer);//2列目に内容 

      the.markRead(); 
      row++; 
    } 
    Utilities.sleep(1000); 
  } 

だけで検証してみたのですが、やはりエラーになってしまいます。
一体何が悪いのでしょうか?

時間が空いてからの質問で大変恐縮ですがご教授いただけますと幸いです。


2016年4月21日木曜日 20時38分05秒 UTC+9 杉浦聡:
>> >> > google-apps-api-japan+unsub...@googlegroups.com にメールを送信してください。
>> >> > このグループに投稿するには google-app...@googlegroups.com にメールを送信してください。
>> >> > その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。
>> >
>> > --
>> > このメールは Google グループのグループ「Google Apps API Japan」に登録しているユーザーに送られています。
>> > このグループから退会し、グループからのメールの配信を停止するには
>> > google-apps-api-japan+unsub...@googlegroups.com にメールを送信してください。
>> > このグループに投稿するには google-app...@googlegroups.com にメールを送信してください。
>> > その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。
>
> --
> このメールは Google グループのグループ「Google Apps API Japan」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> google-apps-api-japan+unsub...@googlegroups.com にメールを送信してください。

Lap

unread,
May 9, 2016, 12:25:59 AM5/9/16
to Google Apps API Japan
ちなみにエラーは前回と同じで、以下のようにでます。
TypeError: undefined のメソッド「substring」を呼び出せません。(行 26、ファイル「コード」)

2016年4月21日木曜日 20時38分05秒 UTC+9 杉浦聡:
>> >> > google-apps-api-japan+unsub...@googlegroups.com にメールを送信してください。
>> >> > このグループに投稿するには google-app...@googlegroups.com にメールを送信してください。
>> >> > その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。
>> >
>> > --
>> > このメールは Google グループのグループ「Google Apps API Japan」に登録しているユーザーに送られています。
>> > このグループから退会し、グループからのメールの配信を停止するには
>> > google-apps-api-japan+unsub...@googlegroups.com にメールを送信してください。
>> > このグループに投稿するには google-app...@googlegroups.com にメールを送信してください。
>> > その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。
>
> --
> このメールは Google グループのグループ「Google Apps API Japan」に登録しているユーザーに送られています。
> このグループから退会し、グループからのメールの配信を停止するには
> google-apps-api-japan+unsub...@googlegroups.com にメールを送信してください。

hikochang

unread,
Jun 14, 2016, 7:43:14 PM6/14/16
to Google Apps API Japan
デバッグした際に26行目のsubstring実行前の文字列が確認できると思いますので、その内容を確認して下さい。
substring前の値を一度変数に代入すると確認しやすいです。

hikochang

unread,
Jun 15, 2016, 12:32:34 PM6/15/16
to Google Apps API Japan
res[indexOfOname] には「・お名前」もしくは「・お名前山田 太郎」が入ってくると考えていますか?

「.replace('様', ''); 」の部分で「様」を削除していますが、例には様はありません、文字を追加したかったのでは無いでしょうか?

また、indexOfOnameを見つけるだけであれば、見つかったらBreakして良いと思います。
      for (var i = 0; i < res.length; i ++) { 
        if(res[i].substring(0, '・お名前'.length) === '・お名前'){; 
          indexOfOname = i; 
          break;
        } 
      } 


2016年6月15日水曜日 8時43分14秒 UTC+9 hikochang:
デバッグした際に26行目のsubstring実行前の文字列が確認できると思いますので、その内容を確認して下さい。
substring前の値を一度変数に代入すると確認しやすいです。

Lap

unread,
Jun 15, 2016, 9:40:21 PM6/15/16
to Google Apps API Japan
hikochang様

ご回答ありがとうございます!無事解決しました。

2016年6月16日木曜日 1時32分34秒 UTC+9 hikochang:
Reply all
Reply to author
Forward
0 new messages