2017-07-31 20 views
0

私は電子メールデータをGoogleスプレッドシートに抽出するためにgoogle appスクリプトを使用しています。私は変更しようとしている以下の作業コードを持っています。電子メールの本文をGoogleスプレッドシートに抽出する

名前*:名前

Eメール*:私はこのようになり、よりスマートな方法があります確信している...しかし、今、これは

function emf() { 

    var ss = SpreadsheetApp.getActiveSheet(); 

    var label = GmailApp.getUserLabelByName("tkh_emf"); 
    var threads = label.getThreads(); 

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

    for (var j=0; j<messages.length; j++) 
    { 
     var name = messages[j].getPlainBody().split("Name*:")[1].split("\n")[0]; 
     var email = messages[j].getPlainBody().split("E-mail*:")[1].split("\n")[0]; 
     var phone = messages[j].getPlainBody().split("Phone:")[1].split("\n")[0]; 
     var addr = messages[j].getPlainBody().split("Street Address:")[1].split("\n")[0]; 
     var city = messages[j].getPlainBody().split("City*:")[1].split("\n")[0]; 
     var find = messages[j].getPlainBody().split("hear about us?*:")[1].split("\n")[0]; 
     var sub = messages[j].getSubject().split("Feedback via the ")[1].split("[")[0]; 
     var num = messages[j].getSubject().split("Feedback via the ")[1].split("[")[1].split("]")[0]; 
     var dat = messages[j].getDate(); 
     var referrer = messages[j].getPlainBody().split("Referer URL:")[1].split("\n")[0]; 

     ss.appendRow([name, email, phone, addr, city, find, sub, num, dat, referrer]) 
    } 
     threads[i].removeLabel(label); 
    } 
} 

を働く私の電子メールのための[email protected]

電話:

住所:3704第17回セント

市*:都市

あなたが私たちを知りました*どのよう

:?検索エンジンは*要求された仕事の

簡単な説明を結果:ここ

仕事だから私のコードは、それぞれに適切な文字列を抽出し、必須ではない「電話」フィールドと「アドレス」フィールド以外のフィールド。これらのフィールドが入力されていない場合、電子メールには「電話」または「ストリート・アドレス」という単語がないため、ヌルを分割できないため、var phoneおよびvar addrの行は失敗します。 if文字列 'Phone'と 'Street Address'を挿入して上記を実行する方法はありますか?ありがとう。

+0

電子メールまたはアドレスの形式を検証することもできますか、データを分割したいだけですか? – jmindel

+0

データを分離しておくだけです。 – testing123

+0

キャッチがスプリットエラーを無視する場所で、自分のtry {}ブロック内にそれぞれ電話をかけてアドレスを指定してみましたか? –

答えて

0

あなたは仕事を達成するために正規表現が必要なことは間違いありません。 I've written a simple script in Codepen that'll show you how to use the regex.

私のスクリプトでは、改行文字で本体データを分割し、結果の行の配列をループします。私は、必要なテキストをキャプチャして返す関数に各行をパイプします。他の行にパイプする必要はありません。フィールドの名前を検出し、現在の形式に基づいて適切に使用します。独自のコードで

、あなたのスプレッドシートにそれを置く前msgに次の操作を実行する必要があります:

function getText(str) { 
    var fieldRe = new RegExp("(.+)\:", "g"); 
    var fieldGroups = fieldRe.exec(str); 
    var fieldName = fieldGroups[1].split("*")[0]; 
    fieldName = (fieldName == null) ? fieldGroups[1] : fieldName; 
    fieldName = fieldName.replace(/[\!\@\#\$\%\^\&\*\(\)\-\_\+\=\`\~\[\]\{\}\\\/\|\:\;\'\"\<\>\,\.\?]/g, function transformIllegal(x) { 
     return "\\" + x; 
    }); 

    var re = new RegExp(`${fieldName}\\*?\\:\\s+(.*)`, "g"); 
    var groups = re.exec(str); 
    var out = (groups == null) ? "" : groups[1]; 

    return out; 
} 

var msg = messages[j].getPlainBody(); 
var sub = messages[j].getSubject(); 
var dat = messages[j].getDate(); 

var bodyLines = msg.split("\n"); 
var fields = []; 

for (var k = 0; k < bodyLines.length; k++) { 
    fields.push(getText(bodyLines[k])); 
} 

// do something with the resulting array of fields here 

ここgetText(str)関数は(Codepenでも見つけることができます)です

+0

Google Appsスクリプトのデバッガでエラーが表示され続けます。 – testing123

+0

@ user5753132あなたに何のエラーがありますか?あなたの質問や以前のコードで編集した新しいコードですか?また、もっと簡単な方法を探しているなら、私が書いたことは、少なくともメッセージの普通のボディの内訳を単純化し、結果の配列の各アイテムを 'name '' email''、 '' phone''、 '' addr''、 '' city''、 '' find''のようになります。あなたの主題と参照元の形式が何であるかわからないので、私が書いた方法がそれらを助けるかどうかわかりません。しかし、ショットの価値があるかもしれません。 – jmindel

0

私はこれで終わりです。洗練されていませんが動作します。

function emf() { 

    var ss = SpreadsheetApp.getActiveSheet(); 

    var label = GmailApp.getUserLabelByName("tkh_emf"); 
    var threads = label.getThreads(); 

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

    for (var j=0; j<messages.length; j++) 
    { 
     var name = messages[j].getPlainBody().split("Name*:")[1].split("\n")[0]; 
     var email = messages[j].getPlainBody().split("E-mail*:")[1].split("\n")[0]; 
     try {var phone = messages[j].getPlainBody().split("Phone:")[1].split("\n")[0];} 
     catch(e){var phone = "-";} 
     try {var addr = messages[j].getPlainBody().split("Street Address:")[1].split("\n")[0];} 
     catch(e){var addr = "-";} 
     var city = messages[j].getPlainBody().split("City*:")[1].split("\n")[0]; 
     var find = messages[j].getPlainBody().split("hear about us?*:")[1].split("\n")[0]; 
     try {var referrer = messages[j].getPlainBody().split("Referrer Name:")[1].split("\n")[0];} 
     catch(e){var referrer = "-";} 
     var sub = messages[j].getSubject().split("Feedback via the ")[1].split("[")[0]; 
     var num = messages[j].getSubject().split("Feedback via the ")[1].split("[")[1].split("]")[0]; 
     var dat = messages[j].getDate(); 

     ss.appendRow([name, email, phone, addr, city, find, referrer, sub, num, dat]) 
    } 
     threads[i].removeLabel(label); 
    } 
} 
関連する問題