【发布时间】:2021-07-17 19:18:15
【问题描述】:
我开发了一个在过去 2 年中运行良好的 Google 表格。现在,它突然停止运行,提供以下错误:“SWITCH 的范围大小不匹配。预期的行数:1,列数:1。实际行数:number_of_rows_in_sheet,列数:1。”
基本上,该工作表包含需要以特定时间间隔检查的项目列表(J=每天,M=每月,S=每学期,A=每年)。检查项目的用户勾选一个复选框,这会导致 onEdit 脚本运行,将 lastChecked 的日期更新为今天。 根据间隔,公式计算 nextCheck 的截止日期。此公式在整个列的 ArrayFormula 中。
如前所述,系统直到几周前都可以正常工作,并且在不使用 ArrayFormula 时仍然可以正常工作,但我更喜欢使用 ArrayFormula(用户更容易添加新行)。
功能副本可用here。工作表 A 有 ArrayFormula,B 没有,C/D 为空,但通常遵循 A/B 结构。
错误来自包含此公式的单元格(单元格 G2):
=ArrayFormula(IF(E2:E="","", SWITCH(D2:D, "A", DATE(YEAR(E2:E)+IF(C2:C="",1,C2:C),MONTH(E2:E),DAY(E2:E)), "M", DATE(YEAR(E2:E),MONTH(E2:E)+IF(C2:C="",1,C2:C),DAY(E2:E)), "S", DATE(YEAR(E2:E),MONTH(E2:E)+IF(C2:C="",6,C2:C *6),DAY(E2:E)), "J", DATE(YEAR(E2:E),MONTH(E2:E),DAY(E2:E)+IF(C2:C="",1,C2:C)),"","")))
更新时间戳的代码:
function onEdit(e) { //On edit...
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const changedCell = e.range; //Saves the range of the modified cell.
const sheetName = sheet.getName();
const sheetsToWatch = ['A', 'B', 'C', 'D'];
if (sheetsToWatch.includes(sheetName)) {
if(changedCell.getColumn() === 6 && changedCell.isChecked()) { //If cell is in col 6 (F) and checked
let newDateRange = sheet.getRange(changedCell.getRow(), 5);
newDateRange.setValue(new Date()); //Set the current timestamp in column 5 (E) at the same row as modified cell
changedCell.uncheck(); //Remove checkmark from modified cell
}
}
}
这是我的第一篇文章,如果我忘记了任何有用的信息,请告诉我。 提前致谢。
【问题讨论】:
标签: google-apps-script google-sheets