谷歌电子表格上更改写日志到另一个表

Google Spreadsheet On change write log to another sheet

本文关键字:日志 另一个 电子表格 谷歌      更新时间:2023-09-26

请问谁能帮助一个问题在谷歌电子表格?

在"场地"表中更改了一个具体列的值后,我想写关于名称和时间的日志,当这个值被更改时。但我真的不知道,如果我正在使用电子表格"场地"或其他。我不是很进入类结构的谷歌API电子表格。有人能帮忙吗?

我需要

:

  • 当相应表("场馆")中相应列的值发生变化时,对事件运行eventandler
  • 从表中获取列名称
  • 获取实际时间
  • 将名称和时间写入另一个名为"status_history"的表的最后一行(如追加)

我努力想写点东西:(但那真的是很糟糕的代码)

function onEdit(event)
{
  var sheet = event.source.getActiveSheet();
  var cell = sheet.getActiveCell();
  var cellR = cell.getRow();
  var cellC = cell.getColumn();
  var cellValue = cell.getValue();
  var cellCName = cell.getColumn()-1; //column with names
  var name = sheet.getRange(cellR, cellCName).getValue();//get name
  var active_spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  if(sheet.getName() == "Venues"){
    if(cellC == 5 /* if correct collumn was changed */){
      var output_sheet = active_spreadsheet.getSheetByName("status_history");
      var lastRow = output_sheet.getLastRow();
      var lastRange = output_sheet.getRange(lastRow, 1)
      //HERE: write value: name
      var lastRow = output_sheet.getLastRow();
      var lastRange = output_sheet.getRange(lastRow, 2)
      //HERE: write value: time
    }
  }
}

你就要成功了。只需要做一些调整。

使用onEdit函数,您需要保持速度,因为它们经常被调用。

  • 尽可能依赖事件信息,避免调用Google Apps服务。
  • 如果你必须使用一个服务,只有在你绝对需要的时候才这样做——例如,在调用SpreadsheetApp.getActiveSpreadsheet()之前,等到你通过了if语句来判断你是否在一个你想要记录的单元格。
  • API是丰富的,所以寻找函数,将让你减少系统调用的数量-看看appendRow()如何取代多个语句,例如。

下面是代码检查后的函数:

function onEdit(event) {
  var sheet = event.range.getSheet();
  if(sheet.getName() == "Venues"){
    // correct sheet
    var cell = event.range;
    //var cellR = cell.getRow();  // not used at this time
    var cellC = cell.getColumn();
    var cellValue = event.value;
    if (cellC == 5) {
      // correct column
      var name = cell.offset(0,-1).getValue(); // get name, 1 column to left
      var time = new Date();                   // timestamp
      var active_spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
      var output_sheet = active_spreadsheet.getSheetByName("status_history");
      output_sheet.appendRow([name,time]);
    }
  }
}

您可以通过使用列名来测试条件,使其更加灵活和可移植。看一下Adam的回答