在Google表格

时间:2016-02-19 16:38:26

标签: google-apps-script google-sheets

tl; dr :如何将两个范围显示为一个作为函数的参数?例如,我想查看E 列中的每个单元格,除了 E5:
=MY_FUNCTION( somehowjoin( E1:E4, E6:E ) )

背景
我正在Google表格中编写项目跟踪器,例如Microsoft Project。我有一个custom function in Google Sheets,允许我通过查看它所依赖的所有任务的最大结束日期来计算各种任务的开始日期:

=MAX_LOOKUP( G9, A:A, I:I )

但是,此任务的结束日期将根据开始日期计算,该结束日期位于包含所有检查结束日期的列中。结果,我有一个循环依赖。 enter image description here

所以,我想为每一行编写我的公式来跳过当前行,例如:

=MAX_LOOKUP( G9, A1:A8 + A10:A, I1:I8 + I10:I )

FWIW我当前的解决方法是重写自定义函数的签名,如下所示:

=MAX_LOOKUP_SKIPROW( G9, ROW(), "A", "I" )

并使用以下方法手动构建该函数中的两个范围:

var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var keys1 = sheet.getRange(keyCol+"1:"+keyCol+(skipRow-1)).getValues();
var vals1 = sheet.getRange(valCol+"1:"+valCol+(skipRow-1)).getValues();

var keys2 = sheet.getRange(keyCol+(skipRow+1)+":"+keyCol).getValues();
var vals2 = sheet.getRange(valCol+(skipRow+1)+":"+valCol).getValues();

这是一个功能性解决方案,但使功能更加特殊。我不认为这是加入范围的这个更一般的问题的“答案”。

3 个答案:

答案 0 :(得分:3)

简短回答

创建自己的数组并将其用作自定义函数的参数。

解释

在Google表格中,用户可以通过括号中的元素来创建自己的数组。

而不是

=MY_FUNCTION( somehowjoin( E1:E4, E6:E ) )

使用

=MY_FUNCTION({E1:E4;E6:E})

参考

Using arrays in Google Sheets - Google docs editors Help

答案 1 :(得分:1)

我并不完全明白你想要做什么,但这可能会有所帮助。您可以加入以下范围。前两个将数据返回到行或列。我包括这些只是为了你可以看到发生了什么。我在测试中使用的第三个是确保数据可以发送到自定义公式。我希望这会有所帮助:

=split(join(",",A2:A6,A8:A12),",",true)

=transpose(split(join(",",A2:A6,A8:A12),",",true))

=MAX_LOOKUP( G9,  split(join(",",A1:A8,A10:A),",",true),split(join(",",I1:I8,I10:I),",",true) )

答案 2 :(得分:0)

将范围传递给Google表格中的自定义函数时,该范围以数组数组形式出现。这是一个真正的数组,只要Array.isArray()返回true

有了这些知识,您可以创建自己的自定义功能:

function UNION(range1,range2){
  return range1.concat(range2);
}

然后简单地说:

=MY_FUNCTION( UNION( E1:E4, E6:E ) )

...并且您的原始函数将不知道它是在已合并的不连续范围上运行。