15

Google Apps Script の基本的なツールの 1 つは、スプレッドシートの onEdit トリガーです。これにより、ユーザーがセルを編集したことを検出し、それに反応することができます。

ユーザーが行または列を挿入するときはどうですか? それを検出する方法はありますか?

それは onEdit を引き起こしますか?もしそうなら、ScriptDb で行数または列数のカウントを維持し、毎回チェックすることはできると思いますが、getMaxRows() はすでにかなり遅いため、ScriptDb に手を差し伸べるのは次のようになるため、非常に時間がかかります。良い。

どう思いますか ?

4

5 に答える 5

20

トリガーされない編集アクションが多数ありますonEdit()。これは包括的なリストではありません。さらに多くの除外が報告されています。

  • フォーム送信の問題 4568
  • 行または列の挿入または削除Issue 1363
  • 外観の変更 (フォント、フォーマット、配置、境界線) Issue 2476
  • 範囲の塗りつぶし (たとえば、1、2、3 で開始します。これらのセルを選択し、「ハンドル」をドラッグしてさらにセルを 4、5、6 で塗りつぶします...) Issue 399
  • スクリプトによって書き込まれる値。338号
  • 問題 1754を検索/置換
  • 1568号、1119号

スプレッドシートの行数を知りたい場合は、実行に約 120 ミリ秒かかります。

var numCols = SpreadsheetApp.getActiveSheet().getRange("1:1").getLastColumn();
var numRows = SpreadsheetApp.getActiveSheet().getRange("A:A").getLastRow();

ScriptDB を使用するよりもシートに値を書き込む方が高速であることは既に示しました。約 1 ミリ秒の小さな範囲を書き込むのに、わずかな時間がかかると予想できます。

したがって、行または列が追加されていることを検出できれば変更を登録するのに 10 分の 2 秒もかかりません。これonEdit()は、スプレッドシートの範囲を測定する手法を示し、シートの寸法の変化を報告します。(行または列をテスト、追加または削除してから、 をトリガーする編集を行いますonEdit()。) タイマーも含まれています。値を測定および/または保存する他の方法を自由に試して、最適な方法を確認してください。

function onEdit() {
  // Use start & stop to time operations
  var start = new Date().getTime();

  // We want the size of the sheet, so will select ranges across and down the
  // whole sheet. Cannot use getDataRange(), as it selects only occupied cells.
  var numCols = SpreadsheetApp.getActiveSheet().getRange("1:1").getLastColumn()
  var numRows = SpreadsheetApp.getActiveSheet().getRange("A:A").getLastRow();

  var stop = new Date().getTime();
  var timeToMeasure = (stop-start);

  // Did things change?
  var oldSize = SpreadsheetApp.getActiveSheet().getRange("A1:B1").getValues();
  if (oldSize[0][0] != numCols || oldSize[0][1] != numRows) {
    // Yes, they did - Let's store the new dimensions
    start = new Date().getTime();

    SpreadsheetApp.getActiveSheet().getRange("A1:B1").setValues([[numCols,numRows]]);

    var stop = new Date().getTime();
    var timeToStore = (stop-start);  

    Browser.msgBox("Sheet is "+numCols+" by "+numRows+"."
                  +" ("+timeToMeasure+"ms to measure, "+timeToStore+"ms to store.)");
  }
}
于 2013-03-05T21:37:46.433 に答える
3

スクリプトに許可を与えるまで、これに問題がありました。そうしないと、PropertiesService 機能が動作しません。実行すると、次のコードでどの行が挿入されたかを検出できました。

var props = PropertiesService.getUserProperties();

function onEdit(e) {
  props.setProperty("firstRow", e.range.getRow());
  props.setProperty("lastRow", e.range.getLastRow());
}


function onChange(e){
if(e.changeType=="INSERT_ROW")
    SpreadsheetApp.getUi().alert("Inserted Rows: " +
                                 props.getProperty("firstRow") + 
                                 " - " +
                                 props.getProperty("lastRow"));
}
于 2016-11-01T20:42:47.127 に答える