如何在另一个函数onEdit

时间:2017-09-06 12:01:01

标签: javascript google-apps-script

我是编程的新手,我意识到它可能是一个愚蠢的,但我似乎无法找到解决方案。 我在Google表格中使用了onOpen触发器和onEdit触发器。 onOpen函数仅通过输入框从用户获取名称。 现在使用onEdit函数,我想将用户对单元格所做的所有更改加时间戳,同时将其名称添加到时间戳中。 我希望我的目标明确。

这是假设的代码:

function onOpen() {
  var id = Browser.inputBox('ID Check', 'Enter your name', Browser.Buttons.OK);

  return id
}

function onEdit() {
  // Set a comment on the edited cell to indicate when it was changed.
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getSheets()[0]
  var range = sheet.getActiveRange()

  // var name = onOpen().value;  .... this what i would like to get

  range.setNote('Last modified: ' + new Date() + name);
}

因此,我不希望在每次操作后输入我的名字,而是希望它在会话开始时使用我的名字,并在整个会话期间使用它将其添加到时间戳。

1 个答案:

答案 0 :(得分:2)

如果电子表格的用户都已登录其Google帐户,则可以将其名称保存到“用户属性”服务。如果多个用户同时使用电子表格,则即使代码使用相同的密钥名称,“用户属性”也会为该用户获取正确的名称。

如果用户未登录Google帐户,则无法使用“用户属性”。您可以将每个用户名保存到电子表格的“文档属性”中,但如果同一个电子表格中有多个用户未登录到Google帐户,则电子表格无法“知道”谁在使用电子表格,因此无法知道要检索的名称。

因此,如果多个用户同时使用同一个电子表格,那么知道要分配的名称的唯一方法是用户是否拥有Google帐户并且他们已登录。

以下代码显示如何从用户属性中保存并检索名称。

function onOpen() {
  var usrProps,sessionName;

  sessionName = Browser.inputBox('ID Check', 'Enter your name', Browser.Buttons.OK);

  if (!sessionName) {//The user did not enter a name
    sessionName = Session.getActiveUser().getEmail();//Get the logged in users email address

    sessionName = sessionName.slice(0,sessionName.indexOf("@"));//Remove domain part of email address
  }

  usrProps = PropertiesService.getUserProperties();//Get User Properties

  usrProps.setProperty('usrName', sessionName);//Save the user name with a key name

  return sessionName;
}

function onEdit() {
  var currentNote,newNote,sessionName,usrProps;

  // Set a comment on the edited cell to indicate when it was changed.
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getSheets()[0]
  var range = sheet.getActiveRange()

  // var name = onOpen().value;  .... this what i would like to get
  usrProps = PropertiesService.getUserProperties();//Get User Properties

  sessionName = usrProps.getProperty('usrName');//Get the user name for this user that was saved in onOpen

  currentNote = range.getNote();//Get current note

  if (currentNote) {
    newNote = currentNote + ' - Last modified: ' + new Date() + sessionName;
  } else {
    newNote = 'Last modified: ' + new Date() + sessionName;
  }

  range.clear({commentsOnly: true});//Clear existing comment
  range.setNote(newNote);
}