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

使用Google Apps Script批量发送多份Telegram文档遇阻求助

问题排查与修复方案

核心问题分析

你的代码存在3个关键错误,导致批量发送文档失败:

  • 媒体数组格式错误:你定义的blob2是双层数组[[...]],但Telegram sendMediaGroup API要求媒体列表是单层数组。
  • 未正确序列化媒体参数:sendMediaGroup的media参数需要传递JSON格式字符串,而非直接传入对象数组。UrlFetchApp自动转换表单数据时,原生对象数组无法被正确解析。
  • Blob引用方式错误:使用Google Drive的Blob作为媒体时,不能直接在media数组中传入Blob对象,需要通过attach://<文件名>的方式引用,并将Blob单独作为payload的字段传递。

另外,你的test函数调用tgSendDoc时传入的是单文件blob,并未触发批量发送逻辑,这也是测试无效的原因之一。

修复后的完整代码

function testBatchSend() {
  const chatId = "你的聊天ID"; // 替换为实际chatId
  const botToken = "你的BotToken"; // 替换为实际BotToken
  
  // 要发送的文件ID列表
  const fileIds = [
    "文件ID1",
    "文件ID2"
  ];

  // 构建媒体组数组和Blob映射
  const mediaGroup = [];
  const payloadBlobs = {};
  
  fileIds.forEach((fileId, index) => {
    const fileName = `doc${index + 1}.pdf`;
    const blob = DriveApp.getFileById(fileId).getAs("application/pdf");
    
    // 媒体组元素,用attach引用Blob
    mediaGroup.push({
      type: "document",
      media: `attach://${fileName}`
    });
    
    // 将Blob加入payload
    payloadBlobs[fileName] = blob;
  });

  // 给批量文件添加标题(仅第一个媒体的caption生效)
  if (mediaGroup.length > 0) {
    mediaGroup[0].caption = "批量发送的文档";
    mediaGroup[0].parse_mode = "HTML";
  }

  tgSendMediaGroup(chatId, mediaGroup, payloadBlobs, botToken);
}

function tgSendMediaGroup(chatId, mediaGroup, payloadBlobs, botToken) {
  const payload = {
    method: "sendMediaGroup",
    chat_id: String(chatId),
    media: JSON.stringify(mediaGroup), // 转为JSON字符串供API解析
    ...payloadBlobs // 合并Blob字段
  };

  const options = {
    method: "post",
    payload: payload,
    contentType: "multipart/form-data" // 必须指定多部分表单格式
  };

  const response = UrlFetchApp.fetch(`https://api.telegram.org/bot${botToken}/`, options);
  Logger.log(response.getContentText()); // 打印API返回结果用于排查
}

关键修复点说明

  • 媒体数组结构:改为单层数组,每个元素通过attach://<name>引用对应的Blob文件。
  • JSON序列化:将mediaGroup转为JSON字符串,确保Telegram API能正确识别媒体列表。
  • Multipart表单:显式指定contentType为multipart/form-data,让UrlFetchApp正确处理Blob文件的上传。
  • 标题处理:批量发送时,全局text参数不生效,需将标题放在第一个媒体对象的caption字段中。

额外注意事项

  • 确保所有文件权限正常(单文件能发送则权限无需调整)。
  • sendMediaGroup最多支持发送10个媒体文件,超过数量会被API拒绝。
  • 可通过Logger.log查看API返回的错误信息,定位剩余问题。

内容的提问来源于stack exchange,提问作者Kostya Maers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:58:18