我需要在Google表格中记录Cell上的数据更改

问题描述 投票:1回答:2

以下代码创建了一个更改日志表,以跟踪我的团队在Google表格中每个单元格中所做的更改。

如何在此更改日志中添加“编辑器名称或其电子邮件”?

function onEdit() {

  // This script records changes to the spreadsheet on a "Changelog" sheet.

  // The change log includes:

 // "Timestamp", "Sheet name", "Cell address", "Column label", "Row label", "Value entered"

  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 change log 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", "Row label", "Value entered"]);
    changelogSheet.setFrozenRows(1);
  }
  changelogSheet.appendRow([timestamp, sheetName, cell.getA1Notation(), columnLabel, rowLabel, cell.getValue()]);
}
google-apps-script google-sheets
2个回答
0
投票

您需要将onEdit作为可安装的触发器而不是简单的触发器运行。在编辑中,有“当前项目触发器”。设置你的onEdit。完成后,它会询问您的权限,以便访问用户的详细信息。如果将onEdit作为简单触发器运行,则它无权访问用户的详细信息。

编辑以下行

changelogSheet.appendRow(["Email","Timestamp", "Sheet name", "Cell address", "Column label", "Row label", "Value entered"]);

changelogSheet.appendRow([Session.getActiveUser().getEmail(), timestamp, sheetName, cell.getA1Notation(), columnLabel, rowLabel, cell.getValue()]);

有关更多详细信息,请查看https://developers.google.com/apps-script/guides/triggers/installable


0
投票

我用你的评论做的修改只有在我取消保护工作表(changeLog)以便代码可以记录每个用户的更改时才能工作,所以我得到了这个脚本以防止更新单元格。当用户编辑主工作表上的单元格时,将根据帮助工作表上的相同单元格对其进行检查。如果帮助工作表上的值为空,则新值将存储在两个工作表上。如果帮助工作表上的值不为空,则将其复制到主工作表上的单元格中,从而有效地撤消更改(以保护数据)已进入)

问题:这个代码也是onEdit函数,它不能使用旧的onEdit代码,我怎样才能在同一个onEdit函数中加入?

P.s我已经通过复制Changelog表创建了Helper表,并将其命名为Helper

新守则:

function onEdit() {


  var masterSheetName = "Changelog" // sheet where the cells are protected from updates
  var helperSheetName = "Helper" // sheet where the values are copied for later checking
  var firstDataRow = 1; // only take into account edits on or below this row
  var firstDataColumn = 1; // only take into account edits on or to the right of this column

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var masterSheet = ss.getActiveSheet();
  if (masterSheet.getName() != masterSheetName) return;

  var masterCell = masterSheet.getActiveCell();
  if (masterCell.getRow() < firstDataRow || masterCell.getColumn() < firstDataColumn) return;

  var helperSheet = ss.getSheetByName(helperSheetName);
  var helperCell = helperSheet.getRange(masterCell.getA1Notation());
  var newValue = masterCell.getValue();
  var oldValue = helperCell.getValue();

  if (oldValue == "") {
    helperCell.setValue(newValue);
  } else {
    masterCell.setValue(oldValue);
  }
}

推荐后的第一个代码如下:

function onEdit() {
  // This script records changes to the spreadsheet on a "Changelog" sheet.
  // The changelog includes these columns:
  // "Timestamp", "Sheet name", "Cell address", "Column label", "Row label", "Value entered"

  var sheetsToWatch = ['Sheet1', 'add more'];
  // 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 3 */ 3, cell.getColumn()).getValue();
  var rowLabel = sheet.getRange(cell.getRow(), /* column B */ 2).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(["Email","Timestamp", "Sheet name", "Cell address", "Column label", "Row label", "Value entered"]);
    changelogSheet.setFrozenRows(1);
  }
  changelogSheet.appendRow([Session.getActiveUser().getEmail(), timestamp, sheetName, cell.getA1Notation(), columnLabel, rowLabel, cell.getValue()]);
}
© www.soinside.com 2019 - 2024. All rights reserved.