将自动创建的 Gmail 标签分配给相应的线程 - google 应用程序脚本
Assigning auto-created Gmail labels to respective threads - google apps script
我正在尝试将自动创建的标签分配给 Gmail 线程。该脚本正在运行,但问题是每个标签都分配给了每个电子邮件线程,而不是一个单独的线程。
例如,如果检索到 7 封电子邮件并创建了 7 个标签,则将为这些电子邮件中的每一封分配 7 个标签。但是,标签应该只分配给它们各自的线程。
这是脚本:
//call cell value by column (Sheet: "SupplierNumber")
//label created based on the "Label" column in Sheet: "SupplierNumber"
//Label should be applied to related threads
function callLabelcolumn()
{
var ss = SpreadsheetApp.getActive();
//get sheet: VendorNumber from cell A2 to the rest of column A
var sh = ss.getSheetByName('SupplierNumber');
var rg=sh.getRange('A2:A');
var vA=rg.getValues();
//get sheet3: SearchParameter (cell A2 only)
var sh3 = ss.getSheetByName("SearchParameter")
var rg3=sh3.getRange('A2');
var searchPara =rg3.getValues();
var threads = GmailApp.search(searchPara); //Get gmail threads - within search parameter only
vA.forEach(function(row) {
if(row != "" && row != "#N/A"){
Logger.log('Label: %s', row); //Log script to debug - check get values
var label = GmailApp.createLabel(row);
Logger.log("label: " + label); //Log script to debug - check GmailLabel
}
for (var i = 0; i < threads.length; i++){
var msg = threads[i].getMessages();
for (var j = 0; j < msg.length; j++){
var msgid = msg[j].getId();
var thread = GmailApp.getMessageById(msgid).getThread();
var name = GmailApp.getUserLabelByName(label.getName());
console.log("So far so good. Let's add label");
thread.addLabel(name);
}
}
});
}
这是Log during the execution
的一部分
标签流程:
脚本引用 SearchParameter Sheet 来检索特定的电子邮件
检索到 RetrieveEmail Sheet while at the same time SupplierNumber Sheet 的电子邮件也会根据 RetrieveEmail 中的列表自动更新。
[注意:A 列(标签)在 google sheet 中有 =ArrayFormula()
(如 SupplierNumber 图像所示)以从 RetrieveEmail 中的电子邮件主题中提取供应商编号sheet 列表 - 列标签是 .createLabel(row)
]
的引用
例如:电子邮件主题是“供应商 A(供应商编号:12345)”,因此标签的输出是 12345。
脚本将引用 SupplierNumber sheet 中的标签列来创建 gmail 标签。同时,var threads
将根据 sheet SearchParameter 中相同的搜索参数检索电子邮件,该参数用于获取 msg
然后 msgid
。然后应将创建的每个标签分配给检索到的每封电子邮件。 (这是假设电子邮件数量等于标签数量)
期望的结果应该是,每个标签都分配给其指定的电子邮件,如 this example。
我尝试了不同的循环并改变了循环的位置,但我会遇到 TypeError 或类似的事情,即每封电子邮件都被分配给创建的每个标签。
那么有没有办法将新创建的 Gmail 标签相应地分配给它们各自的线程?
您当前的代码
(根据我的评论进行了格式化和简化)
vA.forEach(function (row) {
// for each vendor number create a label and..
if (row != "" && row != "#N/A") {
var label = GmailApp.createLabel(row);
}
for (var i = 0; i < threads.length; i++) {
// for each thread assign the created label
var msg = threads[i].getMessages();
for (var j = 0; j < msg.length; j++) {=
var msgid = msg[j].getId();
var thread = GmailApp.getMessageById(msgid).getThread();
var name = GmailApp.getUserLabelByName(label.getName());
thread.addLabel(name);
}
}
});
您正在创建每个标签,然后您将遍历每个线程以将新创建的标签分配给线程。这样做的最终结果将是所有线程都将具有所有标签。
您需要为此添加某种条件语句以检查标签是否在主题名称中(我假设这是您需要执行的检查)。
修改脚本
vA.forEach(function (labelName) {
// for each vendor number create a label and..
let label;
if (labelName != "" && labelName != "#N/A") {
label = GmailApp.createLabel(labelName);
} else break; // adding a break statement because if there is no label it doens't make sense to continue
for (var i = 0; i < threads.length; i++) {
// Get all the messages in the threads
var msg = threads[i].getMessages();
for (var j = 0; j < msg.length; j++) {
// Get the subject of the message
var msgSubject = msg[j].getSubject()
// Check if the subject contains the name of the label
if (msgSubject.match(label)) {
// Add the label
threads[i].addLabel(label)
// Break out of the message for loop since you have already added a label.
break;
}
}
}
});
免责声明
- 我无法测试这个,因为我没有你的数据。
- 您最终可能会得到重复的标签,我认为您需要先检查标签是否已创建,如果未创建则创建它。 (但这属于另一个问题。)
- 我个人会以不同的方式处理这个问题。
- 制作一个脚本来管理单独运行的标签(也许它会在每次供应商列表发生更改时运行)。
- 为所有通过过滤器与您的查询相匹配的邮件添加“待处理”标签。然后让脚本遍历所有线程并检查是否有任何消息主题包含任何供应商编号。
- 虽然我不知道你项目的背景,这是我自己的意见
¯\_(ツ)_/¯
如果有任何不清楚的地方,请告诉我,我会在编辑中澄清。
参考
我正在尝试将自动创建的标签分配给 Gmail 线程。该脚本正在运行,但问题是每个标签都分配给了每个电子邮件线程,而不是一个单独的线程。
例如,如果检索到 7 封电子邮件并创建了 7 个标签,则将为这些电子邮件中的每一封分配 7 个标签。但是,标签应该只分配给它们各自的线程。
这是脚本:
//call cell value by column (Sheet: "SupplierNumber")
//label created based on the "Label" column in Sheet: "SupplierNumber"
//Label should be applied to related threads
function callLabelcolumn()
{
var ss = SpreadsheetApp.getActive();
//get sheet: VendorNumber from cell A2 to the rest of column A
var sh = ss.getSheetByName('SupplierNumber');
var rg=sh.getRange('A2:A');
var vA=rg.getValues();
//get sheet3: SearchParameter (cell A2 only)
var sh3 = ss.getSheetByName("SearchParameter")
var rg3=sh3.getRange('A2');
var searchPara =rg3.getValues();
var threads = GmailApp.search(searchPara); //Get gmail threads - within search parameter only
vA.forEach(function(row) {
if(row != "" && row != "#N/A"){
Logger.log('Label: %s', row); //Log script to debug - check get values
var label = GmailApp.createLabel(row);
Logger.log("label: " + label); //Log script to debug - check GmailLabel
}
for (var i = 0; i < threads.length; i++){
var msg = threads[i].getMessages();
for (var j = 0; j < msg.length; j++){
var msgid = msg[j].getId();
var thread = GmailApp.getMessageById(msgid).getThread();
var name = GmailApp.getUserLabelByName(label.getName());
console.log("So far so good. Let's add label");
thread.addLabel(name);
}
}
});
}
这是Log during the execution
的一部分标签流程:
脚本引用 SearchParameter Sheet 来检索特定的电子邮件
检索到 RetrieveEmail Sheet while at the same time SupplierNumber Sheet 的电子邮件也会根据 RetrieveEmail 中的列表自动更新。
[注意:A 列(标签)在 google sheet 中有 =ArrayFormula()
(如 SupplierNumber 图像所示)以从 RetrieveEmail 中的电子邮件主题中提取供应商编号sheet 列表 - 列标签是 .createLabel(row)
]
例如:电子邮件主题是“供应商 A(供应商编号:12345)”,因此标签的输出是 12345。
脚本将引用 SupplierNumber sheet 中的标签列来创建 gmail 标签。同时,
var threads
将根据 sheet SearchParameter 中相同的搜索参数检索电子邮件,该参数用于获取msg
然后msgid
。然后应将创建的每个标签分配给检索到的每封电子邮件。 (这是假设电子邮件数量等于标签数量)期望的结果应该是,每个标签都分配给其指定的电子邮件,如 this example。
我尝试了不同的循环并改变了循环的位置,但我会遇到 TypeError 或类似的事情,即每封电子邮件都被分配给创建的每个标签。
那么有没有办法将新创建的 Gmail 标签相应地分配给它们各自的线程?
您当前的代码
(根据我的评论进行了格式化和简化)
vA.forEach(function (row) {
// for each vendor number create a label and..
if (row != "" && row != "#N/A") {
var label = GmailApp.createLabel(row);
}
for (var i = 0; i < threads.length; i++) {
// for each thread assign the created label
var msg = threads[i].getMessages();
for (var j = 0; j < msg.length; j++) {=
var msgid = msg[j].getId();
var thread = GmailApp.getMessageById(msgid).getThread();
var name = GmailApp.getUserLabelByName(label.getName());
thread.addLabel(name);
}
}
});
您正在创建每个标签,然后您将遍历每个线程以将新创建的标签分配给线程。这样做的最终结果将是所有线程都将具有所有标签。
您需要为此添加某种条件语句以检查标签是否在主题名称中(我假设这是您需要执行的检查)。
修改脚本
vA.forEach(function (labelName) {
// for each vendor number create a label and..
let label;
if (labelName != "" && labelName != "#N/A") {
label = GmailApp.createLabel(labelName);
} else break; // adding a break statement because if there is no label it doens't make sense to continue
for (var i = 0; i < threads.length; i++) {
// Get all the messages in the threads
var msg = threads[i].getMessages();
for (var j = 0; j < msg.length; j++) {
// Get the subject of the message
var msgSubject = msg[j].getSubject()
// Check if the subject contains the name of the label
if (msgSubject.match(label)) {
// Add the label
threads[i].addLabel(label)
// Break out of the message for loop since you have already added a label.
break;
}
}
}
});
免责声明
- 我无法测试这个,因为我没有你的数据。
- 您最终可能会得到重复的标签,我认为您需要先检查标签是否已创建,如果未创建则创建它。 (但这属于另一个问题。)
- 我个人会以不同的方式处理这个问题。
- 制作一个脚本来管理单独运行的标签(也许它会在每次供应商列表发生更改时运行)。
- 为所有通过过滤器与您的查询相匹配的邮件添加“待处理”标签。然后让脚本遍历所有线程并检查是否有任何消息主题包含任何供应商编号。
- 虽然我不知道你项目的背景,这是我自己的意见
¯\_(ツ)_/¯
如果有任何不清楚的地方,请告诉我,我会在编辑中澄清。