首页 > 解决方案 > 在编辑功能中按值定位

问题描述

我正在创建一个需要时间戳的工作表,每次单元格值更改为“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

标签: javascriptgoogle-sheets

解决方案


这是我想出的。您可以在演示表中看到它的工作原理。

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的值为 ,则将其后的第一个匹配日期列中的值设置为当前日期。


推荐阅读