Почему ‘google.script.run’ не работает с тегом html body ‘onload’?

#javascript #html #google-apps-script #google-sheets

#javascript #HTML #google-apps-script #google-sheets

Вопрос:

Я написал функцию для Google Sheet (в редакторе сценариев Листа), в которой пользователь выбирает ячейку, запускает функцию из пользовательского меню, а затем появляется html-форма с текстом из выбранной ячейки и соседней ячейки в форме.

Вот это самое ‘Code.gs » досье:

 function reviewApplication() {
  var html = HtmlService.createHtmlOutputFromFile('Index').setSandboxMode(HtmlService.SandboxMode.IFRAME);
  SpreadsheetApp.getUi().showModalDialog(html, 'Review PD Application');
}

function getTitleInfo() {
  return SpreadsheetApp.getActiveRange().getValue();
}

function getTeacherInfo() {
  var aRow = SpreadsheetApp.getActiveRange().getRow();
  return SpreadsheetApp.getActiveSheet().getRange(aRow, 5).getValue();
}
 

И вот это самое ‘Index.html » досье:

 <!DOCTYPE html>
<html>
 <head>
  <script>
   function onTitle(title) {
     if (title == '') {return; }
     document.getElementById("title").innerHTML = title;
     google.script.run.withSuccessHandler(onTeacher).getTeacherInfo();
   }
      
   function onTeacher(name) {
     if (name == '') { return; }
     document.getElementById("teachername").innerHTML = name;
   }
   </script>
 </head>
 <body onload="google.script.run.withSuccessHandler(onTitle).getTitleInfo()">
  <form name="myform">
   Title: <a id="title"></a><br>
   Teacher: <a id="teachername"></a><br>
   Decision: 
    <select id="decisionlist" name="decision">
     <option value="blank"></option>
     <option value="Approved">Approved</option>
     <option value="Returned for Review">Returned for Review</option>
     <option value="Not Approved">Not Approved</option>
    </select><br>
   Comments:
    <textarea name="comments" rows="4" cols="50"></textarea><br>
    <input id="button" type="button" value="Submit" onclick="inputOkay(myform.elements['decision'].value, myform.elements['comments'].value)"/>
  </form>
 </body>
</html>
 

Проблема в том, что когда пользовательский интерфейс появляется вместе с формой, элементы ‘title’ и ‘teachername’ формы пусты, но предполагается, что они должны быть заполнены текстом в этой строке электронной таблицы. Когда я просматриваю стенограмму выполнения, функция ‘reviewApplication’ выполняется успешно, но функция ‘getTitleInfo’ завершается сбоем, а длительность составляет 0 секунд. Знаете ли вы, почему на данный момент он терпит неудачу?

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

Вот изображение, показывающее, что функция ‘reviewPD’ запускается, но затем функция ‘getTitleInfo’ завершается с ошибкой.

Скриншот журнала выполнения

Комментарии:

1. Что заставляет вас думать, что, кроме указанной продолжительности, getTitleInfo происходит сбой?

2. Не могли бы вы поделиться электронной таблицей или ее копией?

