【问题标题】:Target by value in on edit function在编辑功能中按值定位
【发布时间】:2019-08-09 16:08:18
【问题描述】:

我正在创建一个需要时间戳的工作表,每次单元格值更改为“x”时。时间戳必须是“x”右侧的一个单元格。我有多个列,您可以在其中输入 x..

我已经尝试过使用标题,但它似乎不起作用?可能是因为您可以键入“x”的位置不在标题下方吗?任何人都可以帮助我或建议其他方法吗?

function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  if (sheet.getName() == "Mandagstræning") {
    var actRng = sheet.getActiveRange();
    var editColumn = actRng.getColumn();
    var rowIndex = actRng.getRowIndex();
    var headers = sheet.getRange(1, 1, sheet.getLastColumn()).getValues();
    var dateCol = headers[0].indexOf("Tid") + 1;
    var orderCol = headers[0].indexOf("dato") + 1;
    if (dateCol = "x" && rowIndex > 1 && editColumn == orderCol) {
      sheet.getRange(rowIndex, dateCol).setValue(Utilities.formatDate(new Date(), "UTC+8", "MM-dd-yyyy HH.mm.ss"));
    }
  }
}

现在,当我将值更改为 x 时,我没有得到任何结果。我的标题位于工作表的第一行。

这是我的工作表的示例。 https://docs.google.com/spreadsheets/d/11Rtbqs08Xw5VxA6DRZQ6PnQtsOPZJbV4YGcLfpkEuvA/edit?usp=sharing

【问题讨论】:

  • 您使用的电子表格应用程序是什么?
  • 我正在使用谷歌表格 - 如果这是您要问的。没有什么特别的。只有宏在那里。 :)

标签: javascript google-sheets


【解决方案1】:

这是我想出的。您可以在 demo sheet 中看到它的工作原理。

function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  if (sheet.getName() == "Mandagstræning") {
    var actRng = sheet.getActiveRange();
    var editColumn = actRng.getColumn();
    var rowIndex = actRng.getRowIndex();
    var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues(); // changed
    var dateCol = headers[0].indexOf("Tid") + 1;
    var orderCol = headers[0].indexOf("dato") + 1;
    if (sheet.getRange(rowIndex, orderCol).getValue() === "x") { // changed
      sheet.getRange(rowIndex, dateCol).setValue(Utilities.formatDate(new Date(), "UTC+8", "MM-dd-yyyy HH.mm.ss"));
    }
  }
}

关键是标记为// changed 的两行。对于第一个,我只想要 1 行范围,所以我将第三个参数的行数添加为 1。对于第二个,您需要获取正确单元格的值并使用比较相等运算符 (===) 而不是赋值运算符 (=)。

编辑:看到更新的工作表后

我将您示例表中的代码调整如下:

function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  if (sheet.getName() == "Mandagstræning") {
    var actRng = sheet.getActiveRange();
    var editColumn = actRng.getColumn();
    var rowIndex = actRng.getRowIndex();
    var headers = sheet.getRange(1, editColumn, 1, sheet.getLastColumn()).getValues();
    var orderCol = headers[0].indexOf("dato") + editColumn;
    var dateCol = headers[0].indexOf("Tid") + editColumn;
    if (sheet.getRange(rowIndex, orderCol).getValue() === "x") {
      sheet.getRange(rowIndex, dateCol).setValue(Utilities.formatDate(new Date(), "UTC+8", "MM-dd-yyyy HH.mm.ss"));
    }
  }
}

您会注意到,我正在从活动单元格的列开始寻找第一个匹配的订单和日期列。然后,如果订单列的值为x,则将其后的第一个匹配日期列中的值设置为当前日期。

【讨论】:

  • 我看到它在您的演示表中工作,这正是我正在寻找的。但它仍然没有在我的工作表上工作,我在示例 B2 和 B3 中以及在 E2 和 F2 中都有日期和时间,等等贯穿整个工作表。我需要它才能在整个工作表中执行此操作,我也尝试将它们向上移动,但我仍然无法正常工作。
  • @PernilleSundsEskildsen 您能在此处分享您的工作表示例(已删除任何私人数据)吗?
  • 是的,两秒钟 - 我可以让它在第一行工作,但不能在带有“x”的第二行工作。
  • 它现在应该在文本中。如您所见,它完美地适用于 B 列 - 谢谢。
  • @PernilleSundsEskildsen 用工作代码更新了我的答案和示例表。
猜你喜欢
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 2021-05-21
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多