#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’ завершается с ошибкой.