使用Google Apps Script批量发送多份Telegram文档遇阻求助
问题排查与修复方案
核心问题分析
你的代码存在3个关键错误,导致批量发送文档失败:
- 媒体数组格式错误:你定义的
blob2是双层数组[[...]],但TelegramsendMediaGroupAPI要求媒体列表是单层数组。 - 未正确序列化媒体参数:
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
相关产品推荐
相关产品推荐

