【问题标题】:Username and Timestamp when a cell is edited in Google Sheets using Google App Script使用 Google App Script 在 Google 表格中编辑单元格时的用户名和时间戳
【发布时间】:2019-11-06 16:49:19
【问题描述】:

我正在尝试编写一个脚本来实现以下目标:

假设在 Google 表格中,数据在 Col K 中输入。我希望 Col L 向我提供输入数据的人的用户名,并希望 Col M 向我显示输入数据时的时间戳。此外,如果 Col K 以后更新,我希望 Col L 和 M 保持原样,但 Col N 显示更新 Col K 的人的用户名,Col O 显示用户更新 Col K 时的时间戳。

我编写了一个脚本(见下文),它似乎在 K、L、M、N、O 列上运行良好,但是当我将脚本更改为适用于 F、G、H、I、J 列时,我得到了H 和 J 列中的时间戳,但我没有得到 Col G 和 I 中的用户名,这似乎很奇怪。有人可以看看这里有什么问题吗?

function onEdit(event) {
  var name = event.range.getSheet().getName();
  switch (name) {
    case "AA":
      update(event)
      break;
  }
}


function update(event){

  var ColK = 11;  // Column Number of "K"

  var changedRange = SpreadsheetApp.getActiveRange();
  if (changedRange.getColumn() == ColK) {
  if (changedRange.getRowIndex() >=7 ) {
    // An edit has occurred in Column J
    var state = changedRange.getValue();
    var adjacentDate = SpreadsheetApp.getActive().getSheetByName("AA").getRange(changedRange.getRow(),ColK+4);
    var adjacentDate2 = SpreadsheetApp.getActive().getSheetByName("AA").getRange(changedRange.getRow(),ColK+2);
    var adjacentLDAP = SpreadsheetApp.getActive().getSheetByName("AA").getRange(changedRange.getRow(),ColK+3);
    var adjacentLDAP2 = SpreadsheetApp.getActive().getSheetByName("AA").getRange(changedRange.getRow(),ColK+1);
    var timestamp = new Date(); // Get the current time

    adjacentDate2.setValue(timestamp);
    adjacentLDAP2.setValue(Session.getActiveUser().getEmail());

    if (adjacentDate.getValue() == "") {

        // Write timestamp into adjacent cell
        adjacentDate.setValue(timestamp);
        adjacentLDAP.setValue(Session.getActiveUser().getEmail());
    }
  }
    }
}

【问题讨论】:

  • 同一个单元格不能编辑几十次吗?这似乎是一种非常低效的做事方式,不是吗?为什么不在相同的两列中附加名称和时间戳,用逗号分隔?
  • 是的,我只是想看看原始数据的输入时间和数据最后一次更改的时间。每次数据更改时,我都不需要时间戳。另外,我还需要计算上次更新和原始查询之间的日期,因此用逗号将它们分隔在同一列中对我来说不起作用。
  • 我将 getActiveUser 更改为 getEffectiveUser 并且代码现在可以工作了!

标签: google-apps-script google-sheets timestamp


【解决方案1】:

我建议您使用类似的东西,因为您可能有多个编辑,并且您很容易用完列。然后,您可以使用一个简单的公式来提取第一个或最后一个编辑,如果需要容易看到。

var triggerSheet = "AA"; //trigger sheet
var triggerRow = 7; //trigger row
var ColK = 11;  // trigger column
var ColL = 12;  // comma seperated users
var ColM = 13;  // comma seperated time stamps

function onEdit(event) {
  var name = event.range.getSheet().getName();
  switch (name) {
    case triggerSheet:
      update(event)
      break;
  }
}

function update(event){
  var changedRange = SpreadsheetApp.getActiveRange();
  if (changedRange.getColumn() == ColK) {
    if (changedRange.getRowIndex() >=triggerRow ) {
      var state = changedRange.getValue();
      var users = SpreadsheetApp.getActive().getSheetByName(triggerSheet).getRange(changedRange.getRow(),ColL);
      var times = SpreadsheetApp.getActive().getSheetByName(triggerSheet).getRange(changedRange.getRow(),ColM);
      var timestamp = new Date(); // Get the current time
      var originalUsers = users.getValue();
      var originalTimes = times.getValue();
      times.setValue(originalTimes+timestamp+",");
      users.setValue(originalUsers+Session.getActiveUser().getEmail()+",");
    }
  }
}

【讨论】:

  • 谢谢,我不需要所有的编辑。唯一相关的时间戳是数据最初输入单元格的时间和数据最后更新的时间。这些是唯一需要用户名的 2 个时间戳。
  • 我尝试了上面的代码,就像我说的那样,它在一个单元格中给了我时间戳,这不是我需要的,但感谢代码!我还注意到它只是提到“,”而不是用户名,所以我认为它出于某种原因没有选择用户名
  • @user12333294 如果它返回空白,这是一个安全问题,但是您设置了工作表“如果安全策略不允许访问用户的身份,User.getEmail() 返回一个空白字符串。 "另外,如果您只返回第一个和最后一个编辑,那将不是很有用,因为有人可能会不小心在下面的单元格上按 Enter 键以删除最后一个编辑......但您是说您真的想要第一个创建和最后修改的列?通过记录所有更改,如果您可以修复安全问题,您可以轻松地从此历史记录列中提取这些更改。
猜你喜欢
  • 1970-01-01
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多