Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在递归函数中正确处理二维值数组_Javascript_Google Apps Script_Google Sheets - Fatal编程技术网

Javascript 在递归函数中正确处理二维值数组

Javascript 在递归函数中正确处理二维值数组,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我正在应用程序脚本中实现一个自定义函数 为了允许该函数在Google Sheets中用作数组公式,我使用以下函数模板: function myfunction(input) { if (input.map) { // Test whether input is an array. return input.map(myfunction); // Recurse over array if so. } else { // Handle indi

我正在应用程序脚本中实现一个自定义函数

为了允许该函数在Google Sheets中用作数组公式,我使用以下函数模板:

function myfunction(input) {
  if (input.map) {                // Test whether input is an array.
    return input.map(myfunction); // Recurse over array if so.
  } else {
    // Handle individual values here...
  }
}
这样做允许自定义函数以二维数组的形式接受一个范围作为输入,然后返回一个可以溢出到相应单元格中的二维数组

然而,对于下面的代码,我没有使用“输入”,我使用的是“url”,我相信这是我问题的根源。我生成错误:
属性没有提供值:url(第5行)


我该怎么做才能解决这个问题?

我怀疑您没有正确处理无效URL的值。假设脚本没有更多内容,第5行包含
UrlFetchApp.fetch()
调用,我认为这是错误的根源

在调用
UrlFetchApp.fetch()
之前和期间,您应该执行额外的错误检查。下面是一个经过修改的实现,演示了我的建议:

function getRedirect(url) {
  if (url.map) {
    return url.map(getRedirect);
  }

  // Return an empty string if url contains a non-string value or an empty string.
  if (typeof url != 'string' || url == '') {
    return '';
  }

  // Enclose the UrlFetchApp.fetch() call in a try/catch() block...
  try {
    var response = UrlFetchApp.fetch(url, {
        'followRedirects': false,
        'muteHttpExceptions': false
    });
  } catch(e) {
    // And return an empty string if the call fails
    // (e.g. if provided a non-empty, non-URL string).
    return '';
  }

  var redirectUrl = response.getHeaders()['Location'];
  var responseCode = response.getResponseCode();
  if (redirectUrl) {
    var nextRedirectUrl = getRedirect(redirectUrl);
    return nextRedirectUrl;
  }
  return url;
}
请注意:

  • 在执行
    try
    /
    catch
    块之前,执行尽可能多的错误检查。在调用
    UrlFetchApp.fetch()
    之前处理无效输入要快得多。调用
    fetch
    方法并等待它失败可能会花费明显更长的时间,尤其是在处理大范围数据时
  • 我删除了日志记录语句以使示例更简洁,但最好记录错误条件和/或返回调用错误的字符串,而不是空字符串
  • 变量的名称是不相关的(即,
    input
    vs
    url
  • 我删除了多余的
    else
    块,因为
    return
    语句无论如何都会结束函数的执行

我无法理解
我没有使用“输入”我使用的是“url”
。那么你能提供一个电子表格样本吗?如果您想使用
getRedirect()
作为自定义函数,还可以提供您测试的公式吗?非常感谢chuckx,感谢您不仅帮助我解决了这个问题,而且非常清楚地解释了所有问题,我非常感谢您的帮助。
function getRedirect(url) {
  if (url.map) {
    return url.map(getRedirect);
  }

  // Return an empty string if url contains a non-string value or an empty string.
  if (typeof url != 'string' || url == '') {
    return '';
  }

  // Enclose the UrlFetchApp.fetch() call in a try/catch() block...
  try {
    var response = UrlFetchApp.fetch(url, {
        'followRedirects': false,
        'muteHttpExceptions': false
    });
  } catch(e) {
    // And return an empty string if the call fails
    // (e.g. if provided a non-empty, non-URL string).
    return '';
  }

  var redirectUrl = response.getHeaders()['Location'];
  var responseCode = response.getResponseCode();
  if (redirectUrl) {
    var nextRedirectUrl = getRedirect(redirectUrl);
    return nextRedirectUrl;
  }
  return url;
}