Googleスプレッドシートでは、いくつかのスクリプト機能を追加できます。 onEdit
イベントに何かを追加していますが、機能しているかどうかわかりません。私の知る限り、Googleスプレッドシートからライブイベントをデバッグすることはできません。したがって、onEdit()
関数に渡されるイベント引数は常に未定義になるため、デバッガーから実行する必要があります。 Script Editor
から実行します。
したがって、onEdit
関数が呼び出されるたびにLogger.log
メソッドを使用してデータを記録しようとしましたが、これもScript Editor
から実行した場合にのみ機能するようです。 Script Editor
から実行すると、View->Logs...
に移動してログを表示できます
私は、イベントが実際に実行されたときからログを見ることができることを望んでいましたが、それを理解することはできません。
このようなものをデバッグするにはどうすればよいですか?
UPDATE:
this answerに書かれているように、
Stackdriver Logging が現在のロギングの推奨方法です。
console.log()
を使用してStackdriverにログインします。
Logger.log
は、スクリプトで発生したエラーの(最終的に)メールを送信するか、Script Editor
から実行している場合は、最後に実行した関数からログを表示できます。 View->Logs
へ(まだスクリプトエディターで)。繰り返しますが、最後に実行した関数からScript Editor
から記録されたもののみが表示されます。
私が仕事をしようとしていたスクリプトはスプレッドシートに関係していました-優先度などでアイテムをソートするスプレッドシートのtodo-checklistタイプのものを作りました。
そのスクリプト用にインストールしたトリガーは、onOpenおよびonEditトリガーのみでした。 onEditトリガーのデバッグは、onEdit関数にブレークポイントを設定し、スプレッドシートを開き、セルを編集すると、ブレークポイントがトリガーされると考え続けたため、把握するのが最も困難でした。これはそうではありません。
セルを編集したことをシミュレートするために、Ididは実際のスプレッドシートで何かをする必要があります。 「編集済み」として処理するセルが選択されていることを確認し、Script Editor
でRun->onEdit
に移動しました。次に、ブレークポイントにヒットします。
ただし、onEdit関数に渡されるイベント引数の使用を停止する必要がありました。Run->onEdit
を実行しても、それをシミュレートすることはできません。選択したセルなど、スプレッドシートから必要な情報はすべて、手動で把握する必要がありました。
とにかく、長い答えですが、私は最終的にそれを見つけました。
編集:
私が作成したtodoチェックリストを表示したい場合は、 こちらで確認してください
(はい、誰でも編集できることを知っています-それが共有のポイントです!)
スクリプトも見られるといいのですが。そこに見えないので、ここにあります:
function onOpen() {
setCheckboxes();
};
function setCheckboxes() {
var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
var checklist_data_range = checklist.getDataRange();
var checklist_num_rows = checklist_data_range.getNumRows();
Logger.log("checklist num rows: " + checklist_num_rows);
var coredata = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
var coredata_data_range = coredata.getDataRange();
for(var i = 0 ; i < checklist_num_rows-1; i++) {
var split = checklist_data_range.getCell(i+2, 3).getValue().split(" || ");
var item_id = split[split.length - 1];
if(item_id != "") {
item_id = parseInt(item_id);
Logger.log("setting value at ("+(i+2)+",2) to " + coredata_data_range.getCell(item_id+1, 3).getValue());
checklist_data_range.getCell(i+2,2).setValue(coredata_data_range.getCell(item_id+1, 3).getValue());
}
}
}
function onEdit() {
Logger.log("TESTING TESTING ON EDIT");
var active_sheet = SpreadsheetApp.getActiveSheet();
if(active_sheet.getName() == "checklist") {
var active_range = SpreadsheetApp.getActiveSheet().getActiveRange();
Logger.log("active_range: " + active_range);
Logger.log("active range col: " + active_range.getColumn() + "active range row: " + active_range.getRow());
Logger.log("active_range.value: " + active_range.getCell(1, 1).getValue());
Logger.log("active_range. colidx: " + active_range.getColumnIndex());
if(active_range.getCell(1,1).getValue() == "?" || active_range.getCell(1,1).getValue() == "?") {
Logger.log("made it!");
var next_cell = active_sheet.getRange(active_range.getRow(), active_range.getColumn()+1, 1, 1).getCell(1,1);
var val = next_cell.getValue();
Logger.log("val: " + val);
var splits = val.split(" || ");
var item_id = splits[splits.length-1];
Logger.log("item_id: " + item_id);
var core_data = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("core_data");
var sheet_data_range = core_data.getDataRange();
var num_rows = sheet_data_range.getNumRows();
var sheet_values = sheet_data_range.getValues();
Logger.log("num_rows: " + num_rows);
for(var i = 0; i < num_rows; i++) {
Logger.log("sheet_values[" + (i) + "][" + (8) + "] = " + sheet_values[i][8]);
if(sheet_values[i][8] == item_id) {
Logger.log("found it! tyring to set it...");
sheet_data_range.getCell(i+1, 2+1).setValue(active_range.getCell(1,1).getValue());
}
}
}
}
setCheckboxes();
};
私の知る限り、Google Docsからライブイベントをデバッグすることはできません。したがって、デバッガから実行する必要があります。これは、onEdit()関数に渡されるイベント引数は、スクリプトエディタから。
True-デバッグ用に自分でイベント引数を定義します。 GASでトリガー関数をテストするにはどうすればよいですか を参照してください
OnEdit関数が呼び出されるたびにLogger.logメソッドを使用してデータを記録しようとしましたが、これもスクリプトエディターから実行した場合にのみ機能するようです。スクリプトエディタから実行すると、[表示]-> [ログ]に移動してログを表示できます。
再び本当ですが、助けがあります。 Peter Hermannの BetterLog library は、すべてのログをスプレッドシートにリダイレクトし、エディター/デバッガーのインスタンスに接続されていないコードからでもログを記録できるようにします。
たとえば、スプレッドシートを含むスクリプトでコーディングしている場合、スクリプトファイルの先頭にこの1行だけを追加すると、すべてのログがスプレッドシートの「ログ」シートに記録されます。他のコードは必要ありません。通常どおりLogger.log()
を使用してください:
Logger = BetterLog.useSpreadsheet();
2017 Update:Stackdriver Logging がGoogle Apps Scriptで利用可能になりました。スクリプトエディターのメニューバーから、[View > Stackdriver Logging
]に移動して、ログを表示またはストリーミングします。
console.log() はDEBUG
レベルのメッセージを書き込みます
例onEdit()
ロギング:
function onEdit (e) {
var debug_e = {
authMode: e.authMode,
range: e.range.getA1Notation(),
source: e.source.getId(),
user: e.user,
value: e.value,
oldValue: e. oldValue
}
console.log({message: 'onEdit() Event Object', eventObject: debug_e});
}
次に、 Stackdriver UIonEdit() Event Object
というラベルのログを確認して、出力を確認します
スクリプトエディタを開いている場合は、[表示]-> [ログ]の下にログが表示されます。スクリプトにoneditトリガーがある場合は、2番目のタブで開かれたスクリプトエディターで関数をトリガーするスプレッドシートに変更を加えます。次に、スクリプトエディターのタブに移動して、ログを開きます。関数がロガーに渡すものはすべて表示されます。
基本的に、スクリプトエディタが開いている限り、イベントはログに書き込み、表示します。他の誰かがファイル内の他の場所にいる場合は表示されません。
少しハックしますが、「コンソール」と呼ばれる配列を作成し、コンソールに出力したいときはいつでも配列にプッシュしました。その後、実際の出力を確認したいときはいつでも、以前に返されたものの代わりにconsole
を返しました。
//return 'console' //uncomment to output console
return "actual output";
}
私は同じ問題を抱えています、私はどこかでウェブ上で以下を見つけました....
ただし、ドキュメントのイベントハンドラーは少し注意が必要です。ドキュメントは複数のユーザーによる複数の同時編集を処理できるため、イベントハンドラーはサーバー側で処理されます。この構造の主な問題は、イベントトリガースクリプトが失敗すると、サーバーで失敗することです。デバッグ情報を表示する場合は、イベントが失敗した場合にサイレント情報で失敗したときにデバッグ情報をメールで送信するトリガーメニューで明示的なトリガーを設定する必要があります。
洗練されたものとはほど遠いですが、デバッグ中にしばしばLoggerにログを記録し、 getLog() を使用してその内容を取得します。次に、私は:
基本的に、それは単に JavaScript出力 の問題になります。
それは現代のconsole.log()
実装の機能を大きく欠いていますが、ロガーはまだGoogleスクリプトのデバッグを支援します。
現在、ドキュメント内でスクリプトを使用するコンテナにバインドされた性質に制限されています。ドキュメントの外部で新しいスクリプトを作成すると、Googleスプレッドシートに情報をエクスポートして、ロギングツールのように使用できるようになります。
たとえば、最初のコードブロックで
function setCheckboxes() {
// Add your spreadsheet data
var errorSheet = SpreadsheetApp.openById('EnterSpreadSheetIDHere').getSheetByName('EnterSheetNameHere');
var cell = errorSheet.getRange('A1').offset(errorSheet.getLastRow(),0);
// existing code
var checklist = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("checklist");
var checklist_data_range = checklist.getDataRange();
var checklist_num_rows = checklist_data_range.getNumRows();
// existing logger
Logger.log("checklist num rows: " + checklist_num_rows);
//We can pass the information to the sheet using cell.setValue()
cell.setValue(new Date() + "Checklist num rows: " + checklist_num_rows);
GASを使用しているとき、GAS環境を含むモニターとSSを含むモニターを2つのモニター(2つのウィンドウを使用できます)でセットアップし、情報の書き込みとログ記録を行えるようにします。
ちょうど通知として。スプレッドシートのテスト関数を作成しました。 onEdit(e)関数でgoogle throws変数を使用します(eと呼びます)。次に、次のようなテスト関数を作成しました。
function test(){
var testRange = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,7)
var testObject = {
range:testRange,
value:"someValue"
}
onEdit(testObject)
SpreadsheetApp.getActiveSpreadsheet().getSheetByName(GetItemInfoSheetName).getRange(2,6).setValue(Logger.getLog())
}
このテスト関数を呼び出すと、スプレッドシートでイベントが発生したときにすべてのコードが実行されます。編集したセルの位置に入れただけで、予期しない結果が出ました。値をセルに入力した値として設定しました。 OBS! googlesが関数に与えるその他の変数については、こちらをご覧ください: https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events
開発コンソールは、アプリスクリプトによってスローされたエラーをログに記録するため、エラーをスローして、通常のconsole.logとしてログに記録することができます。実行は停止しますが、ステップバイステップのデバッグには引き続き役立つ場合があります。
throw Error('hello world!');
console.log('hello world')
と同様にコンソールに表示されます