2017-09-06 42 views
2

我是编程的新手,我意识到它可能是一个愚蠢的,但我似乎无法找到解决方案。 我在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); 
} 

所以不是每一个动作后,输入我的名字,我希望它把我的名字在会议开始,并用它在整个会议进行添加到时间戳。

+0

如果'onOpen'是一个回调函数,从它返回没有什么意义。您需要覆盖全局变量或其他一些机制。 – Carcigenicate

+0

同时会有多个用户吗?这些用户是否会登录Google帐户? –

回答

2

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

非常感谢你@Sandy!我们所有的用户都会使用Google帐户,所以它不应该是一个问题。 我有什么机会让这些时间戳成列表?我不打算导出它,只是为现有的时间戳添加新的时间戳,而不是覆盖它们。 – Norbert

+0

可以检索现有笔记,然后将新内容连接到现有笔记。查看更新的答案。您可以点击此帖子的绿色大检票标记,将我的答案标记为正确。 –

+0

嗨,桑迪,你有什么想法,为什么我会在每一轮添加两次注释?无论如何,我真的不明白这个特定的IF语句是如何工作的。你能向我澄清一下吗? – Norbert

相关问题