繁体   English   中英

Google Apps 脚本中的范围长度

[英]Range Length in Google Apps Script

我想运行一个脚本,将工作表数据复制到主工作表(附加我的所有工作表)。 复制和粘贴的第一部分正在工作,但我想添加一个列来告诉我原始工作表的名称。 我为它写了一个循环,但是当我执行脚本时什么也没发生(只有复制和粘贴)。 这是我的全部代码:

function appendSheet() {
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var sh = ss.getActiveSheet();
   var reportLastRow = sh.getLastRow()
   var reportLastColumn = sh.getLastColumn()
   var reportData = sh.getSheetValues(3,1,reportLastRow,reportLastColumn);
   var recordsSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("2020 Data");
   var lastRow = recordsSheet.getLastRow();
   //var recordLastRow = sh.getLastRow();
   var recordLastColumn = recordsSheet.getLastColumn();
   var reportSheetName = sh.getSheetName();
   recordsSheet.getRange(lastRow + 1,1,reportLastRow,reportLastColumn).setValues(reportData);
   var arrayLength = (lastRow - reportData.length);
   for (var i =  0 ; i <= arrayLength ; i ++) {
      var taskDateCell = recordsSheet.getRange(arrayLength - i, recordLastColumn);
      taskDateCell.setValues(reportSheetName);
   }
}

你的代码有几个问题你应该解决

  1. 请注意,方法getRange()需要语法firstRow, firstColumn, numRows, numColumns - 而不是firstRow, firstColumn, lastRow, lastColumn 您需要相应地调整范围和函数getSheetValues() (我假设它是您基于getRange()方法的自定义getRange()
  2. 如果一次为一个单元格taskDateCell ,则应使用setValue()而不是setValues()
  3. 看来您对arrayLength的定义可能不正确。 通过记录它来测试它。
  4. 你的主要问题:

你定义:

for (var i = arrayLength ; i < arrayLength ; i ++)

换句话说:

i设置为arrayLength并在i小于arrayLength进行迭代。

这个条件永远不会满足,因此迭代次数将为零。

作为一般建议:在您的代码中实现许多日志 - 以可视化重要值,例如范围符号和数组长度,或循环中的计数器变量 - 这将帮助您更快地找到错误。

解释:

  • 首先我优化了你的代码。 您有不必要的代码行,这使您的代码难以理解,而且速度也很慢。 优化包括将行数减少到最少,定义const变量,使变量名称更具描述性,最后通过用更有效的方法替换它来摆脱 for 循环。

  • 另一个更正将在这一行: sh.getSheetValues(3,1,reportLastRow,reportLastColumn); 在这里,您是从第三行开始的,但多了两行; reportLastRow是您想要获得的行数,但由于您是从第三行开始,您需要扣除2

  • 要回答您的问题,解决您的问题的一种方法是将报告的名称设置为记录表的最后一列,您在该列中输入了报告表中的数据。 由于您想向每一行添加相同的值(工作表名称),您可以选择一个二维范围,但使用setValue

  • 我不是const report_sh = ss.getActiveSheet();getActiveSheetconst report_sh = ss.getActiveSheet(); 因为这一行假设您已在UI选择了所需的工作表(报告工作表)。 请小心,否则将该行更改为类似的内容:

    const report_sh = ss.getSheetByName('report sheet');

    当然,将'report sheet'调整为要附加的工作表的名称。

解决方案:

function appendSheet() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const records_sh = ss.getSheetByName("2020 Data");
const report_sh = ss.getActiveSheet();
const reportData = report_sh.getSheetValues(3,1,report_sh.getLastRow()-2,report_sh.getLastColumn());
const records_lr = records_sh.getLastRow();
records_sh.getRange(records_lr+1,1,reportData.length,reportData[0].length).setValues(reportData);
SpreadsheetApp.flush();
records_sh.getRange(records_lr+1,records_sh.getLastColumn()+1,reportData.length,1).setValue(report_sh.getSheetName());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM