如何通过Apps Script实现共享/委托Gmail收件箱数据导出到Google Sheet
Gmail导出脚本适配委托/共享收件箱方案
问题答复
- 完全可以在现有脚本基础上实现委托/共享Gmail收件箱的访问,代码改动量极小
- 不需要自行适配OAuth 2.0流程,Google Apps Script的默认授权机制已经基于OAuth 2.0,只要你当前登录的账号本身有目标收件箱的访问权限即可正常调用
前置配置要求
你使用的Google账号必须已经被添加为目标委托/共享Gmail的授权访问用户,可直接通过网页端Gmail右上角的账号切换功能进入该收件箱、正常查看邮件内容,这是脚本运行的必要前提。
代码修改方案
你可以在原有表格中新增一行用于填写委托邮箱地址,比如将C4单元格设为委托邮箱输入位,不填则默认读取当前登录账号的收件箱,修改后的完整代码如下:
// 谷歌表格创建功能菜单 var ui = SpreadsheetApp.getUi(); function onOpen(e) { ui.createMenu("Gmail Manager") .addItem("按标签获取邮件", "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 delegateEmail = sheet.getRange(4, 3).getValue(); // 拼接搜索条件,存在委托邮箱则增加归属过滤 var searchQuery = "label:" + label + " AND after:" + after + " AND before:" + before; if (delegateEmail && delegateEmail.includes('@')) { searchQuery += " AND owner:" + delegateEmail; } var threads = GmailApp.search(searchQuery); // 导出邮件内容到表格 var values = []; for (var i = 0; i < threads.length; i++) { var temp = []; var threadLabels = threads[i].getLabels().map(e => e.getName()).join(","); let messages = threads[i].getMessages(); for (var j = 0; j < messages.length; j++) { temp.push([ threadLabels, messages[j].getFrom(), messages[j].getFrom().replace(/^.*<([^>]+)>$/, "$1"), messages[j].getDate(), messages[j].getSubject(), messages[j].getPlainBody() ]); } values = values.concat(temp); } if (values.length > 0) { sheet.getRange(6, 1, values.length, values[0].length).setValues(values); } else { ui.alert("未匹配到符合条件的邮件"); } }
注意事项
- 如果不需要按标签过滤,直接删除搜索条件中的
label:相关内容即可 - 若运行时报权限错误,可先确认当前账号是否能在网页端正常访问委托邮箱,Workspace用户可联系管理员确认是否开放了Gmail API的第三方访问权限
- 共享邮箱的自定义标签需要设置为对委托用户可见,否则无法搜索到对应标签下的邮件
内容的提问来源于stack exchange,提问作者Allister Lobo
相关产品推荐
相关产品推荐

