如何修改Google脚本拉取标签下全部Gmail邮件至表格?
解决Gmail邮件批量导入Google表格的分页问题
原脚本使用GmailApp.search()方法,该方法单次最多返回500个邮件线程,且无内置分页机制,导致无法获取全部7000封邮件。要实现全量导入,需借助Gmail高级服务结合nextPageToken实现分页查询,具体修改方案如下:
步骤1:启用Gmail高级服务
- 打开Google表格,点击菜单栏「扩展」→「Apps Script」进入脚本编辑器
- 在脚本编辑器中,点击左侧「服务」→「添加服务」,找到「Gmail」并启用,点击「添加」完成配置
步骤2:修改后的完整脚本
function ExtractingEmails(query = "Label:Inbox") { const headers = ["TimeStamp", "From", "To", "Subject"]; let allEmails = [headers]; const pageSize = 100; // 每页获取的线程数,可在100-500之间调整 let pageToken = null; do { // 分页获取邮件线程 const threadsResponse = Gmail.Users.Threads.list("me", { q: query, maxResults: pageSize, pageToken: pageToken }); // 当前页无线程数据时跳出循环 if (!threadsResponse.threads) break; // 遍历线程,提取所有邮件信息 threadsResponse.threads.forEach(thread => { const threadObj = GmailApp.getThreadById(thread.id); const messages = threadObj.getMessages(); messages.forEach(message => { allEmails.push([ message.getDate(), message.getFrom(), message.getTo(), message.getSubject() ]); }); }); // 更新分页token,准备获取下一页数据 pageToken = threadsResponse.nextPageToken; } while (pageToken); // 循环直到无下一页数据 // 将数据写入表格 const ss = SpreadsheetApp.getActive(); const sh = ss.getSheetByName("Sheet1"); if (allEmails.length > 1) { sh.clearContents(); sh.getRange(1, 1, allEmails.length, headers.length).setValues(allEmails); ss.toast(`${allEmails.length - 1} 封邮件已导入,查询条件:${query}`); } else { ss.toast(`未找到符合查询条件的邮件:${query}`); } }
关键逻辑说明
- 用
Gmail.Users.Threads.list()替代GmailApp.search(),支持通过pageToken和maxResults参数实现分页查询 - 通过
do-while循环持续请求下一页数据,直到nextPageToken为空(表示所有邮件线程已获取) - 保留原脚本的邮件信息提取逻辑,确保导入数据的一致性
- 可调整
pageSize参数平衡API调用次数和执行效率,建议值100-500
注意事项
- 执行时间:处理7000封邮件可能接近6分钟的脚本执行上限,若出现超时,可按日期拆分查询条件(如
Label:Inbox after:2023/01/01 before:2023/06/01),或使用时间驱动触发器分批执行 - API配额:Gmail API每日调用配额为10000次,该脚本的调用量在配额范围内,无需额外申请
内容的提问来源于stack exchange,提问作者David Drake II
相关产品推荐
相关产品推荐

