Javascript 在递归函数中正确处理二维值数组
我正在应用程序脚本中实现一个自定义函数 为了允许该函数在Google Sheets中用作数组公式,我使用以下函数模板: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
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
- 我删除了日志记录语句以使示例更简洁,但最好记录错误条件和/或返回调用错误的字符串,而不是空字符串
- 变量的名称是不相关的(即,
vsinput
)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;
}