Google Apps Script调用Slack pins.list获取permalinks返回null问题
Slack pins.list 接口取值返回null修复方案
现存代码问题
- 语法错误:payload对象中
"channel": "C0XXXXXXXXX"行末尾缺失逗号,运行时会直接抛出语法异常 - 请求逻辑错误:
- GET请求无需传递
payload参数,UrlFetchApp会默认将payload作为POST表单内容提交,会导致Slack接口无法识别请求参数 - payload中混入了接口响应字段
ok,该字段不属于请求传参内容,传了也不会被接口处理
- GET请求无需传递
- 响应解析逻辑错误:
- pins.list接口返回的置顶集合是顶层复数字段
items(数组结构),不存在单数item顶层字段 - 置顶链接字段为单数
permalink,接口不返回permalinks复数字段 - 不同类型置顶项的permalink存储路径不同:消息类置顶的链接在
item.message.permalink路径,文件类置顶的链接在item.file.permalink路径
- pins.list接口返回的置顶集合是顶层复数字段
- 权限前置要求:调用接口使用的Bot Token需要开通
pins:read权限,否则接口会返回权限错误
修正后代码
function GetPinns() { const channelId = "C0XXXXXXXXX"; // GET请求参数直接拼接在URL即可 const url = `https://slack.com/api/pins.list?channel=${channelId}&pretty=1`; const options = { "method": "get", "headers": { "Authorization": "Bearer xoxb-替换为你的实际Bot Token" } }; const response = UrlFetchApp.fetch(url, options); const data = JSON.parse(response.getContentText()); // 先校验接口请求状态 if (!data.ok) { Logger.log("接口请求失败:" + data.error); return []; } const permalinks = []; // 遍历所有置顶项提取对应链接 data.items.forEach(item => { switch(item.type) { case "message": permalinks.push(item.message.permalink); break; case "file": permalinks.push(item.file.permalink); break; // 其他置顶类型可根据实际业务需求补充提取逻辑 } }); Logger.log("提取到的所有置顶链接:", permalinks); // 后续在此处添加回发消息到Slack的逻辑即可 return permalinks; }
使用提示
- 如果只需要提取频道内消息类置顶,只保留
message类型的判断分支即可 - 回发Slack时可将permalinks数组按行拼接为文本块,调用chat.postMessage接口发送即可
内容的提问来源于stack exchange,提问作者Scott Jablow
相关产品推荐
相关产品推荐

