Google apps script Google Sheets开关的范围大小不匹配
我开发了一个谷歌表单,在过去的两年中一直运行良好。现在,它突然停止工作,出现以下错误:“开关的范围大小不匹配。预期行数:1,列数:1。实际行数:Google apps script Google Sheets开关的范围大小不匹配,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我开发了一个谷歌表单,在过去的两年中一直运行良好。现在,它突然停止工作,出现以下错误:“开关的范围大小不匹配。预期行数:1,列数:1。实际行数:工作表中的行数,列数:1。” 从本质上讲,该表包含了需要在特定时间间隔(J=每天,M=每月,S=每月,a=每年)进行检查的项目列表。选中该项的用户勾选一个复选框,这会导致运行onEdit脚本,将lastChecked的日期更新到今天。 根据时间间隔,公式计算下一次检查的截止日期。此公式包含在整个列的阵列公式中 如前所述,该系统工作到几周前,在不使用Arr
工作表中的行数,列数:1。”
从本质上讲,该表包含了需要在特定时间间隔(J=每天,M=每月,S=每月,a=每年)进行检查的项目列表。选中该项的用户勾选一个复选框,这会导致运行onEdit脚本,将lastChecked的日期更新到今天。
根据时间间隔,公式计算下一次检查的截止日期。此公式包含在整个列的阵列公式中
如前所述,该系统工作到几周前,在不使用ArrayFormula时仍能工作,但我更喜欢使用ArrayFormula(用户更容易添加新行)
可提供功能副本。工作表A带有阵列公式,B没有,C/D为空,但通常遵循A/B结构
错误来自包含此公式的单元格(单元格G2):
更新时间戳的代码:
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
}
}
}
这是我的第一篇帖子,如果我忘记了任何有用的信息,请告诉我。
谢谢。 作为一个解决方案,您可能需要考虑使用代替“代码>开关())/代码>:
单元格G2公式:
=ArrayFormula(IF(E2:E="","", IFS(D2:D="A", DATE(YEAR(E2:E)+IF(C2:C="",1,C2:C),MONTH(E2:E),DAY(E2:E)), D2:D="M", DATE(YEAR(E2:E),MONTH(E2:E)+IF(C2:C="",1,C2:C),DAY(E2:E)), D2:D="S", DATE(YEAR(E2:E),MONTH(E2:E)+IF(C2:C="",6,C2:C *6),DAY(E2:E)), D2:D="J", DATE(YEAR(E2:E),MONTH(E2:E),DAY(E2:E)+IF(C2:C="",1,C2:C)))))
我没有找到你遇到这种错误的任何具体的根本原因。我怀疑这与DATE()
、SWITCH()
和ARRAYFORMULA()的组合有关
谷歌最近在数组公式上下文中对switch()
的行为进行了突破性的改变。要解决此问题,请尝试使用数组而不是文本作为case
参数,如下所示:
=arrayformula(
switch(
D2:D,
iferror(D2:D/0, "A"), eomonth(E2:E, if(C2:C, C2:C, 1) * 12 - 1) + day(E2:E),
iferror(D2:D/0, "S"), eomonth(E2:E, if(C2:C, C2:C, 1) * 6 - 1) + day(E2:E),
iferror(D2:D/0, "M"), eomonth(E2:E, if(C2:C, C2:C, 1) - 1) + day(E2:E),
iferror(D2:D/0, "J"), E2:E + if(C2:C, C2:C, 1),
iferror(1/0)
)
)
我希望这一解决方案能够在将来证明谷歌可能通过switch()
解决了switch()的潜在问题。谢谢你的回答。虽然它有效,但我很难理解为什么iferror()
会修复它,比如说,if(D2:D,“A”)
不会。您还提到了一个数组,而不是一个文字,但我看不出在您的示例中数组在哪里起作用。您能详细说明一下吗?在arrayformula()
wrapper中,iferror(D2:D/0,“A”)
将在每一行返回“A”。如果愿意,可以使用if(len(D2:D)、“A”、“A”)
或left(“A”&D2:D)
而不是iferror()
。if(D2:D,“A”)
的问题是,它将在某些行上返回“A”,而在其他行上返回FALSE
。好的,因为iferror(D2:D/0)
始终是一个错误,它将始终返回A
。但是如果(1,“A”)
不起作用,为什么?是因为它不依赖于另一个细胞吗?我并不是试图避免iferror()
,而是试图理解为什么一个可以工作而另一个不能。如果(1,“A”)
不返回数组,它将返回文本“A”
。对于大多数函数,即使在arrayformula()
wrapper中,也需要引用数组来获得数组结果。iferror()的情况也是如此。这是我的选择模式,但显然还有很多其他模式可以使用;函数本质上需要一个数组来返回数组,这是arrayformula
所必需的。谢谢你的帮助。
=arrayformula(
switch(
D2:D,
iferror(D2:D/0, "A"), eomonth(E2:E, if(C2:C, C2:C, 1) * 12 - 1) + day(E2:E),
iferror(D2:D/0, "S"), eomonth(E2:E, if(C2:C, C2:C, 1) * 6 - 1) + day(E2:E),
iferror(D2:D/0, "M"), eomonth(E2:E, if(C2:C, C2:C, 1) - 1) + day(E2:E),
iferror(D2:D/0, "J"), E2:E + if(C2:C, C2:C, 1),
iferror(1/0)
)
)