【问题标题】:I need to record the data changes on a Cell in Google Sheets我需要在 Google 表格中的单元格上记录数据更改
【发布时间】:2017-12-25 06:17:17
【问题描述】:

以下代码创建一个更改日志表,以跟踪我的团队在 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


    【解决方案1】:

    我对您的评论所做的修改只有在我取消保护工作表 (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()]);
    }
    

    【讨论】:

      【解决方案2】:

      您需要将 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

      【讨论】:

      • 除了我必须使 changeLog Sheet 可编辑之外,它工作得很好,为了解决这个问题,我得到了这个代码,它创建一个帮助表来跟踪旧数据并防止它被更改,但它是还有一个 onEdit 功能,我无法让它们一起工作,你能帮忙吗,我会发布代码作为答案
      • 与其让它们一起工作并确保两者同步,不如只保留可编辑的工作表?
      • 因为这样我就无法在更改日志表上进行中继,因为任何用户都可以在记录数据后对其进行操作(因此更改日志实际上是无用的)
      • 感谢您的快速响应,可以吗?
      • 我不太清楚你需要什么。为什么任何用户都可以编辑您的工作表。只有与您共享工作表的用户才能更改它,对吧?
      猜你喜欢
      • 2019-12-25
      • 2022-08-06
      • 1970-01-01
      • 2021-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多