Google apps script 需要谷歌脚本OneEdit(e)中的帮助来监视受限行/列或范围,并在记录器xls中更新

Google apps script 需要谷歌脚本OneEdit(e)中的帮助来监视受限行/列或范围,并在记录器xls中更新,google-apps-script,google-sheets,Google Apps Script,Google Sheets,下面的代码正在工作,并在记录器xls中记录所有更改(来自整个图纸单元格值)和更新。 如何限制仅监视特定行/列或范围的更改 代码: function onEdit() { // This script records changes to the spreadsheet on a "Changelog" sheet. // The changelog includes these columns: // edit the following lines to suit your n

下面的代码正在工作,并在记录器xls中记录所有更改(来自整个图纸单元格值)和更新。 如何限制仅监视特定行/列或范围的更改

代码:

function onEdit() {
  // This script records changes to the spreadsheet on a "Changelog" sheet.
  // The changelog includes these columns:  
  // edit the following lines to suit your needs
  // changes are only recorded from sheets listed below
  // escape regular expression metacharacters as in \. \$ \+ \* \? \( \) \[ \]
  // see http://en.wikipedia.org/wiki/Regular_expression
  // use '.+' to include all sheets
  var sheetsToWatch = ['outcome overview', 'Sheet1', 'Another sheet'];
  // name of the sheet where the changelog is stored
  var changelogSheetName = "Changelog";

  var timestamp = new Date();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var cell = sheet.getActiveCell();
  var sheetName = sheet.getName();

  // if it is the changelog sheet that is being edited, do not record the change
  if (sheetName == changelogSheetName) return;

  // if the sheet name does not appear in sheetsToWatch, do not record the change
  var matchFound = false;
  for (var i = 0; i < sheetsToWatch.length; i++) {
    if (sheetName.match(sheetsToWatch[i])) matchFound = true;
  }
  if (!matchFound) return;

  var columnLabel = sheet.getRange(/* row 1 */ 1, cell.getColumn()).getValue();
  var rowLabel = sheet.getRange(cell.getRow(), /* column A */ 1).getValue();

  var changelogSheet = ss.getSheetByName(changelogSheetName);
  if (!changelogSheet) {
    // no changelog sheet found, create it as the last sheet in the spreadsheet
    changelogSheet = ss.insertSheet(changelogSheetName, ss.getNumSheets());
    // Utilities.sleep(2000); // give time for the new sheet to render before going back
    // ss.setActiveSheet(sheet);
    changelogSheet.appendRow(["Timestamp", "Sheet name", "Cell address", "Column label", "Rowlabel", "Value entered"]);
    changelogSheet.setFrozenRows(1);
  }
  changelogSheet.appendRow([timestamp, sheetName, cell.getA1Notation(), columnLabel, rowLabel, cell.getValue()]);
}
函数onEdit(){
//此脚本将电子表格的更改记录在“更改日志”表中。
//变更日志包括以下列:
//编辑以下行以满足您的需要
//更改仅记录在下面列出的表格中
//转义正则表达式元字符,如\.\$\+\*\?\(\)\[\]
//看http://en.wikipedia.org/wiki/Regular_expression
//使用“.+”包含所有图纸
var sheetsToWatch=[‘结果概述’、‘Sheet1’、‘另一张表’];
//存储更改日志的工作表的名称
var changelogSheetName=“Changelog”;
var timestamp=新日期();
var ss=SpreadsheetApp.getActiveSpreadsheet();
var sheet=ss.getActiveSheet();
var cell=sheet.getActiveCell();
var sheetName=sheet.getName();
//如果正在编辑的是变更记录表,则不要记录变更
如果(sheetName==changelogSheetName)返回;
//如果图纸名称未出现在sheetsToWatch中,请勿记录更改
var matchFound=false;
对于(变量i=0;i
是否有任何不使用的原因?我想那可以让一些东西更干净

针对您的问题的具体情况,没有内置的方法来实际过滤中的调用。但是您可以使用
if
语句来避免在范围不在列表中时执行更改

因此,我将您的代码更改为:

function onEdit() {
  // This script records changes to the spreadsheet on a "Changelog" sheet.
  // The changelog includes these columns:  
  // edit the following lines to suit your needs
  // changes are only recorded from sheets listed below
  // escape regular expression metacharacters as in \. \$ \+ \* \? \( \) \[ \]
  // see http://en.wikipedia.org/wiki/Regular_expression
  // use '.+' to include all sheets
  var sheetsToWatch = ['outcome overview', 'Sheet1', 'Another sheet'];

  // Range to execute the changeLog
  var minRow = 1;
  var maxRow = 3;

  var minColumn = 1;
  var maxColumn = 3;

  // name of the sheet where the changelog is stored
  var changelogSheetName = "Changelog";

  var timestamp = new Date();
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var cell = sheet.getActiveCell();
  var sheetName = sheet.getName();

  // if it is the changelog sheet that is being edited, do not record the change
  if (sheetName == changelogSheetName) return;

  // if the sheet name does not appear in sheetsToWatch, do not record the change
  var matchFound = false;
  for (var i = 0; i < sheetsToWatch.length; i++) {
    if (sheetName.match(sheetsToWatch[i])) matchFound = true;
  }
  if (!matchFound) return;

  if(minColumn > cell.getColumn() || cell.getColumn() > maxColumn 
     || minRow > cell.getRow() || cell.getRow() > maxRow){
    Logger.log("Change not done in the expected range, halting");
    return;
  }

  var columnLabel = sheet.getRange(/* row 1 */ 1, cell.getColumn()).getValue();
  var rowLabel = sheet.getRange(cell.getRow(), /* column A */ 1).getValue();

  var changelogSheet = ss.getSheetByName(changelogSheetName);
  if (!changelogSheet) {
    // no changelog sheet found, create it as the last sheet in the spreadsheet
    changelogSheet = ss.insertSheet(changelogSheetName, ss.getNumSheets());
    // Utilities.sleep(2000); // give time for the new sheet to render before going back
    // ss.setActiveSheet(sheet);
    changelogSheet.appendRow(["Timestamp", "Sheet name", "Cell address", "Column label", "Rowlabel", "Value entered"]);
    changelogSheet.setFrozenRows(1);
  }
  changelogSheet.appendRow([timestamp, sheetName, cell.getA1Notation(), columnLabel, rowLabel, cell.getValue()]);
}
然后,您只需与修改后的单元格进行比较,如果不在范围内,请停止执行:

  if(minColumn > cell.getColumn() || cell.getColumn() > maxColumn 
     || minRow > cell.getRow() || cell.getRow() > maxRow){
    Logger.log("Change not done in the expected range, halting");
    return;
  }

非常感谢Raserhin,您的输入和代码解决了我的问题:)实际上,它只在我手动更新工作表时更新日志,但由于某些自动功能,当单元格发生更改时,它不会更新。当单元格被函数更新时,是否有任何方法可以跟踪更改。
  if(minColumn > cell.getColumn() || cell.getColumn() > maxColumn 
     || minRow > cell.getRow() || cell.getRow() > maxRow){
    Logger.log("Change not done in the expected range, halting");
    return;
  }