Google apps script 如何让应用程序脚本在值的数量可以更改的范围内循环

Google apps script 如何让应用程序脚本在值的数量可以更改的范围内循环,google-apps-script,Google Apps Script,我已经建立了一个相当基本的工作表,根据下拉列表中选择的班次和姓名,将绩效数据从中心文件读取到预格式化的文档中,为多个工作班次的操作员生成月度审查表 我的意图是,一旦我选择了一个班次,我的脚本就会通过下拉列表中的特工姓名进行迭代,并为每个特工吐出一份完整的回顾表 我在这方面做得最好,因为我能够使用下面的脚本拼凑在一起,该脚本正在运行操作名称,仅将整个表值复制/粘贴到临时表中,以去除公式,然后将临时工作表复制到新制作的月度文件中,并将复制的工作表重命名为工作名称 我唯一的问题是,操作名称的命名范围设

我已经建立了一个相当基本的工作表,根据下拉列表中选择的班次和姓名,将绩效数据从中心文件读取到预格式化的文档中,为多个工作班次的操作员生成月度审查表

我的意图是,一旦我选择了一个班次,我的脚本就会通过下拉列表中的特工姓名进行迭代,并为每个特工吐出一份完整的回顾表

我在这方面做得最好,因为我能够使用下面的脚本拼凑在一起,该脚本正在运行操作名称,仅将整个表值复制/粘贴到临时表中,以去除公式,然后将临时工作表复制到新制作的月度文件中,并将复制的工作表重命名为工作名称

我唯一的问题是,操作名称的命名范围设置为范围!B2:B151,但实际名称列表可能仅为前20-30个单元格,具体取决于所选班次的操作员数量。因此,当脚本命中名称列表末尾的第一个空白值时,脚本失败

有人能建议一个调整,以考虑到不同长度的下拉列表请。我肯定我错过了一些对那些更有经验的人来说相当明显的东西。我尝试过搜索,但是在不知道我的术语的情况下,我看不见树木

function loopExport() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName('Report');
  var month = sheet.getRange('N6:Q6').getValue();
  var shift = sheet.getRange('B6:C6').getDisplayValue();
  var data = ss.getSheetByName('Ranges').getRange('Names').getValues();
  var ssnewname = "Operative Reviews - "+shift+" - "+month;
  var ssnew = SpreadsheetApp.create(ssnewname);
  var tempsheet = ss.getSheetByName('TempCopy');

  // Get dropdown values from named range Names
  for (var i = 0; i < data.length; i++) {
    // Assign dropdown values in Report
    sheet.getRange('E6:G6').setValue(data[i][0]);
    // For each name, copy & paste values-only into temp sheet
    sheet.getRange('A1:Q52').copyTo(tempsheet.getRange("A1"),{contentsOnly:true});
    var opname = tempsheet.getRange('E6:G6').getValue();
    // For each name, copy temp sheet to new workbook ssnew and set name to operative name
    tempsheet.copyTo(ssnew).setName(opname);
  }
}
函数loopExport(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getSheetByName(“报告”);
var month=sheet.getRange('N6:Q6').getValue();
var shift=sheet.getRange('B6:C6').getDisplayValue();
var data=ss.getSheetByName('Ranges').getRange('Names').getValues();
var ssnewname=“操作审查-”+班次+“-”+月份;
var ssnew=SpreadsheetApp.create(ssnewname);
var tempsheet=ss.getSheetByName('TempCopy');
//从命名范围名称中获取下拉列表值
对于(变量i=0;i
试试这个:

function loopExport() {
  var ss=SpreadsheetApp.getActive();
  var sheet=ss.getSheetByName('Report');
  var month=sheet.getRange('N6:Q6').getValue();
  var shift=sheet.getRange('B6:C6').getDisplayValue();
  var data=ss.getRangeByName('Names').getValues();
  var ssnewname="Operative Reviews - "+shift+" - "+month;
  var ssnew=SpreadsheetApp.create(ssnewname);
  var tempsheet=ss.getSheetByName('TempCopy');
  for (var i=0; i < data.length; i++) {
    if(data[i][0]) {
      sheet.getRange('E6:G6').setValue(data[i][0]);
      sheet.getRange('A1:Q52').copyTo(tempsheet.getRange("A1"),{contentsOnly:true});
      var opname=tempsheet.getRange('E6:G6').getValue();
      tempsheet.copyTo(ssnew).setName(opname);
    }
  }
}
函数loopExport(){
var ss=SpreadsheetApp.getActive();
var sheet=ss.getSheetByName(“报告”);
var month=sheet.getRange('N6:Q6').getValue();
var shift=sheet.getRange('B6:C6').getDisplayValue();
var data=ss.getRangeByName('Names').getValues();
var ssnewname=“操作审查-”+班次+“-”+月份;
var ssnew=SpreadsheetApp.create(ssnewname);
var tempsheet=ss.getSheetByName('TempCopy');
对于(变量i=0;i
您能否与一些虚拟数据共享电子表格?通过这种方式,可以更容易地将问题可视化,然后为您提供帮助。这对于循环和导出非常有效,非常感谢。不可预见的问题是,它的循环和复制速度如此之快,以至于vlookups无法及时刷新,所以导出副本上的每个人的数据都是为列表中他们后面的人准备的。我如何在循环中添加一个很短的延迟来解释recalcs?下面的虚拟链接。在数据源工作表中删除链接工作表并粘贴常规值(通常来自导入)。出于类似的原因,此虚拟对象仅在选择“Lates”作为班次时工作,因为更改班次时名称列表不会重新填充。虚拟工作表:尝试在循环中使用电子表格应用程序flash,它会减慢所有速度,但会强制电子表格完成所有计算并显示