问题描述
我在Google表格中有一个自定义函数,该函数使用Range.map来检查参数是否为多单元格范围还是单值(或单单元格范围)。我是一年多以前写的,但是有一段时间没有回到这个功能了,但是今天我注意到它不起作用。 rangeVariable.map和rangeVariable.length一样返回undefined。
如果找不到它们,或者即使确认它们不再起作用,我也找不到有关将其替换为什么的文档
function FormattedEmail(displayName,Email,Separator) {
var sep = Separator == null ? ',' : Separator;
if (displayName.map && Email.map) { //Both displayName and Email are ranges
if (displayName.length != Email.length) { //displayName and Email ranges must match
已更新,其中包括来自TheMaster的信息:
作为参数传递给自定义函数的范围应作为Arrays传递,因此任何数组方法都可以使用,包括.map。但是,变量似乎不是数组,而是对象。 https://developers.google.com/apps-script/guides/sheets/functions#arguments
解决方法
自定义函数实际上并不需要Range。最好在arguments documentation
中进行解释如果您以对单元格范围的引用作为参数来调用函数(例如= DOUBLE(A1:B10)),则参数将是单元格值的二维数组。例如,在下面的屏幕截图中,Apps Script将= DOUBLE(A1:B2)中的参数解释为double([[1,3],[2,4]])。请注意,上面的DOUBLE示例代码需要进行修改以接受数组作为输入。
不太明显的是,传递单个单元格引用不会被解释为数组,而是一个单个值。试试这个:
// =isArray(B4) == false
// =isArray(B4:B5) == true
function isArray(arg) {
if (arg.map) {
return true;
}
return false;
}
因此,在您的自定义函数中,如果DisplayName
或Email
都是 not 数组,则不会超出第一个if语句。这可能是该功能不适用于您的原因:您输入的一个或多个无效。您应该可以在您的函数中解决该问题。
我认为通过调用DisplayName.map
,您实际上是在尝试检查DisplayName
是否为数组。之所以可行,是因为在没有该方法(例如字符串)的对象上调用map
会返回undefined
。但是最好更加明确,并使用Array.isArray()
。
function FormattedEmail(DisplayName,Email,Separator) {
var sep = Separator == null ? ',' : Separator;
if (Array.isArray(DisplayName) && Array.isArray(Email)) {
if (DisplayName.length != Email.length) {