1

編集時に1つのシートからデータを取得し、最近追加されたデータをScriptDbに配置するスクリプトがあります。

実際にシートを開いて編集すると、onEdit()トリガーが正常に起動します。

ただし、このシートはスクリプトを使用してプログラムで編集されます。onEdit()スクリプトによる編集に基づいて起動できますか?私はそうすることができませんでした。

onEdit()トリガーで起動されるスクリプトは次のとおりです。

function sheetWasEdited(event) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var lastRowValues = sheet.getRange(lastRow, 2, 1, 2).getValues()[0];
  CgcEmailDatabase.addEmail(now=lastRowValues[0].toString(), email=lastRowValues[1].toString());
}
4

1 に答える 1

2

sheetWasEdited()onEdit トリガーは、実際のユーザーがスプレッドシートを編集するときに機能することを目的としています。最新のものが同じプロジェクトの一部である場合、他の関数から関数を呼び出すだけで、記述したユース ケースを簡単に実装できるはずです。

変更が別のプロジェクト (別のスプレッドシートまたは Web アプリ) から行われた場合は、配置が非常に難しくなります。(それがあなたのユースケースであるかどうか私たちに知らせてください)


あなたのコメントに続いて編集してください:

アイデアは、シートの長さを監視し、値をどこかに (スクリプト プロパティなどに) 保持し、行が追加された場合は関数を呼び出すことです。

この小さなコードでうまくいくはずですlookatsheet()。反応する必要がある速度に応じて、時々呼び出すようにタイムトリガーを設定する必要があります... 1時間ごとまたは30分ごとは多すぎるべきではないと思います。 .

function lookatsheet(){
  var ss = SpreadsheetApp.openById('xxxxxxxxxxxxxxxxxxxxx');// the ID of the SS you want to look at
  var sh = ss.getSheets()[0];// first sheet
  var lastrow = sh.getLastRow();
  var formertest = ScriptProperties.getProperty('lastTest');// recover the value from the last test (will need to get called once to initiate a valid value)
  if (formertest < lastrow){
    sheetWasEdited(lastrow);// call your function with lastRow as parameter
    ScriptProperties.setProperties({'lastTest': lastrow}, true);   // store for next time
}
}

function sheetWasEdited(row) {  // modified to work with the other function
  var sheet = SpreadsheetApp.openById('xxxxxxxxxxxxxxxxxxxxx').getSheets()[0]
  var lastRowValues = sheet.getRange(row, 2, 1, 2).getValues()[0];
  CgcEmailDatabase.addEmail(now=lastRowValues[0].toString(), email=lastRowValues[1].toString());
}

注: 最初の実行時にメール呼び出しにコメントを付けて、メールの送信を回避すると便利な場合があります (スクリプト プロパティを開始するためだけに)。

于 2013-01-04T21:10:47.303 に答える