Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.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
Google sheets 我如何执行一个我';我们使用TextJoin构建_Google Sheets_Google Sheets Formula - Fatal编程技术网

Google sheets 我如何执行一个我';我们使用TextJoin构建

Google sheets 我如何执行一个我';我们使用TextJoin构建,google-sheets,google-sheets-formula,Google Sheets,Google Sheets Formula,我正在构建一个函数——一个从多个工作表中过滤数据的数组公式。它是使用TextJoin(或Concatenate,没关系)构建的,这样我可以在添加更多工作表时动态更改范围。 为了执行这个函数,我复制公式,转到一个单元格,按“=”+粘贴+回车,它将被执行 我的问题是如何自动执行它。我想也许我可以用间接的,但不知道怎么做。 例如,我建立的公式是: arrayformula(filter({Sheet2!A2:H;Sheet3!A2:H;Sheet4!A2:H},len({Sheet2!A2:A;She

我正在构建一个函数——一个从多个工作表中过滤数据的数组公式。它是使用TextJoin(或Concatenate,没关系)构建的,这样我可以在添加更多工作表时动态更改范围。 为了执行这个函数,我复制公式,转到一个单元格,按“=”+粘贴+回车,它将被执行

我的问题是如何自动执行它。我想也许我可以用间接的,但不知道怎么做。 例如,我建立的公式是:

arrayformula(filter({Sheet2!A2:H;Sheet3!A2:H;Sheet4!A2:H},len({Sheet2!A2:A;Sheet3!A2:A;Sheet4!A2:A})))
在此电子表格中有一个示例:

  • 单元格A3和A4是文本连接函数,用于动态创建范围
  • 单元格A1连接A3+A4以创建函数
  • 单元格A9是我通过按“=”+粘贴+回车来执行它的位置
据我所知,这是不可能的 但是有一个解决方法(或者更好的方法,取决于你如何看待它)

没有专门针对公式的
间接
,但是:

变通办法 功能存在于:

你不需要太多的应用程序脚本就可以让它按照你想象的方式工作,脚本可以帮助你开始工作

我还建议采用这种方法,因为一旦涉及到更复杂的领域,公式将很快受到限制,而且维护和修改也将非常容易。您还可以从更长的执行时间中获得额外的好处

示例脚本
函数createFormula(){
//初始化电子表格文件和工作表的变量
让file=SpreadsheetApp.getActive();
let sheet=file.getSheetByName(“Sheet1”);
//这是表示要过滤的图纸的范围
let sheetStopProcessRange=sheet.getRange(“C2:C”);
设SheetStopProcess=SheetStopProcessRange.getValues();
//把空的过滤掉
SheetStopProcess=SheetStopProcess.filter(行=>行[0])
//目前它是一个二维阵列
//[“表1”],[“表2”],[“表3”]]
//这会将其更改为1D数组(只是为了使代码更易于阅读)
//[“表1”、“表2”、“表3”]
SheetStopProcess=SheetStopProcess.map(行=>行[0])
//初始化数组符号字符串
让filterArrayString=“{”;
让lenArrayString=“{”
//对于阵列中的每个工作表,将SheetX!范围添加到字符串中
SheetStopProcess.forEach(sheetName=>{
filterArrayString+=`${sheetName}!A2:H`
lenArrayString+=`${sheetName}!A2:A`
})
//删除尾随分号
filterArrayString=filterArrayString.slice(0,filterArrayString.length-1)
lenArrayString=lenArrayString.slice(0,lenArrayString.length-1)
//加上最后一个括号
filterArrayString+=“}”
lenArrayString+=“}”
//构造整个公式字符串
让formulaString=`=arrayformula(过滤器(${filterArrayString},len(${lenArrayString})))`
//选择单元格并将其设置为公式
设formulaCell=sheet.getRange(“A9”)
setFormula(公式字符串)
}
从脚本编辑器运行此操作将在
Sheet1
的单元格
A9
中插入所需公式

我使用了JavaScript的一些更高级的特性来简洁地实现这一点,但您不必这样做

您已经知道如何用公式构造大多数公式。因此,您可以有一个脚本,它只获取这个值,因此将大大缩短脚本

函数createFormulaSimplified(){
//初始化变量
让file=SpreadsheetApp.getActive();
let sheet=file.getSheetByName(“Sheet1”);
//已经构建的公式所在的范围
设formulaCell=sheet.getRange(“A1”)
让formulaString=formulaCell.getValue()
//构建和设置公式
让formulaString=“=”+formulaString
设formulaCell=sheet.getRange(“A9”)
setFormula(公式字符串)
}
实际上,这与上面的公式所做的事情相同,但脚本所做的工作较少。基本上,它所做的唯一事情就是获取您已经构建的公式,在开始处添加一个
=
,并将其分配给单元格
A9

当然,您也可以完成公式在应用程序脚本中所做的所有工作,但这是另一个问题的另一个答案

工具书类

Tom,随着时间的推移,您可能希望在这个公式中实际包含的最大独立工作表数量是多少?嗨,Erik,我有大约100张工作表正在计数。首先,每当有人告诉我他们有数百张(甚至几十张)工作表进入一个仪表板时,我的第一个想法是“这听起来像是一个可能的数据设计缺陷。”当然,我不知道你们的具体制度。但在我数十年的超级复杂系统开发经验中,我从未见过一个系统需要将这么多单独的工作表输入到一个仪表板工作表中。也就是说,虽然可以编写一个公式来自动完成这项工作,但它会很麻烦,使脚本成为您的最佳选择。为了其他人的利益,我还建议您将真实世界的参数添加到帖子本身。例如,在你的主要帖子中加上“我有100张床单,正在数。”还有。。。每个工作表中您真正要合并多少列?每张纸最多可以有多少行?这些问题对解决方案很重要,10张纸x 100行x 2列的问题与100张纸x 1000行x 12列的问题会有很大的不同。有关如何设置自动公式的示例,请参见您的示例电子表格(两个高亮显示的绿色选项卡,新添加的:“Erik Help”和“Range_sheets”)(尽管我不能强调我不会这样做,因为这样做既没有效率也没有必要)。谢谢,脚本是一个不错的选择,但我很好奇它是否是在一个简单的公式内完成的。在任何情况下,公式都会起到“重大作用”,所以只需几秒钟(键入“=”并粘贴).我发这个主要是出于好奇。谢谢
formulaCell.setFormula(formulaString)