Проблема с запуском установленного триггера в скрипте приложения Google - PullRequest
0 голосов
/ 04 августа 2020

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

Это сценарий, который я создал, который я запускаю напрямую, чтобы активировать триггер:

function createTriggers() {
  
  ScriptApp.newTrigger('testTime')
      .timeBased()
      .everyMinutes(1)
      .create();
};

Функция, которую он вызывает, очень проста, я ее много использовал и тоже меняю:

var gSS = SpreadsheetApp.openById("this_1s/the.1d")

function testTime() {
  var d = new Date()
  var Start = d.getTime();
  
  gSS.toast(Start, "Testing", 30)
};

Итак, как это должно работать, и это произойдет, если я просто вызову функцию testTime напрямую, в рассматриваемой электронной таблице появится небольшое всплывающее окно с тостами, которое останется видимым в течение 30 секунд. Когда я запускаю триггерную функцию createTriggers, ничего не происходит ..

Пожалуйста, помогите! Весь код, который я написал, напрасен, если я не могу заставить его работать самостоятельно ..: (

***** EDIT - 04.08.20 - на основе комментариев **** *

Возможно, это был пример XY, я попытался запустить небольшой сегмент исходного кода, который работает, когда я запускаю его напрямую, и он здесь тоже не работает .. этот фрагмент не имеет интерфейса функций в нем, так что это не должно быть проблемой .. Все, что я сделал, это взял указанную выше функцию триггера и изменил имя на 'testClear', которое вызывает следующие функции:

function testClear(){
  sheetVars(1)
  clearSheetData(sheetSPChange)
};

function sheetVars(numSprints) {
  // returns the global vars for this script
  
  try {
    sheetNameSprints = "Name of Sprint Sheet"
    sheetNameSPChange = "Name of Story Point Change Sheet"
    sheetSprints = gSS.getSheetByName(sheetNameSprints)
    sheetSPChange = gSS.getSheetByName(sheetNameSPChange)
    arraySprints = iterateColumn(sheetSprints,"sprintIDSorted", 1, numSprints)
  }
  catch(err) {
    Logger.log(err)
  };
};

function iterateColumn(sheet, header, columnNum, numRows) {
  // Create an array of first column values to iterate through
  // numRows is an int, except for the string "all"
  
  var gData = sheet.getDataRange();
  var gVals = gData.getValues();
  var gLastR = ""
  var gArray = []
  
  
  // check how many rows to iterate
  
  if (numRows == "all") {
    gLastR = gData.getLastRow();
  }
  else {
    gLastR = numRows
  };
  
  // Iterate through each row of columnNum column
  
  for (i = 1; i < gLastR; i++){
    // iterate through
    
    if(gVals[i][columnNum] !== "" && gVals[i][columnNum] !== header){
      // push to array
      
      gArray.push(gVals[i][columnNum]);
    }
    else if (gVals[i][columnNum] == "") {
      break
    };
  };
  
  return gArray
};

function clearSheetData(sheet) {
  // Delete all rows with data in them in a sheet
    
  try {
    if (!sheet.getRange(sheet.getLastRow(),1).isBlank()){
      sheet.getRange(2, 1, sheet.getLastRow()-1, sheet.getLastColumn()-1).clearContent()
      Logger.log("Sheet cleared from old data.")
    }
    else {
      sheet.deleteRows(2, sheet.getLastRow()-1)
      Logger.log("Sheet rows deleted from old data.")
    };
  }
  catch(err){
    Logger.log(err)
    emailLogs()
  };
};

The ' Функция emailLogs является базовым c MailApp, поэтому я получаю уведомление о проблеме со скриптом:

function emailLogs() {
  // Email Nikita the loggs of the script on error
  
  var email = "my work email@jobbie"
  var subject = "Error in Sheet: " + gSS.getName()
  var message = Logger.getLog()
  MailApp.sendEmail(email, subject, message)
};

Благодаря комментарию я обнаружил страницу выполнения !!: D Это была ошибка для отредактированного скрипта.

4 августа 2020 г., 10:48:18 Исключение из ошибки: невозможно вызвать SpreadsheetApp.getUi () из этого контекста. при неизвестной функции

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Чтобы тост показывался каждый определенный «раз» (каждые n итераций), добавьте это к for l oop

if (!((i+1) % n)) spreadsheet.toast("Working...")

Из вопроса

4 августа 2020 г., 10:48:18 Исключение из ошибки: невозможно вызвать SpreadsheetApp.getUi () из этого контекста. at unknown function

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

Другими словами, toast нельзя использовать в триггере, управляемом по времени. Решение состоит в том, чтобы использовать код на стороне клиента, чтобы отображать это сообщение каждую минуту. Для этого вы можете использовать боковую панель и рекурсивную функцию, которая выполняет setTimeout

Ссылки

0 голосов
/ 04 августа 2020

На основе всех комментариев и новых вещей, которые я узнал из этого ..:

Я обращался к глобальной переменной для моей функции onOpen:

var gUI = SpreadsheetApp.getUi();

хотя я не использовал его для триггера, поскольку он был глобальным, он попытался запустить, а затем потерпел неудачу.

Я переместил фактическое определение gUI в функцию onOpen и попытался снова, и он сработал . Всем спасибо за поддержку!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...