如何用Apps Script实现Gmail标签导出至Google Sheets对应行第一列
实现方案
核心逻辑说明
Gmail的标签是绑定在**邮件线程(Thread)**维度的,单条消息(Message)没有getLabels()方法,你需要从父级线程对象获取标签数据。此外getLabels()返回的是GmailLabel对象数组,不能直接写入单元格,需要先提取标签名称转换为字符串。
另外原有代码存在行覆盖问题:如果1个线程包含多条消息,会重复写入同一行,我们新增行计数器避免该问题。
修改后完整代码
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); // 新增行计数器,从第6行开始写入数据 let currentRow = 6; for (var i = 0; i<threads.length; i++){ // 提前获取当前线程的所有标签,转换为逗号分隔的字符串 const threadLabels = threads[i].getLabels().map(labelObj => labelObj.getName()).join(', '); let messages = threads[i].getMessages(); for (var j = 0; j<messages.length; j++){ // 写入标签到第一列 sheet.getRange(currentRow,1).setValue(threadLabels); // 如果你只需要搜索时筛选的目标标签,不需要展示该线程绑定的所有标签,直接用下面这句效率更高 // sheet.getRange(currentRow,1).setValue(label); sheet.getRange(currentRow,2).setValue(messages[j].getFrom()); sheet.getRange(currentRow,3).setValue(messages[j].getFrom().replace(/^.+<([^>]+)>$/, "$1")); sheet.getRange(currentRow,4).setValue(messages[j].getDate()); sheet.getRange(currentRow,5).setValue(messages[j].getSubject()); sheet.getRange(currentRow,6).setValue(messages[j].getPlainBody()); // 写完一行计数器+1,避免下条消息覆盖本行数据 currentRow++; } } }
内容的提问来源于stack exchange,提问作者Allister Lobo
相关产品推荐
相关产品推荐

