3

event.sourceオブジェクトに関する詳細なドキュメントが見つからないため、変更された範囲の以前の値にアクセスして、範囲の新しい値を検証のために範囲の古い値と比較できるかどうかを知りたいと思います。

ご協力いただきありがとうございます。

OnEdit(イベント)

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

3 に答える 3

3

--編集これは現在可能になっているようです。以下のリンクとコメントをご覧ください。

詳細については、こちらのドキュメントを参照してください。

ただし、イベントでは以前の値は使用できません。これに関して開かれた拡張要求があります。更新や投票の種類を追跡するには、「スター」を付ける必要があります。

さて、「回避策」へ。それらはすべて、元のデータを自分で別の場所に保存する必要があるという事実に基づいています。スプレッドシートまたはシートのミラーリングを行うことonEditができ、オリジナルで何かが発生した場合、ミラーリングに移動して古い値を取得できます。スクリプトを介してミラー スプレッドシートも更新する必要があるため、これは見た目よりも少し複雑ですが、スプレッドシートのすべてのイベントがonEditイベント (行の挿入など) をトリガーするわけではありません。したがって、スクリプトはそれらに追いつくために非常にスマートでなければなりませんが、使用状況によっては、それが不可能になることさえあります。

于 2012-06-16T22:49:50.820 に答える
0

ScriptDB を利用して情報を保存し、onLoad()それを読み返すことができますonEdit()。編集があるたびに、再度呼び出しonLoad()てセル値のデータベースを再度更新するか、データベース内の関連情報を単に置き換えることができます。

notonEdit()Resources>All Your Triggers メニューの 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()) 

}
于 2012-07-22T22:08:34.383 に答える
0

これは古い投稿ですが、検索中に最初に出てきたもので、それ以来実装されています。詳細については、ドキュメントhttps://developers.google.com/apps-script/guides/triggers/events#editをご覧ください。

[ドキュメントから] oldValue: 編集前のセル値 (存在する場合) でアクセスできます。編集された範囲が単一のセルである場合にのみ使用できます。セルに以前のコンテンツがなかった場合、未定義になります。

たとえば、次のスクリプトを使用して値をログに記録できます。

function onEdit(e){
  Logger.log(e.oldValue);
}

PS: 左側のメニューから [実行] に移動すると、ログを表示できます (下の画像を参照)。 メニューオプションのスクリーンショット

于 2022-02-07T06:31:05.840 に答える