2016-08-30 10 views
0

Google Apps Scriptを使用してGmailメッセージから次のような番号を抽出しようとしています。Google Apps Scriptを使用してGmailメッセージから番号を抽出する

2,495.00 
1,594 
3,777.23 
642.00 

これはコードです:

function myFunction() { 

    var sheet = SpreadsheetApp.getActiveSheet(); 
    var threads = GmailApp.search('subject:(Transaction) after:2016/7/31 before:2016/8/10'); 

    for (var i=0; i<threads.length; i++) 
    { 
    var messages = threads[i].getMessages(); 
    var tmp; 

    for (var j=0; j<messages.length; j++) 
    { 
     var content = messages[j].getBody(); 
     var subject = messages[j].getSubject(); 
     var date = messages[j].getDate(); 
     Logger.log(content); 

     if (content) 
     { 
     tmp = content.match(/\d+(,\d+)*(\.\d+(e\d+)?)?/); 
     var number = (tmp && tmp[j]) ? tmp[j] : 'No number'; 
     sheet.appendRow([number, subject, date]); 
     } 
     else 
     { 
     sheet.appendRow([content, subject, date]); 
     } 

    } 
    } 
} 

私は混合結果を得るてきました。いくつかのメッセージでは、これは意図したとおりに機能しますが、一部のメッセージではメッセージの番号を完全にスキップします。私はJS/GASの初心者で、問題は正規表現にあると思ったが、わからない。これについての助けに感謝します。

+0

あなたはカンマで数字が必要なのでしょうか? –

+1

はいの場合は試してください: /(\d+,?¥d+(?:¥¥¥¥+++++?))g/ –

答えて

0

あなたはここ2、トラブルに直面している:
を使用している正規表現が最適化された見える(しかし、何を探していることは、あなたも同じように見える数を見ている場合1,594のような番号が見つからないはずは明らかではありませんどちらもありませんその642.00)。それにもかかわらず、あなたはコメントや類似のもので提案されたShekhar Khairnarのような正規表現を使うことができます(最後にgが重要です)。
2番目の問題は、var number = (tmp && tmp[j]) ? tmp[j] : 'No number';という行にあります。なぜこの行にはjのvarがありますか? jは、メッセージのforループ - >数への参照であり、メッセージ内の発生とは関係ありません。
私はあなたを提案することができても、そのようなものです:

function myFunction() { 

    var sheet = SpreadsheetApp.getActiveSheet(); 
    var threads = GmailApp.search('test'); 
    var re = /(?:\d{1,3}[,])*\d{1,3}\.{0,1}\d{1,3}/g; 

    for (var i=0; i<threads.length && i<5; i++) // added a condition because I didn't wanted to have too many results 
    { 
    var messages = threads[i].getMessages(); 
    var tmp; 

    for (var j=0; j<messages.length; j++) 
    { 
     var content = messages[j].getPlainBody(); //.getBody(); 
     var subject = messages[j].getSubject(); 
     var date = messages[j].getDate(); 
     //Logger.log(content); 

     if (content) 
     { 
     tmp = content.match(re); // /\d+(,\d+)*(\.\d+(e\d+)?)?/); 
     var number = tmp || ['No number']; // result of tmp is either null or an array --> if it's null then it will take the value 'no number' 
     Logger.log(number); 
     sheet.appendRow([number.join(" | "), subject, date]); 
     } 
     else 
     { 
     sheet.appendRow([content, subject, date]); 
     } 

    } 
    } 
} 
+0

5917082 /正規表現と一致する-with-without-commax-and-decimals-in-text この正規表現を推奨します: (\ d * \?\ d + | \ d {1 、3}(\ d {3})?(\ d {3})?)\(\。\ d +)? 正規表現を複数行とグローバルに一致させてから、すべての一致を繰り返して、体の数字。 数字を一致させることは重要な問題ではなく、この正規表現さえ含めたくないケースもありますので、慎重に記事を読んでください。 – alfiethecoder

+0

ありがとうハロルドとalfiethecoder!それが本当に助けになりました! – hpb

+0

正規表現を修正して小数点以下の数値だけを見つける方法を教えてください。これは本質的に '1,524' – hpb

関連する問題