【问题标题】:Lock the value of a cell after first edit script running and don't update the cell value for other edits在第一次编辑脚本运行后锁定单元格的值,并且不为其他编辑更新单元格值
【发布时间】:2026-02-05 18:20:04
【问题描述】:

我有一个脚本,每次有人编辑 Col3 或 Col16 时,它会自动填充 Google 电子表格上的单元格。

我的问题:

如果有人编辑或修改 Col3 中的值,自动单元格中的时间戳将更新,而我想保留这些单元格中的第一个值,即第一次编辑 Col 3 时的生成日期。

我的脚本:

function onEdit(event) {
  // assumes source data in sheet named Elisa-Miriam-Victor-Hanane-Sarah-Apoorva-Carlino
  // target sheet of move to named Archive
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  // Fill automatically Columns Q and R when PO number is provided in Column P.
  // In Q: generates the date of when the PO is mentioned; in R: it generates the PO folder name
  var sh=event.range.getSheet();
  var namesA=["Miriam","Elisa","Hanane","Sarah","Apoorva","Victor","Carlino"];
if(namesA.indexOf(sh.getName())!=-1 && event.range.columnStart==16) { // when PO 1 N° is filled
     event.range.offset(0,1).setValue(new Date()).setNumberFormat("yyyy-MM-dd");
     event.range.offset(0,2).setFormula(Utilities.formatString('=CONCATENATE(TEXT(Q%s;"yyyy-MM-dd");" - ";P%s)',event.range.rowStart,event.range.rowStart,event.range.rowStart));
   }         

if(namesA.indexOf(sh.getName())!=-1 && event.range.columnStart==3) { // when client is mentioned in Col 3
  event.range.offset(0,9).setFormula(Utilities.formatString('=IFERROR(vlookup(E%s;IMPORTRANGE("https://docs.google.com/spreadsheets/d/1zN99rXMltbMfD_OS22NxZApgvabTG-eRv7FOIS7pBvk/edit#gid=1560028291";"Treatment!A:E");2;false);"")',event.range.rowStart,event.range.rowStart,event.range.rowStart));
     event.range.offset(0,31).setValue(new Date()).setNumberFormat("yyyy-MM-dd HH:mm:ss");
   }
  }

有人知道如何锁定日期的第一个生成值吗?

感谢您的帮助,

【问题讨论】:

  • 第一次是什么意思,也许你的意思是每天第一次,每周第一次,夏季活动后的第一次,或者只是你完成编程后的第一次,就是这样跨度>
  • 第一次,我的意思是:我用客户端名称填充 Col3,这个值不应该改变。但是如果我需要修改客户端名称(格式或内容),生成的单元格将更新今天日期的时间戳,而我想保留我第一次填写客户端名称的日期跨度>
  • 您可以将 PropertiesService 与一个脚本一起使用,如果没有这样的属性,该脚本只会在该属性中存储数据。

标签: javascript google-apps-script google-sheets


【解决方案1】:

您可以在为其赋值之前检查单元格是否为空:

function onEdit(event) {
     ...
     var offsetRange = event.range.offset(0,31);
     if(offsetRange.isBlank()){
       offsetRange.setValue(new Date()).setNumberFormat("yyyy-MM-dd HH:mm:ss");
    }
   }
  }

【讨论】:

  • 这是完美的,它正在工作。谢谢ziganotschka
【解决方案2】:

仅保存第一次

function saveFirstTimeOnly(key,value) {
  const ps=PropertiesService.getScriptProperties();
  var obj=ps.getProperties();
  if(!obj.hasOwnProperty(key)) {
    ps.setProperty(key, value);    
  }
}

您可以使用任何东西作为密钥。就像“SheetName”+“RangeInA1Notation”一样,您可能必须为此使用可安装的触发器。

【讨论】:

  • 我使用了其他解决方案,因为它不需要另一个触发器,但感谢您的帮助 Cooper!