将 Gmail 标签导出到 Google 工作表
Exporting Gmail Labels to Google Sheets
我有一个应用程序脚本可以将数据从我的 gmail 收件箱提取到 google sheet 以根据哪个标签分析电子邮件。我创建了一个数组来提取电子邮件的发件人、日期、主题和正文,但我想将相关标签添加到第一列的每一行,如第 24 行所示。
如何将标签添加到第一列?
var ui = SpreadsheetApp.getUi();
function onOpen(e){
ui.createMenu("Gmail Manager").addItem("Get Emails by Label", "getGmailEmails").addToUi();
}
function getGmailEmails() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var label = sheet.getRange(1,3).getValue();
var after = sheet.getRange(2,3).getDisplayValue();
var before = sheet.getRange(3,3).getDisplayValue();
var threads = GmailApp.search ("label:"+label + " AND " + "after:"+after + " AND " + "before:"+before);
//console.log("label:"+label + " AND " + "after:"+after + " AND " + "before:"+before);
for (var i = 0; i<threads.length; i++){
let messages = threads[i].getMessages();
for (var j = 0; j<messages.length; j++){
//sheet.getRange(i+6,1).setValue(messages[j].getLabels());
sheet.getRange(i+6,2).setValue(messages[j].getFrom());
sheet.getRange(i+6,3).setValue(messages[j].getFrom().replace(/^,+<([^>]+)>$/, ""));
sheet.getRange(i+6,4).setValue(messages[j].getDate());
sheet.getRange(i+6,5).setValue(messages[j].getSubject());
sheet.getRange(i+6,6).setValue(messages[j].getPlainBody());
}
}
}
我认为你的脚本修改点如下
getLabels()
的方法适用于 Class GmailThread。
- 在循环中使用
setValue
时,处理成本会很高
当以上修改点反映到你的脚本中,就变成了下面这样
修改后的脚本:
function getGmailEmails() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var label = sheet.getRange(1, 3).getValue();
var after = sheet.getRange(2, 3).getDisplayValue();
var before = sheet.getRange(3, 3).getDisplayValue();
var threads = GmailApp.search("label:" + label + " AND " + "after:" + after + " AND " + "before:" + before);
// I modified below script.
var values = [];
for (var i = 0; i < threads.length; i++) {
var temp = [];
var label = threads[i].getLabels().map(e => e.getName()).join(",");
let messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++) {
temp.push([
label,
messages[j].getFrom(),
messages[j].getFrom().replace(/^,+<([^>]+)>$/, ""),
messages[j].getDate(),
messages[j].getSubject(),
messages[j].getPlainBody()
]);
}
values = values.concat(temp);
}
sheet.getRange(6, 1, values.length, values[0].length).setValues(values);
}
注:
- 在这个修改中,当使用多个标签时,这些标签通过
,
分隔作为文本使用。关于这个,请根据自己的实际情况修改。
参考文献:
我有一个应用程序脚本可以将数据从我的 gmail 收件箱提取到 google sheet 以根据哪个标签分析电子邮件。我创建了一个数组来提取电子邮件的发件人、日期、主题和正文,但我想将相关标签添加到第一列的每一行,如第 24 行所示。
如何将标签添加到第一列?
var ui = SpreadsheetApp.getUi();
function onOpen(e){
ui.createMenu("Gmail Manager").addItem("Get Emails by Label", "getGmailEmails").addToUi();
}
function getGmailEmails() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var label = sheet.getRange(1,3).getValue();
var after = sheet.getRange(2,3).getDisplayValue();
var before = sheet.getRange(3,3).getDisplayValue();
var threads = GmailApp.search ("label:"+label + " AND " + "after:"+after + " AND " + "before:"+before);
//console.log("label:"+label + " AND " + "after:"+after + " AND " + "before:"+before);
for (var i = 0; i<threads.length; i++){
let messages = threads[i].getMessages();
for (var j = 0; j<messages.length; j++){
//sheet.getRange(i+6,1).setValue(messages[j].getLabels());
sheet.getRange(i+6,2).setValue(messages[j].getFrom());
sheet.getRange(i+6,3).setValue(messages[j].getFrom().replace(/^,+<([^>]+)>$/, ""));
sheet.getRange(i+6,4).setValue(messages[j].getDate());
sheet.getRange(i+6,5).setValue(messages[j].getSubject());
sheet.getRange(i+6,6).setValue(messages[j].getPlainBody());
}
}
}
我认为你的脚本修改点如下
getLabels()
的方法适用于 Class GmailThread。- 在循环中使用
setValue
时,处理成本会很高
当以上修改点反映到你的脚本中,就变成了下面这样
修改后的脚本:
function getGmailEmails() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var label = sheet.getRange(1, 3).getValue();
var after = sheet.getRange(2, 3).getDisplayValue();
var before = sheet.getRange(3, 3).getDisplayValue();
var threads = GmailApp.search("label:" + label + " AND " + "after:" + after + " AND " + "before:" + before);
// I modified below script.
var values = [];
for (var i = 0; i < threads.length; i++) {
var temp = [];
var label = threads[i].getLabels().map(e => e.getName()).join(",");
let messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++) {
temp.push([
label,
messages[j].getFrom(),
messages[j].getFrom().replace(/^,+<([^>]+)>$/, ""),
messages[j].getDate(),
messages[j].getSubject(),
messages[j].getPlainBody()
]);
}
values = values.concat(temp);
}
sheet.getRange(6, 1, values.length, values[0].length).setValues(values);
}
注:
- 在这个修改中,当使用多个标签时,这些标签通过
,
分隔作为文本使用。关于这个,请根据自己的实际情况修改。