Google电子表格在更改时将日志写入另一个工作表

时间:2014-07-17 14:02:51

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

任何人都可以帮助解决谷歌电子表格中的一个问题吗?

在工作表“Venues”中的一个具体列中更改值后,我想写一个关于名称和时间的日志,当这个值被更改时。但我无法真正意识到,如果我正在使用电子表格“场地”或其他一些。我不太熟悉电子表格的谷歌API的类结构。那么任何人都可以帮忙吗?

我需要:

  • 在适当的工作表(“场地”)中的相应列中的值更改时,在事件上运行eventhandler
  • 从此表中的列名获取值
  • 获取实际时间
  • 将名称和时间写入另一张名为“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
    }
  }
}

1 个答案:

答案 0 :(得分:1)

你到了那里。只需要几个调整。

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

  • 尽可能依靠活动信息,避免拨打Google Apps服务。
  • 如果您必须使用某项服务,请仅在您绝对需要时执行此操作 - 例如,等到您超过if语句,该语句告诉您是否在某个单元格中要记录之前致电SpreadsheetApp.getActiveSpreadsheet()
  • 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's answer here