在 Google 表格脚本编辑器中锁定

时间:2021-02-07 22:08:08

标签: google-apps-script google-sheets

我正在尝试创建一个谷歌工作表,在特定单元格中填充特定文本时显示并保存当前日期。之后,当此单元格更改为单独的文本时,会保存上一个日期,并添加编辑日期。这就是我的意思:

首先,单元格是这样的:

    |Status    |Date Started|Date Completed
    ----------------------------------------
    |          |            |

之后,当我输入“Started”时:

    |Status    |Date Started|Date Completed
    ----------------------------------------
    |Started   |08/02/2021  |

任务开始并完成后,我希望它显示为:

|Status    |Date Started|Date Completed
---------------------------------------
|Completed |08/02/2021  |09/02/2021

由于我在脚本编辑器中使用相同的单元格作为输入来更新开始日期和完成日期,问题是一旦单元格更改为“完成”,“开始日期”单元格就会消失。因此,我对此的初始解决方案是锁定输入“Started”,以便一旦指定的单元格更改为“Started”,“Date Started”单元格就会锁定并且不会更改。这是我为此任务编写的代码。但是,当我输入“Started”时它会起作用。当我将其更改为任何其他文本时,开始日期单元格消失。

  function Test5(input) {
  var flag;
  if (input=="Started")
  {
    flag=1;
  }
  if (flag == 1)
  {
    return("" + Utilities.formatDate(new Date(), "GMT", "dd/MM/yyyy"));
  }
}

当我输入“Started”时,结果如下:

    |Status    |Date Started|Date Completed
    ----------------------------------------
    |Started   |08/02/2021  |

输入“完成”后,“开始日期”单元格消失如下:

    |Status    |Date Started|Date Completed
    ---------------------------------------
    |Completed |            |

上面的代码是“Started”输入的函数。我仍然计划创建另一个用于“已完成”输入的函数。我的代码有问题,我该如何更正?

1 个答案:

答案 0 :(得分:0)

说明/问题:

问题:

  • 代码中的 if 条件仅对 Started 求值。如果您选择 Completed,则第一个 if 的计算结果为 false,因此 flag 不会获得值,因此第二个 if 的计算结果也为 false并且您的函数返回任何内容。

更合适的解决方案:

  • 我不确定您为什么为此使用常规函数,而且您的代码也不完整,因为我们没有看到您如何将值设置回工作表。

  • 但是,更合适的方法是使用简单的 onEdit 触发器。将以下代码保存在您的脚本编辑器中,然后在编辑后(见附件 gif)您将获得所需的结果。

解决方案:

function onEdit(e) {
  const sheetName = "Sheet1" // put the name of your sheet
  const ar = e.range;
  const as = ar.getSheet();
  const arow = ar.getRow();
  const acol = ar.getColumn();
  let col;
  if(as.getName()==sheetName && arow>1 && acol==1){  
    if(ar.getValue()=="Started"){
      col = 2; // if "Started" write in column B
    }
    else if(ar.getValue()=="Completed"){
      col = 3; // if "Completed" write in column C
    }
  as.getRange(arow,col).setValue(Utilities.formatDate(new Date(),
  e.source.getSpreadsheetTimeZone(), "dd/MM/yyyy"));
  }
}
  • 不应手动执行此代码,因为您会收到错误消息。当用户更改单元格的值时,onEdit 触发器会自动激活。在这种情况下,当您分别使用 StartedCompleted 编辑 A 列中的单元格值(标题除外)时,时间戳将设置为 B 列或 C 列。

  • 还将代码中的 Sheet1 修改为您的工作表名称和 acolcol 值,具体取决于您正在处理的列。

插图:

enter image description here