【问题标题】:Google App Script - Function Returning UndefinedGoogle App 脚本 - 返回未定义的函数
【发布时间】:2018-07-27 23:12:03
【问题描述】:

当给定 Slack 工作区和频道名称时,我正在尝试调用一个获取频道 ID 的函数。我可以在函数中得到正确的结果,但是当我尝试在其他地方调用该函数时,它返回未定义。

获取频道ID的函数`

//GET CHANNEL ID FROM LIST OF ALL CHANNELS IN WORKSPACE
function getChannelID(workspaceName, pageLimit, channelName, nextCursor){
  var channelListResponseURL = 'https://slack.com/api/conversations.list';
  var payload = {
      'limit': pageLimit,
      'types': 'public_channel, private_channel',
      'cursor' : nextCursor
    };
  var options = createURLargs(workspaceName, payload);
  var channelListResponse = UrlFetchApp.fetch(channelListResponseURL, options);
  var channelListJson = channelListResponse.getContentText();
  var channelListData = JSON.parse(channelListJson);
  
  //iterate through each channel in the returned JSON object and sets the channel ID for the one matching the channelName
    for (var i in channelListData.channels){
      if(channelListData.channels[i].name == channelName){
        var channelID = channelListData.channels[i].id;
        Logger.log('FOUND CHANNEL ID: '+ channelID);
        return channelID;// IF CHANNEL ID FOUND, THEN EXIT getChannelID FUNCTION AND RETURN CHANNEL ID
      }
    }
      // IF NO CHANNEL ID IS FOUND, THEN CHECK TO SEE IF PAGINATION IS IN EFFECT, UPDATE CURSOR, AND RERUN getChannelID FUNCTION
      if (channelListData.response_metadata.next_cursor && channelListData.response_metadata.next_cursor != ""){
        nextCursor = channelListData.response_metadata.next_cursor;
        getChannelID(workspaceName, pageLimit, channelName, nextCursor);
      } else { 
        // IF CHANNEL PAGINATION IS NOT IN EFFECT, OR REACHED LAST PAGE AND NO RESULT IS FOUND
        return 'No Channel Found in Workspace';
      }
}
`

我可以清楚地看到记录器中的“FOUND CHANNEL ID: CXXXXXX”字符串,所以我确定它正确地找到了它。

但是当我从主函数调用这个 getChannelID 时,它返回 undefined。

  var channelID = getChannelID(workspaceName, pagLimit, channelName, nextCursor);
  Logger.log(channelID);

奇怪的是,当来自 Slack 的 JSON 对象没有分页时,这似乎可以工作,但是当结果分页返回时,我似乎只是未定义。

任何想法为什么它返回的结果是未定义的,即使它在函数中工作?

【问题讨论】:

  • 只是扫描它,我看到 pageLimit 在主函数调用中拼写为 pagLimit,这个参数会不会把东西扔掉?
  • 感谢您的回复,但不,不是这样。我有几个页面限制变量,所以虽然有点混乱,但它的定义是正确的。

标签: javascript google-apps-script slack-api


【解决方案1】:

我认为在你的递归函数中,没有返回值。那么这个修改怎么样呢?

发件人:

if (channelListData.response_metadata.next_cursor && channelListData.response_metadata.next_cursor != ""){
  nextCursor = channelListData.response_metadata.next_cursor;
  getChannelID(workspaceName, pageLimit, channelName, nextCursor);
} else { 
  // IF CHANNEL PAGINATION IS NOT IN EFFECT, OR REACHED LAST PAGE AND NO RESULT IS FOUND
  return 'No Channel Found in Workspace';
}

收件人:

if (channelListData.response_metadata.next_cursor && channelListData.response_metadata.next_cursor != ""){
  nextCursor = channelListData.response_metadata.next_cursor;
  return getChannelID(workspaceName, pageLimit, channelName, nextCursor); // Modified
} else { 
  // IF CHANNEL PAGINATION IS NOT IN EFFECT, OR REACHED LAST PAGE AND NO RESULT IS FOUND
  return 'No Channel Found in Workspace';
}

注意:

  • channelListData.response_metadata.next_cursor && channelListData.response_metadata.next_cursor != "" 为真时,不返回任何值。所以我加了return

如果这还不起作用,请告诉我。我想修改它。

补充:

在我的理解中,当递归函数运行时,进程返回到运行的那一行。为了确认这一点,我准备了 3 个示例函数。

功能一
function foo1(value) {
  if (value == "") {
    foo1("bar");
  } else {
    return "ok";
  }
}
功能二
function foo2(value) {
  if (value == "") {
    return foo2("bar");
  } else {
    return "ok";
  }
}
功能 3
function foo3(value) {
  if (value == "") {
    foo3("bar");
  }
  return "ok";
}

当这些函数按如下方式运行时,

var res1 = foo1("");
var res2 = foo2("");
var res3 = foo3("");

res1res2res3 分别是 undefinedokok

【讨论】:

  • 这似乎行得通!谢谢!但我不知道为什么。为什么一旦工作空间名称匹配并返回 channelID,它就没有完全退出 getChannelID 函数?如果设置了 channelID,并且下一个命令是返回该 channelID,为什么它返回 undefined?
  • @Dan 感谢您的回复。我很高兴你的问题得到了解决。但我真的很抱歉我的回答不完整。我添加了一个示例脚本。如果这不是您想要的,我很抱歉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多