Javascript 如何使用函数';s值在另一个函数onEdit中

Javascript 如何使用函数';s值在另一个函数onEdit中,javascript,google-apps-script,Javascript,Google Apps Script,我是编程新手,我意识到这可能是一个愚蠢的问题,但我似乎找不到解决这个问题的办法。 我在googlesheets中使用onOpen触发器和onEdit触发器。 onOpen函数仅通过输入框从用户处获取名称。 现在使用onEdit函数,我希望在将用户的名字添加到时间戳时,为用户对单元格所做的所有更改添加时间戳。 我希望我清楚我的目标 下面是假定的代码: 函数onOpen(){ var id=Browser.inputBox('id Check','enteryourname',Browser.But

我是编程新手,我意识到这可能是一个愚蠢的问题,但我似乎找不到解决这个问题的办法。 我在googlesheets中使用onOpen触发器和onEdit触发器。 onOpen函数仅通过输入框从用户处获取名称。 现在使用onEdit函数,我希望在将用户的名字添加到时间戳时,为用户对单元格所做的所有更改添加时间戳。 我希望我清楚我的目标

下面是假定的代码:

函数onOpen(){ var id=Browser.inputBox('id Check','enteryourname',Browser.Buttons.OK'); 返回id } 函数onEdit(){ //在编辑的单元格上设置注释,以指示更改的时间。 var ss=SpreadsheetApp.getActiveSpreadsheet() var sheet=ss.getSheets()[0] var range=sheet.getActiveRange() //var name=onOpen().value;…这是我想要得到的 range.setNote('上次修改:'+新日期()+名称); }
因此,我不希望在每次操作后都输入我的名字,而是希望它在会话开始时使用我的名字,并在整个会话中使用它将其添加到时间戳中。

如果电子表格的用户都登录到他们的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);
}

如果onOpen是一个回调,那么从中返回没有多大意义。您需要覆盖全局变量或其他机制。是否同时有多个用户?这些用户是否会登录谷歌账户?非常感谢@Sandy!我们所有的用户都会使用谷歌账户,所以这不应该是个问题。我能把这些时间戳写进一个列表吗?我的意思不是导出它,只是向现有的时间戳添加新的时间戳,而不是覆盖它们。可以检索现有的便笺,然后将新内容连接到现有的便笺。请参阅更新的答案。你可以点击这篇文章的绿色大复选标记,将我的答案标记为正确。嗨,桑迪,你知道为什么我每轮都要加两次便条吗?无论如何,我真的不明白这个特殊的IF语句是如何工作的。你能向我澄清一下吗?也许你需要澄清现有的评论<代码>范围.clear({commentsOnly:true})//清除现有注释我不确定,我不处理这些注释。您可以通过单击绿色复选标记将答案标记为正确。