Google apps script 在图纸中创建多个导入的数组

Google apps script 在图纸中创建多个导入的数组,google-apps-script,optimization,google-sheets,Google Apps Script,Optimization,Google Sheets,我用谷歌表格为我的公司举办了一次健身挑战赛。每个团队都有自己的数据表,我有一个汇总所有数据的数据表。我的一张床单是由这条线驱动的: ={IMPORTRANGE(Constants!B11,"TeamStats!A17:N"&(16+Constants!D11)); IMPORTRANGE(Constants!B12,"TeamStats!A17:N"&(16+Constants!D12)); IMPORTRANGE(Constant

我用谷歌表格为我的公司举办了一次健身挑战赛。每个团队都有自己的数据表,我有一个汇总所有数据的数据表。我的一张床单是由这条线驱动的:

={IMPORTRANGE(Constants!B11,"TeamStats!A17:N"&(16+Constants!D11));
  IMPORTRANGE(Constants!B12,"TeamStats!A17:N"&(16+Constants!D12));
  IMPORTRANGE(Constants!B13,"TeamStats!A17:N"&(16+Constants!D13));
  IMPORTRANGE(Constants!B14,"TeamStats!A17:N"&(16+Constants!D14)); 
  IMPORTRANGE(Constants!B15,"TeamStats!A17:N"&(16+Constants!D15));
  IMPORTRANGE(Constants!B16,"TeamStats!A17:N"&(16+Constants!D16))}

这感觉真的很不雅观和笨拙,因为每次我添加一个团队时,我都需要复制+粘贴到行尾并更改到下一个数字。是否有更好的方法导入这些范围?

根据Krysztof的评论,
IMPORTRANGE
是不允许的
ARRAYFORMULA
(这实际上可以优化您的公式),因为每张纸上都可能有限制

我创建了一个应用程序脚本,如果您将其作为解决方案打开,它实际上可以为您自动更新公式:

代码:
函数onEdit(e){
如果(e.range.getColumn()==2&&e.range.getRow()>=11){
//包含常数表的电子表格的URL
var constantsURL='';
//具体访问“常量”表
var constantsSheet=SpreadsheetApp.openByUrl(constantsURL.getSheetByName)(“常量”);
//得到整张纸的最后一行
var lastRow=constantsSheet.getLastRow();
//获取从范围列B第11行到工作表最后一行的常数工作表中的所有URL
var sheetURLs=constantsSheet.getRange(“B11:B”+lastRow.getValues();
var数据=[];
forEach(函数(url,索引){
//根据B列中的数据,我们添加公式IMPORTRANGE(常量!B11,“TeamStats!A17:N”&(16+常量!D11))
//每行一次递增一个数字11
数据推送(“导入(常量!B”+(11+索引)+”,“团队统计!A17:N\”和(16+常量!D”+(11+索引)+”);
});
//将所有数据合并成公式
var formula=“={”+数据.连接(“;\n”)+“}”;
//将公式应用于要创建的特定单元格
//下面是A1的例子
电子表格app.getActiveSheet().getRange(“A1”).setFormula(公式);
}
}
样本输出:

注:
  • 每次编辑列B11及以下的值(添加、删除或编辑值)时,都会触发脚本
  • 确保在触发器下安装
    onEdit
    ,因为由于
  • 删除最后一行也将删除动态公式中的最后一个
    IMPORTRANGE
  • 您可以根据自己的条件进一步优化代码,但目前这将适用于您的情况(我假设在大多数情况下您都会追加行)

据我所知,唯一的方法是使用脚本,因为IMPORTRANGE不适用于arrayformula。请参见此处:您能否粘贴/共享a列到N列中的团队工作表示例?我想我可以演示一种优雅的方法来处理相对较小的数据集的这些问题,这听起来像是你拥有的。这是一张空白纸。
function onEdit(e) {
  if(e.range.getColumn() == 2 && e.range.getRow() >= 11){
    // URL of spreadsheet containing Constants Sheet 
    var constantsURL = '<constants spreadsheet url>';
    // Access "Constants" sheet specifically
    var constantsSheet = SpreadsheetApp.openByUrl(constantsURL).getSheetByName("Constants");
    // Get last row of whole sheet
    var lastRow = constantsSheet.getLastRow();
    // get all urls in Constants sheet from range column B row 11 until last row of the sheet
    var sheetURLs = constantsSheet.getRange("B11:B" + lastRow).getValues();
    var data = [];

    sheetURLs.forEach(function(url, index) {
      // Per data found in column B, we add the formula IMPORTRANGE(Constants!B11,"TeamStats!A17:N"&(16+Constants!D11))
      // Incrementing the numbers 11  one at a time per row
      data.push("IMPORTRANGE(Constants!B" + (11 + index) + ",\"TeamStats!A17:N\"&(16+Constants!D" + (11 + index) + "))");
    });

    // Combine all data and make into formula 
    var formula = "={" + data.join(";\n") + "}";
    // Apply the formula to a specific cell you want to
    // Below is A1 for example
    SpreadsheetApp.getActiveSheet().getRange("A1").setFormula(formula);
  }
}