Google Apps Script用Gmail高级服务创建兼容emoji草稿的报错问题
错误原因
Gmail API的读写逻辑存在不对称设计:
- 调用
users.drafts.get读取草稿时,返回的body.data字段会被自动解析为字节数组,方便后续处理 - 调用
users.drafts.create创建草稿时,接口要求body.data必须为URL安全的Base64编码字符串,不接受字节数组格式,因此你传入数组时会触发「Proto field is not repeating, cannot start list」的报错。
正确实现方式
你需要先将字节数组转换为符合要求的Base64URL字符串,再传入接口参数:
1. 字节数组转Base64URL工具函数
// 字节数组转换为URL安全的Base64字符串 const bytesToBase64Url = (byteArr) => { const rawStr = byteArr.map(byte => String.fromCharCode(byte)).join(''); const base64Str = Utilities.base64Encode(rawStr); // 替换为URL安全字符,删除末尾补位的等号 return base64Str.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, ''); }
2. 修改后的草稿创建函数
const createDraftWithAdvancedService = () => { // 你的原始内容字节数组 const contentBytes = [42, 123, 123, 80, 114]; Gmail.Users.Drafts.create({ message: { payload: { mimeType: "multipart/alternative", // 匹配多部分内容的MIME类型 parts: [ { mimeType: "text/plain; charset=UTF-8", // 指定当前部分的MIME类型 body: { data: bytesToBase64Url(contentBytes) // 传入转换后的字符串 } } ], headers: [ { "name": "Subject", "value": "This is a test subject" }, { "name": "MIME-Version", "value": "1.0" } ] } } }, 'user@domain.com'); }
注意事项
- 必须为整个
payload和每个part都指定对应正确的mimeType,否则接口会无法解析内容导致创建失败 - 如果需要同时添加纯文本和HTML两个内容部分,每个部分的
data字段都需要单独做Base64URL转换 - 不需要手动填写
body.size字段,接口会自动计算生成
内容的提问来源于stack exchange,提问作者Dmitry Kostyuk
相关产品推荐
相关产品推荐

