Google apps script 使用google脚本更新gsheets公式范围

Google apps script 使用google脚本更新gsheets公式范围,google-apps-script,Google Apps Script,这篇文章最初发布在谷歌的产品论坛上,但并没有得到太多的关注。我试图找到一个脚本(或者公式方法,如果可能的话),它可以通过一些动作或者按钮来更新公式范围 我创建了一个电子表格来说明 在这张表中,我在报告选项卡、单元格C3中有一个查询公式,如下所示: =query({'20Feb'!$A:$C;'21Feb'!$A:$C},"select Col3 where Col2 = '" & $B3 & "' ",0) 我想更新以下内容: '20Feb'!$A:$C;'21Feb'!$A:

这篇文章最初发布在谷歌的产品论坛上,但并没有得到太多的关注。我试图找到一个脚本(或者公式方法,如果可能的话),它可以通过一些动作或者按钮来更新公式范围

我创建了一个电子表格来说明

在这张表中,我在
报告选项卡
、单元格
C3
中有一个查询公式,如下所示:

=query({'20Feb'!$A:$C;'21Feb'!$A:$C},"select Col3 where Col2 = '" & $B3 & "' ",0)
我想更新以下内容:

'20Feb'!$A:$C;'21Feb'!$A:$C
要么通过脚本,要么通过一些公式(我尝试了间接,但没有成功,不喜欢多个选项卡)

这里的想法是,我可以添加带有日期范围的新选项卡,然后按一个按钮运行一个脚本,该脚本将对其进行更新,以包含用于报告目的的新选项卡。然后,输出将是:

=query({'19Feb'!$A:$C;'20Feb'!$A:$C;'21Feb'!$A:$C},"select Col3 where Col2 = '" & $B3 & "' ",0)
在一个完美的世界里,我可以为脚本提供一个单元格输入,这样一个单独的“脚本更新”选项卡可能会有一个地方,我可以完整地
'19Feb'写出新的范围$A:$C;'2月20日$A:$C;'2月21日$A:$C
,将其粘贴到
A1
,并告诉脚本“更新到当前工作表单元格
A1
中的任何内容”


如果太多细节,我很抱歉。谢谢你的帮助!一个人确实发布了一个脚本,该脚本将任何文本范围复制到一个新范围,但并不专门处理公式。如果有帮助的话,我可以把它放在这里。

您需要在公式中使用转义符号,但这样就可以了:

var nameReportSheet = "Report";
var targetCellNotationForQuery = "C3";

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu("Generate Formula")
    .addItem("Generate Formule","generateFormula")
    .addToUi();
}

function generateFormula() {
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
  var formula = "=query({<DATA>},\"select Col3 where Col2 = '\" & $B3 & \"' \",0)";
  var data = [];
  sheets.forEach(function(sheet) {
    if(!new RegExp(nameReportSheet,"i").test(sheet.getName()))
      data.push("'" + sheet.getName() + "'!$A:$C");
  });
  var newFormula = formula.replace("<DATA>",data.join(";"));
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName(nameReportSheet).getRange(targetCellNotationForQuery).setValue(newFormula);
}
var namereptsheet=“报告”;
var targetCellNotationForQuery=“C3”;
函数onOpen(){
var ui=SpreadsheetApp.getUi();
ui.createMenu(“生成公式”)
.addItem(“生成公式”、“生成公式”)
.addToUi();
}
函数generateFormula(){
var sheets=SpreadsheetApp.getActiveSpreadsheet().getSheets();
var formula=“=query({},\”选择Col3,其中Col2='\''和$B3&\'\'',0)”;
var数据=[];
表.forEach(功能(表){
if(!new RegExp(namereptsheet,“i”).test(sheet.getName())
data.push(“'”+sheet.getName()+“!$A:$C”);
});
var newFormula=formula.replace(“,data.join(;”);
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(nameReportSheet).getRange(targetCellNotationForQuery).setValue(newFormula);
}

公式的关键部分似乎是两部分,分别是月日和月:
20Feb
21Feb
您可以在JavaScript中使用字符串公式连接字符串的多个部分。然后使用范围的
setFormula()
方法插入公式<代码>txt1+“”+txt2这太棒了!比我想象的要精简得多!非常感谢你!如果您有时间,请快速跟进,但我可能可以玩它,并将继续这样做:是否有方法删除目标单元格/工作表,并使其在看到范围的任何地方更新它们?这可能不是最有效的方法,但在电子表格中,我有许多查询函数,它们略有不同。我在D列中添加了一个示例进行说明。如果无法完成,我将尝试重新编写工作表以减少脚本版本。这是可能的。如果只需要两个,可以复制我的脚本并更改每个函数的targetCellNotationForQuery(使其成为函数generateFormula中的局部变量,然后复制此函数generateFormula)。如果您需要10+个,最好编写代码!顺便说一句,复制公式,然后用C3替换B3,然后用D3,等等可能更方便(你可以用javascipt的替换函数,甚至用文本编辑器来做),明白了吗?我可以让它为我工作。再次感谢你!