Как для отладки скрипта приложений Google (иначе причем тут регистратор.войти в журнал?)


в Google Sheets вы можете добавить некоторые функции сценариев. Я добавляю что-то для onEdit событие, но я не могу сказать, если это работает. Насколько я могу судить, Вы не можете отлаживать живое событие из Google Sheets, поэтому вам нужно сделать это из отладчика, что бессмысленно, так как аргумент события передается в my onEdit() функция всегда будет неопределенной, если я запускаю ее из Script Editor.

Итак, я пытался использовать Logger.log метод для регистрации некоторых данных всякий раз, когда onEdit функция вызывается, но это тоже кажется, что он работает только при запуске из Script Editor. Когда я запускаю его из Script Editor, Я могу просматривать журналы, перейдя в View->Logs...

Я надеялся, что смогу увидеть журналы с момента фактического выполнения события, но я не могу понять это.

как мне отладить этот материал?

10 83

10 ответов:

Logger.log либо отправит вам по электронной почте (в конечном итоге) ошибки, которые произошли в ваших сценариях, или, если вы запускаете вещи из Script Editor, вы можете просмотреть журнал из функции последнего запуска, перейдя в View->Logs (еще в Редакторе сценариев). Опять же, это покажет вам только то, что было зарегистрировано из последней функции, которую вы запустили внутри Script Editor.

скрипт, который я пытался заставить работать, был связан с электронными таблицами - я сделал электронную таблицу todo-тип контрольного списка, который сортирует элементы по приоритетам и т. д.

единственными триггерами, которые я установил для этого скрипта, были триггеры onOpen и onEdit. Отладка триггера onEdit была самой сложной, потому что я продолжал думать, что если я установлю точку останова в своей функции onEdit, открою электронную таблицу, отредактирую ячейку, то моя точка останова будет вызвана. Но это не так.

чтобы имитировать редактирование ячейки, я сделал в конечном итоге, чтобы сделать что-то в реальной таблице, хотя. Все, что я сделал, это убедиться, что ячейка, которую я хотел, чтобы она рассматривалась как "отредактированная", была выбрана, а затем в Script Editor, Я бы поехал в Run->onEdit. Тогда моя точка останова будет хит.

однако мне пришлось прекратить использовать аргумент события, который передается в функцию onEdit - вы не можете имитировать это, делая 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();
};

насколько я могу судить, Вы не можете отлаживать живое событие из google docs, поэтому вам нужно сделать это из отладчика, что бессмысленно, поскольку аргумент события, переданный моей функции onEdit (), всегда будет неопределенным, если я запускаю его из редактора сценариев.

True - поэтому определите аргумент события самостоятельно для отладки. Смотрите как я могу проверить функцию триггера в Газе?

Я пытался использовать регистратор.метод журнала для регистрации некоторых данные всякий раз, когда вызывается функция onEdit, но это тоже похоже на то, что она работает только при запуске из редактора сценариев. Когда я запускаю его из редактора сценариев, я могу просматривать журналы, перейдя в View->Logs...

снова верно, но есть помощь. Петра Германа библиотека BetterLog перенаправляет все журналы в электронную таблицу, позволяя вести журнал даже из кода, который не прикреплен к экземпляру редактора / отладчика.

Если вы кодируете в a например, вы можете добавить только эту строку в верхнюю часть файла сценария, и все журналы перейдут на лист "журналы" в электронной таблице. Никакой другой код не требуется, просто используйте Logger.log() как обычно:

Logger = BetterLog.useSpreadsheet();

обновление 2017: Stackdriver Logging теперь доступен для сценария Google Apps. Из строки меню в Редакторе сценариев, перейти: View > Stackdriver Logging для просмотра или поток бревна.

Если у вас открыт редактор скриптов, вы увидите журналы в разделе вид->журналы. Если ваш скрипт имеет триггер onedit, внесите изменения в электронную таблицу, которая должна вызвать функцию с помощью редактора скриптов, открытого на второй вкладке. Затем перейдите на вкладку редактор сценариев и откройте журнал. Вы увидите все, что ваша функция передает регистратору.

в основном, пока открыт редактор сценариев, событие будет записывать в журнал и показывать его для вас. Это не покажет, если кто-то остальное находится в файле в другом месте.

немного хаки, но я создал массив под названием "консоль", и в любое время, когда я хотел вывести на консоль, я нажал на массив. Затем, когда я хотел увидеть фактический результат, я просто вернулся console вместо того, что я вернулся раньше.

    //return 'console' //uncomment to output console
    return "actual output";
}

У меня такая же проблема, я нашел ниже в интернете где-то....

обработчики событий в документах немного сложнее, хотя. Поскольку документы могут обрабатывать несколько одновременных изменений несколькими пользователями, обработчики событий обрабатываются на стороне сервера. Основная проблема с этой структурой заключается в том, что при сбое сценария триггера событий происходит сбой на сервере. Если вы хотите увидеть информацию об отладке, вам нужно настроить явный триггер в меню триггеры, которое отправляет вам отладку информация когда событие происходит, иначе его просто не будет.

это далеко не элегантно, но во время отладки я часто регистрируюсь в регистраторе, а затем использую getLog() извлечь его содержимое. Тогда я тоже:

  • сохраните результаты в переменную (которую можно проверить в отладчике Google Scripts-это работает вокруг случаев, когда я не могу установить точку останова в каком-либо коде, но я можете в код, который выполняется позже)
  • запишите его в какой-то временный элемент DOM
  • отобразить его в предупреждение

по сути, он просто становится JavaScript output вопрос.

ему грубо не хватает функциональности modern console.log() реализации, но регистратор по-прежнему помогает отлаживать Скрипты Google.

В настоящее время вы ограничены контейнерным характером использования скриптов в документах. Если вы создадите новый скрипт внутри за пределами docs, вы сможете экспортировать информацию в электронную таблицу 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);

когда я работаю с газом, у меня есть два монитора (вы можете использовать два окна), один из которых содержит газовую среду, а другой - SS, поэтому я могу писать информация и журнал.

просто как уведомление. Я сделал тестовую функцию для моей таблицы. Я использую переменную, которую google бросает в функцию onEdit(e) (я назвал ее 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())
}

вызов этой тестовой функции заставляет весь код работать так, как у вас было событие в электронной таблице. Я просто поместил в ячейку, которую я редактировал, whitch дал мне неожиданный результат, установив значение как значение, которое я поместил в ячейку. Обс! для большего количества переменных googles дает функции go здесь: https://developers.google.com/apps-script/guides/triggers/events#google_sheets_events

консоль разработчика будет регистрировать ошибки, вызванные сценарием приложения, поэтому вы можете просто выдать ошибку, чтобы она была зарегистрирована как обычная консоль.бревно. Он остановит выполнение, но все равно может быть полезен для пошаговой отладки.

throw Error('hello world!');

появится в консоли аналогично console.log('hello world')