3. @TheMaster, я обновил опубликованный скриншот журнала выполнения, показывающий, что ‘reviewPD’ запускается, но ‘getTitleInfo’ каждый раз завершается сбоем. Я сделал то, что предложил Купер в ответе (если getTitleInfo просто возвращает строку вместо получения значения из электронной таблицы, но это также не работает. В конечном счете, форма, которая появляется в пользовательском интерфейсе, пуста для полей Title и Teacher. Итак, по какой-то причине onload =»google.script.run» не работает должным образом. Может ли это быть временная проблема? Например, один процесс не завершается до того, как может начаться другой?

4. @Kessy, ниже приведена ссылка на копию таблицы Google. Пользователь выбирает заголовок PD (столбец H), а затем нажимает ‘reviewApplication’ из меню пользовательских надстроек. Таким образом, функция ‘getTitleInfo’ возвращает значение в активном диапазоне (например, Математическая конференция), а затем ‘getTeacherInfo’ возвращает значение в столбце 5 активной строки (имя учителя). docs.google.com/spreadsheets/d /…

5. В случае getTitleInfo() сбоя в журнале выполнения будет указана причина. Нажмите на сбой => должно появиться выпадающее меню. Если это не так, вам нужно переключить свой проект Google cloud на стандартный и использовать stackdriver logging.

Ответ №1:

Мне это понравилось, и это сработало.

GS:

 function reviewApplication() {
  var html = HtmlService.createHtmlOutputFromFile('ah3');
  SpreadsheetApp.getUi().showModalDialog(html,'Review PD Application');
}

function getTitleInfo() {
  return 'Teacher Title';
}

function getTeacherInfo() {
  
  return 'Hello World';
}
 

HTML:

 <!DOCTYPE html>
<html>
 <head>
  <script>
   function onTitle(title) {
     if (title == '') {return; }
     document.getElementById("title").innerHTML = title;
     google.script.run.withSuccessHandler(onTeacher).getTeacherInfo();
   }
      
   function onTeacher(name) {
     if (name == '') { return; }
     document.getElementById("teachername").innerHTML = name;
   }
   </script>
 </head>
 <body onload="google.script.run.withSuccessHandler(onTitle).getTitleInfo()">
  <form name="myform">
   Title: <a id="title"></a><br>
   Teacher: <a id="teachername"></a><br>
   Decision: 
    <select id="decisionlist" name="decision">
     <option value="blank"></option>
     <option value="Approved">Approved</option>
     <option value="Returned for Review">Returned for Review</option>
     <option value="Not Approved">Not Approved</option>
    </select><br>
   Comments:
    <textarea name="comments" rows="4" cols="50"></textarea><br>
    <input id="button" type="button" value="Submit" onclick="inputOkay(myform.elements['decision'].value, myform.elements['comments'].value)"/>
  </form>
 </body>
</html>
 

Должно быть, что-то не так с тем, как вы получаете данные.

Попробуйте протестировать getTeacherInfo() или getTeacherInfo() самостоятельно, чтобы убедиться, что это работает

введите описание изображения здесь

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

Код:

 function reviewApplication() {
  var html = HtmlService.createHtmlOutputFromFile('ah3');
  SpreadsheetApp.getUi().showModalDialog(html,'Review PD Application');
}

function getTeacherInfo() {
  const ss=SpreadsheetApp.getActive();
  const sh=ss.getActiveSheet();
  const row=sh.getActiveRange().getRow();
  return sh.getRange(row,5).getValue();
}

function getTitleInfo() {
  return SpreadsheetApp.getActiveRange().getValue();
}
 

HTML:

 <!DOCTYPE html>
<html>
 <head>
  <script>
   function onTitle(title) {
     if (title == '') {return; }
     document.getElementById("title").innerHTML = title;
     google.script.run.withSuccessHandler(onTeacher).getTeacherInfo();
   }
      
   function onTeacher(name) {
     if (name == '') { return; }
     document.getElementById("teachername").innerHTML = name;
   }
   </script>
 </head>
 <body onload="google.script.run.withSuccessHandler(onTitle).getTitleInfo()">
  <form name="myform">
   Title: <a id="title"></a><br>
   Teacher: <a id="teachername"></a><br>
   Decision: 
    <select id="decisionlist" name="decision">
     <option value="blank"></option>
     <option value="Approved">Approved</option>
     <option value="Returned for Review">Returned for Review</option>
     <option value="Not Approved">Not Approved</option>
    </select><br>
   Comments:
    <textarea name="comments" rows="4" cols="50"></textarea><br>
    <input id="button" type="button" value="Submit" onclick="inputOkay(myform.elements['decision'].value, myform.elements['comments'].value)"/>
  </form>
 </body>
</html>
 

Комментарии:

1. Я просто попытался сделать то, что вы предложили, вернув строку из getTitleInfo и getTeacherInfo (вместо получения значения из электронной таблицы). Но это также не работает. Поэтому я думаю, что проблема заключается в вызове getTitleInfo в первую очередь. По какой-то причине onload =»google.script.run» не вызывает getTitleInfo. Это странно, потому что это работает для вас, и это ранее работало для меня до прошлых выходных.

2. Вы получили правильное имя файла html? Я только что попробовал это снова, и у меня это работает. Имя html-файла ‘ah3.html ‘

3. Да, я получил правильное имя файла html, и он импортирует html. Итак, появляется форма, в ней просто нет «Teacher Title» и «Hello World», предварительно загруженных в форму. И когда я проверяю журналы выполнения, это похоже на изображение в моем исходном сообщении. Это показывает, что ‘reviewApplication’ выполняется успешно, но ‘getTitleInfo’ завершается с ошибкой.