2017-07-31 106 views
0

我正在使用谷歌應用程序腳本將電子郵件數據提取到Google電子表格中。我正在嘗試修改下面的工作代碼。我敢肯定有一個更聰明的方式......但現在這個工程將電子郵件正文的子串提取到Google電子表格

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 phonevar addr的行會失敗,因爲您無法拆分空值。有沒有辦法插入如果字符串'手機'和'街道地址'存在,然後執行上述?謝謝。

+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把它變成電子表格之前:

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找到):

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; 
} 
+0

谷歌應用程序腳本調試器不斷給我錯誤。 – 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); 
    } 
}