【问题标题】:Error when running onEdit(e) to fire for specific sheet range运行 onEdit(e) 以针对特定工作表范围触发时出错
【发布时间】:2019-03-08 09:13:19
【问题描述】:

我需要将函数 onEdit() 限制为仅在特定范围内进行更改时触发。用户在 B 列中选择一个值,A 列填充了一个特定值。 虽然下面的功能似乎可以正常工作,但在应用程序编辑器中运行时,它会引发错误:
TypeError: Cannot read property "source" from undefined.

显然是指e.source.getSheetName

function onEdit(e) {

  if (
    e.source.getSheetName() == "Activity" &&
    e.range.columnStart == 2 &&
    e.range.columnEnd == 2 &&
    e.range.rowStart >= 2 &&
    e.range.rowEnd <= 100
  ) {
    e.value !=='' ? e.range.offset(0,-1).setValue(caseID()) : null
    };
  };

我不确定这是否可以忽略,因为该函数有效(在 A 列中插入 caseID 函数的结果,当 B 列中的值发生更改时)? 提前谢谢你,

【问题讨论】:

  • eundefined 因为没有编辑事件(因为没有编辑)。有关实际错误,请参见视图> 执行。电子表格类中也没有 getSheetName() 方法。不需要for循环、ss、范围和活动。
  • @TheMaster getSheetName() 怎么样:link
  • @TheMaster 已更新代码,删除了 ss, activity, rangefor-loop - 谢谢!
  • 是的。好像有这个方法。但我认为该方法只会提供第一个工作表的名称而不是编辑工作表的名称。

标签: google-apps-script google-sheets spreadsheet


【解决方案1】:

简答:我想,我们现在可以忽略它。

原因:当我们在应用程序编辑器中手动运行该函数时,我们不会传递事件对象。所以这就是为什么它把e 当作undefined 错误。

我想我们可以将手动运行该函数解释为运行onEdit(),而函数签名需要参数e。这就是为什么 e 在手动执行时未定义的原因。

但是当它由于工作表中的编辑而被触发时,该事件对象将作为参数传递给函数,因此它可以按预期工作。

【讨论】:

    【解决方案2】:

    我相信 getSheetName() 只返回第一个工作表的名称,而不是已编辑工作表的名称。要获得正确的编辑工作表名称,您应该首先获取工作表,然后是它的名称。此外,这最好是从范围而不是源中完成:

    e.range.getSheet().getName() === "Activity"
    

    【讨论】:

    • 关于这行代码:e.value !=='' ? e.range.offset(0,-1).setValue(caseID()) : null - 如果用户删除 B 列中的值,我如何清除 A 列中的值?
    猜你喜欢
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    相关资源
    最近更新 更多