You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:18:02