如何解决Google Apps脚本Google表格Gmail处理新电子邮件的追加行数组 答案:结构信息:特定于代码的修复程序:
我要从gmail接收电子邮件,然后使用jquery对其进行解析,然后要将每封电子邮件中的抓取数据发送到Google工作表中的单独行中。我的代码可以工作到可以抓取必要数据的程度,然后将其推入数组。然后,我想检查是否有重复项,如果现有的Google工作表行中有任何匹配项,如果没有,则将数据放入工作表中的行中。
我使用以下帖子作为数组部分的模型,但无法获得他为我的数据所做的工作: Google script is reprocessing emails
对于将数组转储到工作表中的任何见解,我将不胜感激。我将用来检查重复项的唯一值是该人的姓名(无名),即电子表格中的第3列
function appendLead() {
var url = 'https://docs.google.com/spreadsheets/d/1zZDKMISf8Hbw7ERfP6h-Q0pztQSMqsN-mHfeM3E_Ywg/edit#gid=0';
var ss = SpreadsheetApp.openByUrl(url);
var leadsData = ss.getSheetByName('Leads Data');
var myLabel = "Buyer Inquiries/1. To Process"; // Name of current label being processed,this label is set via a filter in Gmail
var newLabel = "Buyer Inquiries/2. Processed"; // Name of "New" filter,this label needs to be created in Gmail first
var label = GmailApp.getUserLabelByName(myLabel);
var label2 = GmailApp.getUserLabelByName(newLabel);
var threads = label.getThreads();
var data2 = [];
var newData = [];
for (var i = 0; i< threads.length; i++) {
var message = GmailApp.getMessagesForThread(threads[i])[0];
// move thread from label to label2
label2.addToThread(threads[i]);
label.removeFromThread(threads[i]);
var messageBodyhtml = message.getBody()
var $ = Cheerio.load(messageBodyhtml);
var date = $('span:contains("Date:")').siblings('span').text().trim();
var property = $('span:contains("Regarding:")').siblings('span').text().trim();
var name = $('span:contains("From:")').first().siblings('span').text().trim();
var phone = $('span:contains("Contact information:")').siblings('span').children().first().text().trim();
var email = $('span:contains("Contact information:")').siblings('span').children().last().text().trim();
var comments = $('span:contains("Comments:")').siblings('span').text().trim();
var source = $('span:contains("Lead From:")').siblings('span').text().trim();
var array = [date,property,name,phone,email,comments,source]
Logger.log(array);
data2.push([array[i]]);
}
// Compare the information in the data2 array to existing information in the sheet
var data = leadsData.getRange("A2:G").getValues(); //Change this to fit your data ranges
for(i in data2){
var row = data2[i];
var duplicate = false;
for(j in data){
if(row.join() == data[j].join()){
duplicate = true;
}
}
if(!duplicate){
newData.push(row);
}
}
if (newData.length){ // runs the below code only if there is newData,this stops an error when newData is empty
leadsData.getRange(leadsData.getLastRow()+1,1,newData.length,newData[0].length).setValues(newData); //writes newData to end of sheet
}
}
这是运行后在工作表上的结果-仅将第一个数组段粘贴在工作表上-并没有作为行粘贴-而是粘贴到了下一行
10/19/2020 9:51:16 AM
address
Sandra
email@gmail.com
ACTION: Tour Request 10/03/2020 10:00AM
Source website
我无法使重复检查器部分正常工作(例如,如果该行已经存在,并且我再次将相同的电子邮件作为测试进行处理,即使该记录是重复的,信息也会作为电子表格的一行附加在电子表格中)
var data = leadsData.getRange("A2:G").getValues(); //Change this to fit your data ranges
data.forEach(function(row) {
var duplicate = false;
data2.forEach(function(row2) {
if (row.join() == row2.join()) {
duplicate = true;
}
});
if (!duplicate) {
newData.push(row);
}
});
解决方法
答案:
用于将值设置为电子表格范围的数组结构为Array[rows][columns]
。
结构信息:
假设您要使用.setValues()
将两行数据插入到工作表中。
第1行的数据长度为8个单元格,每个单元格都是v1-v8中的值。 第2行的数据长度也为8个像元,但只有A,B,G和H列有数据。
数组结构应如下:
var arr = [
["v1","v2","v3","v4","v5","v6","v7","v8"],// row 1
["A-v","B-v","","G-v","H-v"] // row 2
];
这需要设置为:
SpreadsheetApp.getActiveSpredsheet()
.getSheetByName("Sheet-name")
.getRange("A1:B8")
.setValues(arr);
这将在工作表中显示为:
| A | B | C | D | E | F | G | H |
=========+========+========+========+========+========+========+========+========+
1 | v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 |
---------+--------+--------+--------+--------+--------+--------+--------+--------+
2 | A-v | B-v | | | | | G-v | H-v |
---------+--------+--------+--------+--------+--------+--------+--------+--------+
3 | | | | | | | | |
---------+--------+--------+--------+--------+--------+--------+--------+--------+
4 | | | | | | | | |
---------+--------+--------+--------+--------+--------+--------+--------+--------+
特定于代码的修复程序:
使用嵌套的forEach()
而不是for... in
:
data.forEach(function(row) {
var duplicate = false;
data2.forEach(function(row2) {
if (row.join() == row2.join()) {
duplicate = true;
}
});
if (!duplicate) {
newData.push(row);
}
});
我希望这对您有帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。