google-apps-script - 当数据自动插入谷歌表格时,应用脚本更新时间戳
问题描述
当在第 3 列中编辑数据或复制粘贴数据时,此代码可以正常工作,但如果在复制/粘贴整行时光标仍位于第 1 列,则它不会更新,其次,如果 Salesforce 将数据发送到列3、那个时候也不行,请帮帮我。
function onEdit() {
var s = SpreadsheetApp.getActiveSheet();
var sName = s.getName();
var r = s.getActiveCell();
var row = r.getRow();
var ar = s.getActiveRange();
var arRows = ar.getNumRows()
// Logger.log("DEBUG: the active range = "+ar.getA1Notation()+", the number of rows = "+ar.getNumRows());
if( r.getColumn() == 3 && sName == 'Sheet1') { //which column to watch on which sheet
// loop through the number of rows
for (var i = 0;i<arRows;i++){
var rowstamp = row+i;
SpreadsheetApp.getActiveSheet().getRange('F' + rowstamp.toString()).setValue(new Date()).setNumberFormat("MM/dd/yyyy hh:mm"); //which column to put timestamp in
}
}
}//setValue(new Date()).setNumberFormat("MM/dd/yyyy hh:mm:ss");
解决方案
解释:
三个重要的事情要知道:
正如官方文档中所述,触发器是在用户编辑
onEdit
时触发的。此函数不会被公式或其他脚本触发。如果 salesforce 或除用户之外的任何其他服务,编辑列触发器将不会被激活。存在变通办法,但这些变通办法取决于您的特定问题的上下文。我建议您搜索或询问有关它的具体问题。C
onEdit
关于您遇到的另一个问题,您应该摆脱活动范围并利用事件对象。该对象包含有关用户所做的编辑/编辑的信息。
正如最佳实践所建议的那样,您不应在工作表中反复设置值,但您可以通过选择一系列单元格并设置值来一次性完成。在您的情况下,您希望在所需范围内的所有单元格中设置相同的值,因此
setValue
使用而不是setValues
. 但这个想法是摆脱for
循环。
解决方案:
function onEdit(e) {
var s = e.source.getActiveSheet();
var sName = s.getName();
var ar = e.range;
var row = ar.getRow();
var arRows = ar.getNumRows()
if( ar.getColumn() == 3 && sName == 'Sheet1') {
s.getRange(row,6,arRows).setValue(new Date()).setNumberFormat("MM/dd/yyyy hh:mm");
}
}
笔记:
再次,onEdit
是触发功能。您不应该手动执行它,如果这样做,您实际上会收到错误(因为使用了事件对象)。您所要做的就是将此代码片段保存到脚本编辑器中,然后它会在编辑时自动触发。
推荐阅读
- mongodb - 在 MongoDB 中实现聚合时要注意的一般指针
- java - IntelliJ 未检测到 Java Immutable Builder 类
- ruby-on-rails - 无法运行 Rails 测试或进行迁移
- c++ - 如何使用类、向量等解决此任务
- javascript - 来自门户的 React-Router 重定向未重定向
- postgresql - 高 lock_manager 等待事件
- uwp - UWP 尝试保留应用名称时发生意外错误
- python - 抓取网站中的 cloudcraper 问题(cloud flare 版本 2)
- database - 如果 XY-->XZ 然后 Y-->Z,则函数依赖?
- vba - 检查 PDF 是否是 Word VBA 中的图像/OCR