Google Apps Script调用Asana Events API始终返回无效同步令牌
问题根源
你的代码核心问题在于:Asana Events API要求sync作为URL查询参数传递,但你错误地将其放在了UrlFetchApp的options对象中。Google Apps Script的UrlFetchApp.fetch不会自动把options里的自定义属性(比如sync)转换为URL的查询参数,导致实际请求中并没有正确携带sync参数,因此API返回令牌无效。
修复代码
修改asanaEventCall函数,将sync参数拼接到URL末尾作为查询参数:
function asanaEventCall() { var syncToken = userProps.getProperty('syncToken'); // 把sync参数拼接到URL的查询字符串中 var url = asanaBaseUrl + '/projects/' + asanaProject + '/events?sync=' + encodeURIComponent(syncToken); var headers = { 'Authorization': 'Bearer ' + asanaPAT }; var options = { 'method': 'GET', 'headers': headers, 'muteHttpExceptions': true }; var r = UrlFetchApp.fetch(url, options); var data = JSON.parse(r.getContentText()); // 每次调用后更新同步令牌,用于下一次请求 if (data.sync) { userProps.setProperty('syncToken', data.sync); } return data; }
额外注意事项
- 使用
encodeURIComponent()对syncToken编码,避免令牌中的特殊字符导致URL解析失败。 - 初始调用
getSyncToken的逻辑是正确的:即使API返回"invalid token"错误,返回的data.sync是有效的初始同步令牌,可以正常用于后续请求。 - 每次调用成功后必须更新存储的同步令牌,确保下一次请求使用最新的令牌。
内容的提问来源于stack exchange,提问作者Carcharodon
相关产品推荐
相关产品推荐

