Javascript Google应用程序脚本Google Sheets Gmail处理新电子邮件附加行数组
我从gmail接收电子邮件,用jquery解析它们,然后我想把从每封邮件中收集的数据发送到google表单中它自己的一行。我让代码一直工作到我有必要的数据,我把它推到一个数组中。然后,我想检查是否有重复,如果有任何匹配在现有的谷歌工作表行,如果没有,然后把数据到工作表中的行 我使用以下帖子作为阵列部分的模型,但无法获得他为我的数据所做的工作: 如果您能深入了解如何将阵列转储到工作表中,我将不胜感激。我将用于检查重复项的唯一值是人员的姓名(var名称),它位于电子表格的第3列Javascript Google应用程序脚本Google Sheets Gmail处理新电子邮件附加行数组,javascript,jquery,google-apps-script,google-sheets,gmail,Javascript,Jquery,Google Apps Script,Google Sheets,Gmail,我从gmail接收电子邮件,用jquery解析它们,然后我想把从每封邮件中收集的数据发送到google表单中它自己的一行。我让代码一直工作到我有必要的数据,我把它推到一个数组中。然后,我想检查是否有重复,如果有任何匹配在现有的谷歌工作表行,如果没有,然后把数据到工作表中的行 我使用以下帖子作为阵列部分的模型,但无法获得他为我的数据所做的工作: 如果您能深入了解如何将阵列转储到工作表中,我将不胜感激。我将用于检查重复项的唯一值是人员的姓名(var名称),它位于电子表格的第3列 function
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
}
}
我无法使重复检查部分正常工作(例如,如果该行已经存在,并且我再次处理相同的电子邮件作为测试,则即使该行是重复的,信息也会作为一行追加到电子表格中)
答复:
为电子表格范围设置值的数组结构是数组[行][列]
结构资料:
假设您希望使用.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()
而不是。。。在
中:
data.forEach(function(row) {
var duplicate = false;
data2.forEach(function(row2) {
if (row.join() == row2.join()) {
duplicate = true;
}
});
if (!duplicate) {
newData.push(row);
}
});
我希望这对你有帮助 定义
,但无法获取他为我的数据所做的工作
-问题是什么?我可以在控制台日志中看到,直到第行data2.push([array[I]])
所有内容都正确地进入了阵列。之后的部分我想通过比较新数据数组和现有数据来检查是否存在重复项。如果一行数据不是重复的,则将其从数组data2推送到newArray。然后将newArray行追加到工作表中(使用setValues而不是appendRow)。这是检查重复项并将数组粘贴到未粘贴任何数据的工作表的底部部分。只有第一个数组粘贴-而不是作为行粘贴-请参见编辑的问题谢谢帮助。我解决了这个问题:我将data2.push([array[I]])
更改为data2.push(array)
,它正确地创建了数组,并且值正确地粘贴到了工作表中。您能解释一下更改日志是如何改变数组的结构的吗?这是一个粘贴错误-不是日志,而是推送。[array[i]]刚刚将[1a]、[1a,2a]、[1a,2a,3a]……排到了26位],这只是第一排(a是领先)。正确的输出阵列现在类似于[1a、2a、3a、4a、5a、6a、7a]、[1b、2b、3b、4b、5b、6b、7b]、,。。。其中a粘贴到一行,b粘贴到第二行,以此类推now@823g4n8901我也这么想,很高兴听到它现在起作用了。如果你认为它会帮助其他人在将来遇到同样的问题,请考虑接受这个答案。我在脚本中有以下代码,但现在它在运行时没有将任何行放在工作表上(请参阅我在上面的编辑中添加的内容)。我认为我需要让它做的是创建一个现有图纸行的数组。如果一行与新数据数组匹配,则不要将该新数据推送到工作表中。e、 g.如果工作表中的一行是[“v1”、“v2”、“v3”、“v4”、“v5”、“v6”、“v7”、“v8”],并且新数组包含一行是[“v1”、“v2”、“v3”、“v4”、“v5”、“v6”、“v7”、“v8”],则不要将其粘贴到工作表中,因为它是重复的
| 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 | | | | | | | | |
---------+--------+--------+--------+--------+--------+--------+--------+--------+
data.forEach(function(row) {
var duplicate = false;
data2.forEach(function(row2) {
if (row.join() == row2.join()) {
duplicate = true;
}
});
if (!duplicate) {
newData.push(row);
}
});