2012-06-16 1 views
1

원래 onEdit() 이벤트 내에서 셀 값을 얻는 방법이 있는지 알고 싶습니다.onEdit()에서 셀의 원래 값을 가져 오는 방법이 있습니까?

예를 들어

:

  • 셀 A1의 현재 값이 "안녕하세요"
  • I 편집 A1을 나는로부터 값을 얻을 때, 지금은이 "세계"
  • 을 변경하여입니다 활성 범위, 나는 "세계"를 얻을거야

그러나 나는 또한 원래의 가치, 즉 "안녕하세요"를 얻을 수있는 가능성을 가지고 싶습니다. 현재 가능합니까? 당신이 도식적으로 셀의 값을 변경하면

+0

나는 ScriptDB를 사용하여이 작업을 수행 할 수있는 또 다른 방법으로 this post에 응답했습니다. – tomrobpowell

답변

0

, 당신은 그 셀에 주석으로 원래 값을 저장하기 위해는 setComment의 방법을 사용할 수 있습니다.

1

나는 그렇게 생각하지 않습니다.

나는 당신 '은 onEdit'기능이 종료 될 때 자동으로 업데이트 두 번째 시트에 시트의 정확한 복사본을함으로써 그 기능을 얻을 수 상상. 업데이트가 완료 될 때까지 두 번째 시트의 데이터는 이전 값을 갖습니다. ? 왜 안 약간 까다로운하지만 -)

편집은 다음 '오늘의 문제'가 될 것으로 보인다 this post을보고 엔리케 아브레유의 관련 코멘트. 가까운이에 올 것

2

유일한 코드는 초기 값 저장하는으로 onOpen 출구를 사용하는 것입니다. 초기 값은 여러 가지 방법으로 저장 될 수 있습니다. 거기에 은 "사용자 속성"입니다. 나는 그들이 어떻게 일하는지 아직 모른다. 나는 이것에 초보적이다.

는 또한 "으로 onOpen"출구에서 값을 저장하기 위해 "숨겨진"시트를 사용할 수 있습니다. 내가 알지 못하는 다른 방법이있을 수 있습니다. 원래 값을 저장할 하는

이 문제는 세포의 증가와 함께 더 어려워진다.

그런데 "ONOpen"루틴이 스프레드 시트가 열릴 때 발생한다는 점을 이해해야합니다. 따라서 최종 사용자도 액세스 할 수 있으며 은 onOpen 핸들러가 실행을 완료하기 전에 셀 값을 변경할 수 있습니다. 은 초기 값을 모두 포착 할 수 없습니다.

마지막으로 알아야 할 것이 하나 있습니다. UNDO 또는 REDO 이벤트가 발생할 때 onEdit 트리거가 시작되지 않습니다. 세포의 내용은 변할 수 있고 그것을 알 수 없습니다.

나는 검증 루틴이 어떻게 작동하는지 알지 못합니다. 루틴이 값을 거부하면 스프레드 시트가 원래 값으로 복원됩니까? 그렇다면 onOpen 문제가 발생할 수 있습니다. 사용자에게 값이 유효하지 않다고 알려주면 많은 도움이되지 않습니다. 작동하지만 매우 복잡 할 수 있습니다 방법에 대한

정말 라운드 스프레드 시트 닫기 전에 이미지 를 저장하는 것입니다. 모든 "애프터"이미지를 두 번째 스프레드 시트에 게시합니다. 그런 다음 onEdit 핸들러에서 다른 스프레드 시트의 해당 셀을 봅니다. 그런 다음 이전 이미지를 복원하거나 새 이미지를 계속 진행할 수 있습니다.

마지막으로 두 번째 스프레드 시트 대신 데이터 표를 사용하는 것이 좋습니다.

저는이 모든 개념에 대해 배우기 때문에 구현 방법을 묻지 마십시오. 나는 그것이 가능할지도 모른다는 것을 이해한다. 코딩 및 지원을 위해 이 최선의 선택이 아닐 수도 있습니다. 그러나 현재 스크립트 서비스는 이미지 액세스 전에 을 제공하지 않기 때문에 내가 할 수있는 최선의 방법입니다. 이 Google 인터페이스는 클라이언트 - 서버 응용 프로그램이라는 것을 이해해야합니다. 스크립트는 서버에서 실행됩니다. 데이터 변경은 "클라이언트"(최종 사용자) 브라우저에서 발생합니다.

마지막주의 사항 : onEdit 트리거는 셀에 대한 UNDO 또는 REDO 변경에 대해 실행되지 않습니다. 그래서 셀이 변경 될 수 있으며 스크립트는이를 인식하지 못합니다.

1

단일 셀을 처리하는 경우 onEdit (e) 및 e.oldValue를 사용할 수 있습니다. 아래 예제에서는 셀을 편집 할 때 원래 값을 A1에 추가합니다. 셀이 비어 있으면 '정의되지 않음'.

function onEdit(e) { 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var sheet = ss.getActiveSheet(); 
    var cell = sheet.getActiveCell(); 
    var origValue = e.oldValue 
sheet.getRange('A1').setValue(origValue); 
}