2017-09-06 1 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 계정에 서명하지 않은 경우 스프레드 시트는 누가 스프레드 시트를 사용하고 있는지 알 수 없으므로 알 수 없습니다. 검색 할 이름.

여러 사용자가 사용자가 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

안녕하세요. Sandy, 매주 두 번씩 메모를 추가해야하는 이유는 무엇입니까? 어쨌든, 나는이 IF 문이 어떻게 작동하는지 이해하지 못합니다. 그걸 나에게 분명히 보여 주시겠습니까? – Norbert

관련 문제