【问题标题】:OnEdit Not Triggering With Copy & Paste in Google App ScriptOnEdit 不会在 Google App 脚本中通过复制和粘贴触发
【发布时间】:2019-11-14 10:44:13
【问题描述】:

我有一个脚本,可以在编辑第一列时添加当前日期,但目前在粘贴值时它不起作用。

是否可以让此脚本为粘贴到第 1 列的范围的每一行添加日期?

function onEdit(e) {
  if (e.range.getSheet().getSheetName() == 'Add Statements Here' && e.range.getColumn() == 1) {
    e.range.offset(0,10).setValue(e.value.length>0 ? new Date() : '');
  }

} 

【问题讨论】:

  • 这是谷歌应用程序库吗?
  • 它在 Gsheets 上的 Google App 脚本中 :)
  • 您确定该方法根本没有被触发吗?即使在 if 之外?

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


【解决方案1】:

粘贴到单元格时,event object 的“值”属性设置为undefined

因此,评估 e.value.length>0(如所提供代码的第 3 行)会导致 TypeError,因为 undefined 不包含“长度”属性。

为了解决这个问题,我建议您使用e.range.getValue() 而不是e.value,因为无论您是通过手动键入还是粘贴来插入值,都会声明范围属性。

您修改后的代码如下所示:

function onEdit(e) {
  if (e.range.getSheet().getSheetName() == 'Add Statements Here' && e.range.getColumn() == 1) {
    e.range.offset(0,10).setValue(e.range.getValue().length>0 ? new Date() : '');
  }
}

【讨论】:

  • 完美运行。谢谢!
【解决方案2】:

这确实是一种奇怪的行为,但我想我对正在发生的事情有一个粗略的了解。 event parameter 对应于 onEdit() 提供属性 value,但请注意最后一句

编辑后的新单元格值。 仅当编辑的范围是 单细胞。

似乎如果您将 粘贴到单元格上,Google 会将该操作作为潜在的批处理操作处理,并假定该范围不是单个单元格,因此不会返回 value。考虑一下,如果您选择了A1:D1 范围并将其粘贴over A2,这将修改单元格B2C2D2

但是,如果您将 粘贴到单元格 A2(在粘贴前双击单元格),那么唯一修改的单元格是 A2

所以粘贴over和粘贴into的区别基本上就是使用setValues()setValue()的区别。

要解决此问题,请尝试删除或更改您的三元条件e.value.length>0 ? new Date() : ''

例如,下面的修改代码将检查编辑范围中的第一个值的长度是否大于零,但如果一次粘贴多行,它只会打印第一行的时间戳。这很容易解决,如果您需要这样做,通过调整您的.offset() 或使用.getHeight()(可能还有.getWidth())。

function onEdit(e) {
  if (e.range.getSheet().getSheetName() == 'Add Statements Here' && e.range.getColumn() == 1) {
    e.range.offset(0,10,1,1).setValue(e.range.getValue().length>0 ? new Date() : '');
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    相关资源
    最近更新 更多