Google Apps 脚本 Google 工作表 Gmail 处理新电子邮件追加行数组
Google Apps Script Google Sheets Gmail Processing New Emails Append Row Array
我正在从 gmail 中获取电子邮件,使用 jquery 解析它们,然后我想将从每封电子邮件中抓取的数据发送到 google sheet 中各自的行中。我让代码一直工作到我已抓取必要数据的程度,然后将其推送到一个数组中。然后我想检查现有 google sheet 行中是否存在任何匹配项,如果没有,则将数据放入 sheet.
行中
我使用以下 post 作为数组部分的模型,但无法得到他为我的数据所做的工作:
Google script is reprocessing emails
对于将数组转储到 sheet 中的任何见解,我将不胜感激。我将用来检查重复项的唯一值是人名(var name),它是 spreadsheet
中的第 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
}
}
这是 运行 之后 sheet 上的结果 - 只有第一个数组段粘贴在 sheet 上 - 它不是作为一行粘贴的 - 它是向下粘贴的一栏
10/19/2020 9:51:16 AM
address
Sandra
email@gmail.com
ACTION: Tour Request 10/03/2020 10:00AM
Source website
我无法让重复检查器部分工作(例如,如果该行已经存在,并且我再次处理同一封电子邮件作为测试,信息会作为一行附加在传播中sheet即使它是重复的)
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);
}
});
答案:
将值设置为 Spreadsheet 范围的数组结构为 Array[rows][columns]
.
结构信息:
假设您要使用 .setValues()
.
将两行数据插入 sheet
第 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);
这将在 Sheet 中显示为:
| 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 | | | | | | | | |
---------+--------+--------+--------+--------+--------+--------+--------+--------+
Code-specific 修复:
使用嵌套 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);
}
});
我正在从 gmail 中获取电子邮件,使用 jquery 解析它们,然后我想将从每封电子邮件中抓取的数据发送到 google sheet 中各自的行中。我让代码一直工作到我已抓取必要数据的程度,然后将其推送到一个数组中。然后我想检查现有 google sheet 行中是否存在任何匹配项,如果没有,则将数据放入 sheet.
行中我使用以下 post 作为数组部分的模型,但无法得到他为我的数据所做的工作: Google script is reprocessing emails
对于将数组转储到 sheet 中的任何见解,我将不胜感激。我将用来检查重复项的唯一值是人名(var name),它是 spreadsheet
中的第 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
}
}
这是 运行 之后 sheet 上的结果 - 只有第一个数组段粘贴在 sheet 上 - 它不是作为一行粘贴的 - 它是向下粘贴的一栏
10/19/2020 9:51:16 AM
address
Sandra
email@gmail.com
ACTION: Tour Request 10/03/2020 10:00AM
Source website
我无法让重复检查器部分工作(例如,如果该行已经存在,并且我再次处理同一封电子邮件作为测试,信息会作为一行附加在传播中sheet即使它是重复的)
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);
}
});
答案:
将值设置为 Spreadsheet 范围的数组结构为 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);
这将在 Sheet 中显示为:
| 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 | | | | | | | | |
---------+--------+--------+--------+--------+--------+--------+--------+--------+
Code-specific 修复:
使用嵌套 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);
}
});