1

如果在第 1 列到第 9 列中的任何列中被修改,我能够修改时间戳是在第 10 列输入的,最后在第 11 列进行修改。

我知道在第一次修改每列时需要获取粒度和时间戳,同时保持现有的时间戳设置。

我相信这就像“if”语句一样简单,但我似乎无法弄清楚。

这是我到目前为止所拥有的。这为我提供了日期和时间,第 1 列和第 9 列之间的任何单元格在该行上被第一次修改,并在第 10 列返回日期和时间,然后在第 11 列上返回最后修改日期和时间(如果进行了任何更改)。现在我想记录第 1-9 列的第一次修改时间,并从第 12 列开始在同一张表上输入它们

function addTimestamp (e){
 //variables
 var startRow = 2;
 var ws = "Daily Log"
 var currentDate = 1

 //get modified row and column
 var row = e.range.getRow();
 var col = e.range.getColumn();

 if(([1,2,3,4,5,6,7,8,9].includes(col))&& row >= startRow 
 &&e.source.getActiveSheet().getName() ==ws){

  var currentDate = new Date();
  e.source.getActiveSheet().getRange(row, 11).setValue(currentDate);
  if(e.source.getActiveSheet().getRange(row, 10).getValue()== ""){
    e.source.getActiveSheet().getRange(row,10).setValue(currentDate);
  } // END IF check if date created exists
 } // END IF column, row, worksheet
}

特别感谢@raygun,他帮助我创建了 uniq 驱动程序 ID。

4

2 回答 2

0

解释:

你的目标是:

  • 将第 1-9 列中的任何单元格第一次修改的日期时间保留在第 10 列中。

  • 对于第 1-9 列中修改的每个单元格,分别在第 12-20 列中添加最后修改的标记。例如,如果第 1 列被修改,则更新第 12 列中的时间戳,如果第 2 列被修改,则更新第 13 列等。

出于性能原因,将您经常使用的代码存储在变量中始终是一个好习惯:

  • 例如e.source.getActiveSheet(),在您的代码中使用了 4 次,每次调用都会消耗资源。您可以改为将其存储在变量中并使用该变量。

解决方案:

function addTimestamp (e){
 //variables
 const startRow = 2;
 const ws = "Daily Log"
 //get modified row and column
 const rng = e.range;
 const as = rng.getSheet();
 const row = rng.getRow();
 const col = rng.getColumn();
  
 if(col>=1 && col<=9&& row >= startRow && as.getName() ==ws){
  const currentDate = new Date();
  const rng_all = as.getRange(row, col+11);
  const rng_ten = as.getRange(row, 10);
  as.getRange(row,11).setValue(currentDate);
  if(rng_all.getValue()== ""){
      rng_all.setValue(currentDate)
   }
  if(rng_ten.getValue()== ""){
      rng_ten.setValue(currentDate);
  } 
 } 
}

边注:

对于此特定任务,您不需要可安装的触发器。您可以addTimestamp(e)onEdit(e)简单触发器)替换它也可以。但这取决于您的喜好,但最好阅读差异(在我提供的超链接中)。

于 2021-02-13T14:52:59.373 回答
0

这是一个将所有更改记录到文件中的函数:

function onMyEdit(e) {
  e.source.toast('entry');
  let sh = e.range.getSheet();
  if (e.range.columnStart < 10) {
    let f = DriveApp.getFileById('file id');
    let c = f.getBlob().getDataAsString();
    let ts = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "E MMM dd yyyy HH:mm:ss");
    let o = c + ts + ',' + sh.getName() + ',' + e.range.rowStart + ',' + e.range.columnStart + ',' + e.oldValue + ',' + e.value + ',' + e.user.getEmail() + '\r\n';
    f.setContent(o);
    Logger.log(o);
  }
}

需要可安装触发器

数据表:

时间戳 工作表名称 山口 旧值 价值 用户邮箱
2021 年 2 月 13 日星期六 08:53:53 GMT-0700(山地标准时间) 表 1 5 4 30 55 已编辑
2021 年 2 月 13 日星期六 08:54:58 GMT-0700(山地标准时间) 表 1 9 4 32 55 已编辑
2021 年 2 月 13 日星期六 08:56:05 GMT-0700(山地标准时间) 表 1 14 7 62 新价值 已编辑
2021 年 2 月 13 日星期六 08:56:45 GMT-0700(山地标准时间) 表 1 1 2 10 45 已编辑
2021 年 2 月 13 日星期六 08:56:52 GMT-0700(山地标准时间) 表 1 3 2 11 77 已编辑
2021 年 2 月 13 日星期六 09:10:16 GMT-0700(山地标准时间) 表 2 5 2 4 77 已编辑
2021 年 2 月 13 日星期六 09:16:08 GMT-0700(山地标准时间) 表 5 8 4 不明确的 666 已编辑
2021 年 2 月 13 日星期六 09:18:04 GMT-0700(山地标准时间) 表 5 13 7 不明确的 66 已编辑
2021 年 2 月 13 日星期六 09:19:44 GMT-0700(山地标准时间) 表 5 9 3 不明确的 66 已编辑
2021 年 2 月 13 日星期六 09:20:29 GMT-0700(山地标准时间) 表 5 11 7 不明确的 kk 已编辑
2021 年 2 月 13 日星期六 09:22:21 GMT-0700(山地标准时间) 表 1 1 1 不明确的 不明确的 已编辑

这是一个将简单的 csv 加载到电子表格中的实用程序:

function loadCSVintoSpreadsheet() {
  const ss = SpreadsheetApp.getActive();
  const ui = SpreadsheetApp.getUi();
  const resp1 = ui.prompt('Select Sheet Name', 'Enter destination sheet name', ui.ButtonSet.OK_CANCEL);
  if (resp1.getSelectedButton() == ui.Button.OK && resp1.getResponseText().length > 0) {
    const sh = ss.getSheetByName('Sheet1');
    sh.clearContents();
    const resp2 = ui.prompt('CSV FileId', 'Enter file id of csv', ui.ButtonSet.OK_CANCEL);
    if (resp2.getSelectedButton() == ui.Button.OK && resp2.getResponseText().length > 0) {
      const file = DriveApp.getFileById(resp2.getResponseText());
      const csv = file.getBlob().getDataAsString();
      let csvA = Utilities.parseCsv(csv)
      sh.getRange(1, 1, csvA.length, csvA[0].length).setValues(csvA);
    }
  }
}
于 2021-02-13T16:01:16.697 回答