繁体   English   中英

带有选定列脚本的 Google 表格单独的日志页面

[英]Google sheet separate log page with sellected columns script

我有一个谷歌表格问题。 我的主页(名称为“MAIN”,从其他工作表中收集数据。因此,“MAIN”工作表如下所示: MAIN

我想创建一个单独的日志页面,当有人更改他的酒店时,它只收集“主要”工作表数据,在他的名字旁边。 (酒店栏在 MAIN 表的第 4 位)

..所以“LogSheet”需要收集带有时间戳的第 1 秒和第 4 列。

所以最后会有一个列表(谁去了,哪家酒店和什么时候)。 它需要是这样的, LogSheet ,但我写不出来:/

function onEdit(e) {
  
  var sheetsToWatch = ["MAIN"];
  var changelogSheetName = ["LogSheet"];

  var timestamp = new Date();
  var row = e.range.getRow();
  var col = e.range.getColumn();
  var sheetName = sheet.getName();
  
  if(col === 4 && row > 1 && e.source.sheetsToWatch() .getName() === "MAIN" ){
  e.changelogSheetName().getRange('MAIN', row,1).setValue(new Date());
  }   

 }

关于事件对象和变量的使用存在一些混淆

  1. 变量(包括数组)在没有()的情况下被调用 - ()保留用于函数调用
  2. 如果您的变量仅包含一个值,而不是数组 - 则无需将其放在[]括号中。 []括号将变量指定为数组,并且需要以不同的方式处理。
  3. 要验证工作表是否包含在工作表名称数组中,您需要使用例如indexOf()而不是==
  4. e.source返回进行编辑的电子表格。 在查询e.source.getActiveSheet()时,您将在大多数情况下正确获得进行编辑的工作表,但考虑到例外情况,最好将事件 object range与方法https://developers 一起使用。 google.com/apps-script/reference/spreadsheet/range#getsheet
  5. 方法getRange()需要行、列以及可选的行和列号 - 而不是工作表名称作为变量。

请查看以下示例中的修改。

带有工作表数组的示例

function onEdit(e) {
  
  var sheetsToWatch = ["MAIN", "add another sheet if desired" ];
  var changelogSheetName = "LogSheet";
  var logSheet = SpreadsheetApp.getActive().getSheetByName(changelogSheetName);
  var timestamp = new Date();
  var row = e.range.getRow();
  var col = e.range.getColumn();
  var sheet = e.range.getSheet();
  var sheetName = sheet.getName();
  Logger.log(e.range.getSheet().getName());
  if(col === 4 && row > 1 && sheetsToWatch.indexOf(sheetName)!=-1){
    logSheet.getRange(row,1).setValue(new Date());
    //do whatever else you want
  }     
}

以单张纸作为变量的样本

function onEdit(e) {
  
  var sheetsToWatch = "MAIN";
  var changelogSheetName = "LogSheet";
  var logSheet = SpreadsheetApp.getActive().getSheetByName(changelogSheetName);
  var timestamp = new Date();
  var row = e.range.getRow();
  var col = e.range.getColumn();
  var sheet = e.range.getSheet();
  var sheetName = sheet.getName();
  Logger.log(e.range.getSheet().getName());
  if(col === 4 && row > 1 && sheetsToWatch ==sheetName){
    logSheet.getRange(row,1).setValue(new Date());
    //do whatever else you want
  }     
}

请参阅 Apps 脚本文档指南以获得更好的理解。

更新

对于您的情况,最方便的是从已编辑的行中检索值,并按所需的顺序将 append 检索到LogSheet

样本

function onEdit(e) {
  
  var sheetsToWatch = "MAIN";
  var changelogSheetName = "LogSheet";
  var logSheet = SpreadsheetApp.getActive().getSheetByName(changelogSheetName);
  var timestamp = new Date();
  var row = e.range.getRow();
  var col = e.range.getColumn();
  var sheet = e.range.getSheet();
  var sheetName = sheet.getName();
  if(col === 4 && row > 1 && sheetsToWatch ==sheetName){
    var values = sheet.getRange(row,1,1,4).getValues()[0];
    logSheet.appendRow([new Date(), values[0], values[1], values[3]]);
  }     
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM