[英]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);
}
}
getRange()
需要语法firstRow, firstColumn, numRows, numColumns
- 而不是firstRow, firstColumn, lastRow, lastColumn
。 您需要相应地调整范围和函数getSheetValues()
(我假设它是您基于getRange()
方法的自定义getRange()
。taskDateCell
,则应使用setValue()
而不是setValues()
arrayLength
的定义可能不正确。 通过记录它来测试它。你定义:
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();
中getActiveSheet
的const 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.