2012-06-16 5 views
2

이전 버전의에 액세스 할 수 있는지 여부를 알고 싶습니다. 이전 범위의 값을 수정 된 범위의 값으로 이전 값과 비교할 수 있는지 알고 싶습니다. 유효성 검사를위한 범위.onEdit 수정 된 셀의 이전 값에 대한 이벤트 객체 액세스?

도움 주셔서 감사합니다.

은 onEdit (이벤트)

function onEdit(event) 
/* Default onEdit Event function */ 
{ 
    var ssa = SpreadsheetApp.getActiveSpreadsheet(); 
    var ss = event.source.getActiveSheet(); 
    var r = event.source.getActiveRange(); 
... 

답변

2

--edit는이 가능해 보인다 울부 짖는 링크와 의견을보실하시기 바랍니다.

자세한 내용은 here 문서를 참조하십시오.

하지만 이전 값은 이벤트에서 사용할 수 없습니다. 이 문제에 관해 열린 enhancement request이 있습니다. 업데이트 및 투표 종류를 추적하기 위해 "별표 표시"해야합니다.

이제 "해결 방법"으로 이동하십시오. 이 모든 것은 원래 데이터를 다른 곳에 저장해야한다는 사실을 기반으로합니다. 스프레드 시트 또는 시트를 거울로 만들 수 있으며 원본에서 onEdit이 발생하면 미러로 이동하여 이전 값을 얻을 수 있습니다. 스크립트를 통해 미러 스프레드 시트를 업데이트해야하므로 스프레드 시트의 모든 이벤트가 onEdit 개의 이벤트를 트리거하지는 않으므로 보이는 것보다 조금 복잡합니다. 행 삽입 따라서 스크립트는 사용법에 따라 가능하지 않을 수도 있습니다.

+0

감사 : 여기서

코드이다. 나는 향상 요청을 "봤다". 나는이 문서에 대한 링크를 알고 있었지만, 이것 만이 아니었을지라도! ;-) – VanacK

+2

[Issue # 47 on issue 200] (https://code.google.com/p/google-apps-script-issues/issues/detail?id=200#c47)에 따르면 동일한 문제 Henrique에 의해 참조 된, 이제는 onEdit (e) ... e.oldValue를 사용하여 이전 값에 접근 할 수 있습니다. –

+0

e.oldValue 사용하기 나는 '정의되지 않음'을 얻고 있습니다. 제발 도와주세요 –

1

onLoad() 정보를 저장하기 위해 ScriptDB를 사용하고 onEdit()을 다시 읽을 수 있습니다. 편집 할 때마다 onLoad()을 다시 호출하여 셀 값의 데이터베이스를 다시 새로 고치거나 데이터베이스의 관련 정보를 바꿀 수 있습니다.

리소스> 모든 트리거 메뉴에서 FromSpreadsheet> onEdit() 이벤트를 트리거하려면 을 추가하십시오. 피드백 용

function onLoad() { 

    var db = ScriptDb.getMyDb() 

    //get array of the sheet range that has something in it 
    var sheet = SpreadsheetApp.getActiveSheet() 
    var lastrow = sheet.getLastRow() 
    var lastcolumn = sheet.getLastColumn() 
    var subsheet = sheet.getRange(1, 1, lastrow, lastcolumn) 
    var values = subsheet.getValues() 

    //write that array into the ScriptDB of the project 
     for (i=1; i<=lastrow; i++){ 
     for (j=1; j<=lastcolumn; j++){ 
      var object = {type: "onEditfudge", row: i, column:j, value:values[i-1][j-1]} 
      db.save(object) 
      Logger.log(object) //log it to check its correct.. 
     } 
     }  
} 

function BeforeonEdit(){ 

    db = ScriptDb.getMyDb() 
    var newrange = SpreadsheetApp.getActiveRange() 


    //get 'old value' 
    var dbentry = db.query({type: "onEditfudge", row:newrange.getRow(),column:newrange.getColumn()}).next() 
    var oldvalue = dbentry.value  

    //overwrite the 'old value' with the 'new value' for the next onEdit() event 
dbentry.value = newrange.getValue() 
db.save(dbentry) 

//return the old value to do something with in the calling function 
return oldvalue 
} 

function notonEdit(){ 

    //show new and old value  
    Browser.msgBox("Old value is: " + BeforeonEdit() + ". New Value is: " + SpreadsheetApp.getActiveRange().getValue()) 

} 
+0

아이디어를 제공해 주셔서 감사합니다.하지만 제 경우에는 실용적이지 않은 것으로 나타났습니다. 스프레드 시트에 45 시트가 거의 있습니다. 내 스프레드 시트가 큽니다. 나는 당신의 방법이 너무 느릴 것이라고 생각합니다. – VanacK

+0

개체를 개별적으로 저장하는 대신 일괄 적으로 저장하는 것이 좋습니다. 성능이 향상 될 수 있습니다.하지만 시작과 동시에 모든 것이 이루어져야하므로 스프레드 시트를 사용하는 동안 DB의 크기에 따라 레이턴시가 없어야합니다 그 자체. 'saveBatch (jsData, atomic)'[여기] (https://developers.google.com/apps-script/class_scriptdbinstance#saveBatch)를 참조하십시오. – tomrobpowell

관련 문제