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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 15:36:02