如果工作表中包含函数参数的单元格被编辑,如何让电子表格重新运行我的自定义函数?

问题描述 投票:0回答:1

我有一个名为“getStartTime”的函数。当员工打卡上班时,使用员工的姓名和轮班日期来输入他们的开始时间。这些记录在员工记分卡中,如果出于任何原因进行编辑,我希望他们的卡中的时间能够更新。所有员工都存储在一张表中,因此没有固定的排队范围。 (按字母顺序排序,新员工或终止员工可以更改此顺序。这是我的 onEdit 触发器的代码:

function onEditTrigger(e) {
  var range = e.range;
  var sheet = range.getSheet();
  var dataRange = sheet.getDataRange();
  
  // Get the coordinates of the edited range
  var editedRow = range.getRow();
  var editedColumn = range.getColumn();
  
  // Get the coordinates of the data range
  var dataRangeStartRow = dataRange.getRow();
  var dataRangeStartColumn = dataRange.getColumn();
  var dataRangeEndRow = dataRange.getLastRow(); 
  var dataRangeEndColumn = dataRange.getLastColumn();
  
  // Check if the edited range intersects with the data range
  if (editedRow >= dataRangeStartRow && editedRow <= dataRangeEndRow &&
    editedColumn >= dataRangeStartColumn && editedColumn <= dataRangeEndColumn) {
    let formulas = dataRange.getFormulas();
    for (var i = 0; i < formulas.length; i++) {
      for (var j = 0; j < formulas[i].length; j++) {
        let formula = formulas[i][j];
        // Check if the cell contains a formula and if the formula contains "getStartTime"
        if (formula && formula.indexOf("getStartTime") !== -1) {
           // Update the formula to force a recalculation
           var cell = sheet.getRange(i + 1, j + 1);
           cell.clearContent();
           Utilities.sleep(100);
           cell.setFormula(formula);
         }
       }
     }
   }
 }

我认为它会找到公式“getStartTime”的任何实例,清除它,然后重新应用它来重新计算或刷新值。通常不会发生任何事情,但在我编辑函数后通常会起作用。

google-apps-script triggers
1个回答
0
投票

您似乎试图通过在工作表上进行任何编辑时清除并重新应用公式来触发“getStartTime”函数的重新计算。但是,可能有一种更直接的方法来实现您想要的效果,而无需手动操作公式。

每当在工作表中进行编辑时,您可以使用

onEdit
触发器直接调用“getStartTime”函数,而不是尝试强制重新计算“getStartTime”函数。这样,该函数将再次执行,并自动重新计算开始时间。

以下是如何修改

onEditTrigger
函数来实现此目的:

function onEditTrigger(e) {
  var range = e.range;
  var sheet = range.getSheet();
  var editedRow = range.getRow();
  var editedColumn = range.getColumn();
  
  // Check if the edit is within the range where "getStartTime" function is used
  if (sheet.getName() == "YourSheetName" && editedColumn == yourColumnNumber) {
    // Call the "getStartTime" function for the edited row
    getStartTime(editedRow);
  }
}

将“YourSheetName”替换为工作表的名称,将“yourColumnNumber”替换为使用“getStartTime”函数的列号。

通过这种方法,每当在指定列中进行编辑时,都会调用相应行的“getStartTime”函数,确保自动重新计算开始时间。您无需手动清除并重新应用公式。

© www.soinside.com 2019 - 2024. All rights reserved.