【问题标题】:How to get Date & Time using onEdit(e) function for multipal Sub Sheets in Google Spread Sheet如何使用 onEdit(e) 函数获取 Google 电子表格中多个子表的日期和时间
【发布时间】:2021-08-17 15:07:08
【问题描述】:

每个用户都有多个子表的 Google 表。每个用户都在进行输入,我需要根据数据输入日期/时间计算性能。我使用以下 onEdit(e) 函数,它适用于 1 张工作表.​​.....但是当我为其他子工作表制作相同脚本的多个副本时......它停止工作。

function onEdit(e) {
  var s = e.source.getActiveSheet(),
      watchcols = [2],
      offsetcols = [-1],
      ind = watchcols.indexOf(e.range.columnStart)
  if (s.getName() !== "Sheet1" || ind === -1) return ;
  e.range.offset(0,offsetcols[ind])
  .setValue(!e.value ? null : Utilities.formatDate(new Date(),Session.getScriptTimeZone(), "MM/dd/yyyy HH:mm:SS"))
}

有人可以帮我解决这个问题吗?

提前感谢您阅读我的帖子并帮助我!

【问题讨论】:

  • 您能具体说明一下您制作的“多份副本”是什么吗?如果您只需添加条件s.getName() == 'Other sheet',它应该适用于其他工作表
  • 我认为我们在 Google 表格中一次只能使用 1 个 onEdit 功能...因为我有不同的子表格,它不适用于第 2 和第 3。
  • 您的函数应该处理电子表格中的所有工作表
  • 怎么样?编辑时其他工作表有不同的列我得到时间和日期戳...
  • 将条件放在每个条件的范围内。

标签: google-apps-script google-sheets


【解决方案1】:

更新 - 使用 Utilities.formatDate(date, time zone, format) 和本地时区。找到你的local time zone id from here

如何将函数从 onEdit() 中分离出来:

function onEdit(e) {
  var s = e.source.getActiveSheet();
  var range = e.range;
  var col = range.getColumn();
    
   if (e.value){
      if (s.getName() === "AAA" && col === 4) { setDateTime(range, -3)};
      if (s.getName() === "BBB" && col === 6) { setDateTime(range, -5)};
      if (s.getName() === "CCC" && col === 10) { setDateTime(range, -6)};   
   }
}
    
    
function setDateTime(range, offsetcols){
  var date =  Utilities.formatDate(new Date(),"America/New_York", "MM/dd/yyyy HH:mm:ss");
  
  Logger.log(date);
       
  range.offset(0,offsetcols).setValue(date);
}

【讨论】:

  • 它的工作,但不显示准确的时间。获得准确计时的解决方案是什么?即它在迈阿密的下午 4:32...但是数据输入时间显示时间为上午 01:46...电子表格时间设置设置为美国...-5 GMT 东部时间。
  • 另外,它很慢……这是为什么呢?
  • App Script 服务器默认为美国太平洋时区 - 因此要指定时区,请使用 Utilities.formatDate(date, 'America/New_York' , "MM/dd/yyyy HH:mm:SS" );并将第二个参数替换为您的时区。以下是时区列表:developers.google.com/adwords/api/docs/appendix/…
  • 我更新了上面的代码。有两个问题,1)您的代码中只能有 1 个 onEdit(),但 Code.gs 中有一个,CODE1.gs 中有另一个。这些文件只是为了帮助人们对代码进行分组,服务器将其视为一件事。 2)日期格式导致问题,SS 是几分之一秒,谷歌表格重新格式化,导致奇怪的行为。我也更新了。最后,我降低了代码的复杂性。现在应该跑得更快了。
  • 我相信并且希望有人能澄清一下,onEdit() 仅在单元格的内容发生变化时触发。如果有人移动一个单元格,内容没有改变,只是位置,所以我不认为 onEdit() 会被触发。您可能需要设置一个可安装的触发器,例如 onChange(),但我没有使用它。
【解决方案2】:
function onEdit(e) {
  var s = e.source.getActiveSheet(),
      watchcols = [2],
      offsetcols = [-1],
      ind = watchcols.indexOf(e.range.columnStart)
  if (ind === -1) return ;
  if (s.getName() === "Sheet1") {
    e.range.offset(0,offsetcols[ind])
    .setValue(!e.value ? null : Utilities.formatDate(new Date(),Session.getScriptTimeZone(), "MM/dd/yyyy HH:mm:SS"))
  }

  else if (s.getName() === "Sheet2") {
  }

  else if (s.getName() === "Sheet3") {
  }
}

【讨论】:

  • 但是 Sheet2 和 Sheet3 在它们编辑的地方有不同的列,我得到时间戳......即对于 Sheet2 是...... watchcols = [3],offsetcols = [-2],对于 Sheet3 它watchcols = [5],offsetcols = [-4],
【解决方案3】:

试试这个:

function onEdit(e) {
  const sh = e.range.getSheet();
  const shts = ['Sheet1',"add others"]
  const idx = shts.indexOf(sh.getName());
  const watchcols = [2];
  const offsetcols = [-1];
  const ind = watchcols.indexOf(e.range.columnStart);
  if (~idx && ~ind) {
    e.range.offset(0,offsetcols[ind]).setValue(!e.value ? null : Utilities.formatDate(new Date(),Session.getScriptTimeZone(), "MM/dd/yyyy HH:mm:SS"))
  }
}

【讨论】:

  • 感谢@Cooper 它在所有工作表中都可以工作......但我需要在每张工作表中使用时间戳来编辑/更新单独的列......这是为了什么?
猜你喜欢
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
相关资源
最近更新 更多