Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script Google Sheets开关的范围大小不匹配_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script Google Sheets开关的范围大小不匹配

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,列数:1。实际行数:
工作表中的行数,列数: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) 
  ) 
)