[解決済み] Google Apps Scriptのデバッグ方法(別名:Logger.logはどこに記録されるのか?)
質問
Google Sheetsでは、いくつかのスクリプト機能を追加することができます。のために何かを追加しています。
onEdit
というイベントがあるのですが、うまくいっているのかどうかがわかりません。私が知る限り、Google Sheetsからライブイベントをデバッグすることはできないので、デバッガから行う必要がある。
onEdit()
関数から実行すると、常に未定義になります。
Script Editor
.
ということで、私が使おうとしていたのは
Logger.log
メソッドでデータを記録することができます。
onEdit
関数が呼び出されたときにのみ動作するようです。
Script Editor
. から実行すると
Script Editor
にアクセスすると、ログを見ることができます。
View->Logs...
実際にイベントが実行されたときのログが見られると思ったのですが、わからないです。
こんなのどうやってデバッグすればいいんだ?
どのように解決するのですか?
UPDATEしてください。
に書かれているように これ の答えになります。
-
スタックドライバログ は、現在推奨されているログの記録方法です。
-
使用方法
console.log()
をクリックしてStackdriverにログインしてください。
Logger.log
は、スクリプトで発生したエラーを (最終的には) メールで送るか、あるいは
Script Editor
にアクセスすると、最後に実行した関数のログを見ることができます。
View->Logs
(スクリプトエディタのまま)。繰り返しますが、最後に実行した関数から記録されたものだけが表示されます。
の中から
Script Editor
.
私が動かそうとしていたスクリプトは、スプレッドシートと関係がありました。スプレッドシートのTodo-Checklistタイプのものを作って、優先順位などで項目をソートしていたんです。
そのスクリプトにインストールしたトリガーは、onOpenとonEditだけでした。onEditトリガーのデバッグが一番大変でした。なぜなら、onEdit関数にブレークポイントを設定し、スプレッドシートを開いてセルを編集すれば、ブレークポイントがトリガーされるとずっと思っていたからです。これは事実ではありません。
セルを編集したことをシミュレートするために、私は
した
結局、実際のスプレッドシートで何かする必要があるんですけどね。私がしたことは、編集済みとして扱わせたいセルが選択されていることを確認し、次に
Script Editor
に移動します。
Run->onEdit
. そうすれば、私のブレークポイントがヒットするはずです。
しかし、onEdit関数に渡されるevent引数を使うのをやめなければなりませんでした。
Run->onEdit
. どのセルが選択されたかなど、スプレッドシートから必要な情報はすべて手動で把握する必要がありました。
とにかく、長い答えになりましたが、最終的には解決しました。
EDIT :
私が作った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();
};
関連
-
0xC0000005: 場所 0x00ef1000 の読み取りでアクセス違反が発生しました。
-
g++ エラー解析: '{' トークンの前にクラス名があることが予想されます。
-
[解決済み】Google Chromeでデバッグ時にスクリプトの実行を終了させる方法は?
-
[解決済み] デバッガとはどのようなものですか?
-
[解決済み] クローム Uncaught SyntaxError: 予期しない入力の終了
-
[解決済み] Vim起動時間のプロファイリング
-
[解決済み] gdbで複数のコマンドを何らかのデリミタ';'で区切る?
-
[解決済み] なぜデバッグはIDEで行うのが良いのか?[クローズド]
-
[解決済み] Android Studio IDE。例外発生時のブレーク
-
[解決済み] dSYMとは何か、どう使うか?(iOS SDK)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
g++ コンパイルエラー解析 期待される型指定子 before
-
[解決済み] Chrome Developer Toolsでstatus=canceled for a resourceとはどういう意味ですか?
-
[解決済み] Chromeのデベロッパーツールでiframeをデバッグする
-
[解決済み] デバッガとはどのようなものですか?
-
[解決済み] Chromeの開発ツールです。[VM] javascriptからファイル
-
[解決済み] Google Apps Scriptのデバッグ方法(別名:Logger.logはどこに記録されるのか?)
-
[解決済み] gdbで複数のコマンドを何らかのデリミタ';'で区切る?
-
[解決済み] Mac OS X 用の Fiddler のような HTTP/HTTPS 傍受ツールはありますか?[クローズド]
-
[解決済み] Android Studio IDE。例外発生時のブレーク
-
[解決済み] MPIプログラムのデバッグはどのように行うのですか?