javascript - Google Spreadsheet On 更改将日志写入另一张表

标签 javascript google-apps-script google-sheets

请问有人可以帮忙解决 Google 电子表格中的一个问题吗?

更改“ field ”表中一个具体列中的值后,我想在更改该值时写入有关名称和时间的日志。但我无法真正意识到,如果我正在使用电子表格“ field ”或其他一些。我不太了解 Google API for Spreadsheet 的类结构。那么有人可以帮忙吗?

我需要:

  • 当相应工作表中相应列(“地点”)中的值发生更改时,对事件运行事件处理程序
  • 从该工作表的列名称获取值
  • 获取实际时间
  • 将名称和时间写入另一个名为“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 服务。
  • 如果您必须使用某项服务,请仅在绝对需要时才使用 - 例如,等到您经过判断您是否位于要记录的单元格的 if 语句之后< em>在调用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 .

关于javascript - Google Spreadsheet On 更改将日志写入另一张表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24805727/

相关文章:

google-docs - 最常见关键字的 Google 文档电子表格公式

javascript - 如何捕获 jQuery AJAX 错误?

javascript - 使用 window.location.href 将参数传递给 MVC ActionResult

google-apps-script - 通过Google脚本获取Gmail标签的所有子标签

javascript - Google Sheets 脚本编辑器触发器不起作用

pdf - 使用名称创建 PDF,而不是在驱动器中创建文件并重命名

javascript - 在将新的集合项添加到 Meteor View 后如何运行客户端代码?

javascript - 如何在 AppleScript 中执行 JavaScript 函数?

google-apps-script - 如何使用 Google Apps 脚本将公式添加到 Google 表格?

javascript - 如何链接返回代码 302 的外部 js 文件