Программно созданный триггер предназначен только для текущего файла, несмотря на предоставление ключа другого файла - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь программно создать триггер для таблицы Google, когда форма отправляется с кодом из другой таблицы, но она не работает. Вот мой код:

function createOnFormSubmitTrigger()
{
  //Id of "Spreadsheet 1"
  var ssId = "18bq-67nP4y7F9Hp4jzpbKPCyAsR6hglgcfmxCi_zj14";

  ScriptApp.newTrigger("formInput").forSpreadsheet(ssId).onFormSubmit().create();
}

Если я помещу этот метод в «Таблицу 1» и запустите его, он будет работать нормально и создаст сценарий в Таблице 1, как и предполагалось. Однако, если я добавлю этот метод, скажем, в «Таблицу 2» и запустим его, он создаст триггер в Таблице 2 вместо Таблицы 1, что не так, как предполагалось. Что я делаю не так?

Вот код для formInput для оригинального скрипта и фиктивного скрипта, который я сделал для тестирования:

Оригинал:

function formInput()
{
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();

  var inSheet = spreadSheet.getSheetByName("Form Responses");

  var data = inSheet.getSheetValues(2,2,1,7);

  var minutes = data[0][0];
  var seconds = data[0][1];
  var numMissed = data[0][2];
  var sgIncorrect = data[0][3];
  var sfMissed = data[0][4];
  var year = data[0][5];
  var testLevel = data[0][6];
  var date = new Date();

  var outSheet = spreadSheet.getSheetByName(testLevel);

  var testLevelExists = (outSheet != null);

  if(testLevelExists)
  {
    outSheet.insertRowBefore(2);
    outSheet.getRange(2,1).setValue(date.getMonth()+1+ "/" + date.getDate());
    outSheet.getRange(2,2).setValue(year);
    var secStr = ("0" + seconds);
    outSheet.getRange(2,3).setValue(minutes + ":" + secStr.substring(secStr.length-2));
    outSheet.getRange(2,4).setValue(numMissed);
    outSheet.getRange(2,5).setValue(sgIncorrect);
    outSheet.getRange(2,6).setValue(sfMissed);
    outSheet.getRange(2,7).setValue(350-7*(sgIncorrect+numMissed)-2*(sfMissed));
    shiftBox(outSheet);
    setFormulas(outSheet);
    updateAverageTime(outSheet);
    inSheet.deleteRow(2);
    copyToMaster(spreadSheet,outSheet);
  }
}

пустышки:

function formInput()
{
  var hi = "hello";
}

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Я бы хотел прежде всего поблагодарить @JSmith за его помощь. Похоже, я неправильно понял создание новых триггеров с помощью API ScriptApp. Когда сценарий создан, он связывает триггер с действиями, выполняемыми на целевом листе, но код должен быть на исходном листе, который создал триггер. Триггер также отображается только на листе, на котором создан триггер.

0 голосов
/ 03 сентября 2018

Как видно вместе,

попробуйте все свои функции из Google IDE один раз.

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

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