На листе Google у меня есть форма боковой панели, позволяющая пользователю добавлять информацию на другой лист. Я должен указать идентификатор для каждой строки, поэтому, когда пользователь добавляет его, сгенерируйте новый идентификатор.
пример :
форма боковой панели имеет два входа: номер критерия (int) и критерий (текст). когда пользователь добавляет эти входные данные, я хочу поместить их на лист с 3 столбцами: A = ID, B = номер критерия и C = критерий.
Чтобы сгенерировать идентификатор, я создал функцию creeID() на стороне сервера (эта функция проверяет последний идентификатор на листе и генерирует следующий идентификатор, хорошо работает при тестировании), и я должен вызывать ее, когда пользователь добавляет строку ( кнопку "отменить"), чтобы получить вкладку с этим форматом [ID, criterion number, criterion] и нажать эту вкладку на листе с помощью appendRow()
Я подумал, что могу использовать скрипт Google, запускаемый с .withSuccessHandler(), как сказано здесь , и я попробовал кое-что, основанное на помощи @Tanaike и этого видео.
Кажется, все работает нормально, за исключением того, что google.script.run.withSuccessHandler(data => {alert("preuve ajoutée")}).creeID() возвращается null
вот мой html файл:
<!DOCTYPE html>
<html>
<head>
<base target = "_top">
<style>
...
</style>
</head>
<body>
<p>Indicateur</p>
<input type = "number" name = "indicateur" id = "indic" value = "" min = "1" max = "32">
<p>Preuve</p>
<input type = "text" name = "preuve" id = "preuve">
<br>
<input type = "button" value = "Ajouter" onclick = "ajouter()">
<span class = "annuler" onclick = "google.script.host.close()">Annuler</span>
<script>
function ajouter() {
const inputs = document.querySelectorAll('#indic, #preuve');
let tab = [google.script.run.withSuccessHandler(data => {alert("preuve ajoutée")}).creeID()];
// Récupération des valeurs
for (const input of inputs) {
tab.push(input.value);
}
// Si tous les champs sont vides
if (tab.join('') == '') {
alert('Le formulaire est vide !');
return;
}
// Vider les champs
inputs.forEach(input => input.value = '');
// Envoi dans la feuille
google.script.run.ajouterLigne(tab);
}
</script>
</body>
</html>
и код javascript:
function ajouterLigne(tab) {
const PREUVES = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PREUVES");
console.info(tab)
PREUVES.appendRow(tab);
}
function creeID() {
const SHEET = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("PREUVES");
let lastRow = SHEET.getLastRow();
let lastIdRange = SHEET.getRange(lastRow, 1);
let lastId = lastIdRange.getValue();
let newId;
if (lastId == "ID") {
newId = 1;
} else {
newId = lastId + 1;
};
return(newId)
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В случае вашего скрипта google.script.run.creeID() не возвращает значения. Я думаю, что это причина вашей текущей проблемы. Из maybe I should use .withSuccessHandler() like said here but I don't know how., как насчет использования withSuccessHandler() следующим образом?
В этом случае измените ajouter() вашего Javascript следующим образом.
function ajouter() {
const inputs = document.querySelectorAll('input[type = "text"]');
google.script.run.withSuccessHandler(tab => {
tab = [tab];
for (const input of inputs) {
tab.push(input.value);
}
if (tab.join('') == '') {
alert('Le formulaire est vide !');
return;
}
inputs.forEach(input => input.value = '');
google.script.run.ajouterLigne(tab);
}).creeID();
}
tab, а значения tab и введенные значения добавляются в электронную таблицу.@mthgn Спасибо за ответ. Что касается With your solution, only the user input are in tab, моя предложенная модификация взята из вашего демонстрационного сценария для объяснения вашего вопроса о I should use .withSuccessHandler() like said here but I don't know how.. Прошу прощения за это. Что касается but it doesn't seem to work, I need creeID() to return a value (id) and to put it in tab at the first index., я думаю, что это может быть ваш фактический ожидаемый результат. Но я не могу этого понять. Итак, можете ли вы предоставить подробную информацию о вашем фактическом ожидаемом результате? Исходя из этого, я хотел бы изменить его.
@mthgn Я хотел бы поддержать тебя. Итак, если вы можете сотрудничать, чтобы решить ваш вопрос, я рад. Можете ли вы сотрудничать, чтобы решить эту проблему?
спасибо за вашу помощь и извините за задержку ... Я отредактировал вопрос, надеюсь, это поможет вам понять, что мне нужно.
@mthgn Спасибо за ответ. Из вашего ответа и обновленного вопроса я понял, что вы добавили еще один вопрос. В ваш вопрос включены следующие 2 вопроса. 1. Вы хотите удалить проблему google.script.run.function() returning null. 2. Вы хотите добиться example :. Когда я увидела example :, к сожалению, я не могу этого понять. Прошу прощения за мое плохое знание английского. Для того, чтобы правильно понять ваш дополнительный вопрос, у меня есть следующие 3 вопроса. Я хотел бы придумать решение, правильно поняв ваш дополнительный вопрос.
@mthgn 1. О the sidebar form has to inputs : criterion number (int) and criterion (text)., в вашем показе HTML существует 2 ввода текста. Ваш фактический HTML отличается от отображаемого HTML? 2. Что касается when a user add these inputs, I want to put them in another sheet with 3 columns : ID, criterion number and criterion., я не могу знать, где столбцы ID, criterion number and criterion помещаются в электронную таблицу. 3. Я не могу понять I have to run it on the client side in order to have a tab with this format [ID, criterion number, criterion]. Могу я узнать подробности?
еще раз спасибо за вашу помощь и не беспокойтесь о ваших знаниях английского языка, мои не так хороши. Я отредактировал вопрос на основе ваших вопросов. столбцы A, B и C в электронной таблице, и единственная оставшаяся проблема заключается в том, что google.script.run.withSuccessHandler(data => {alert("preuve ajoutée")}).creeID() возвращает null
@mthgn Спасибо за ответ и обновление вопроса. Из вашего обновленного вопроса вы вводите число и строку в 2 входных тега, и вы хотите получить следующий идентификационный номер и хотите добавить значение, например ["newIDNumber", "indicateur", "preuve"], к листу «PREUVES». Если я правильно понимаю, когда используется ваш обновленный сценарий, пожалуйста, измените предложенный мной сценарий следующим образом. От const inputs = document.querySelectorAll('input[type = "text"]'); до const inputs = document.querySelectorAll('#indic, #preuve');. На этом я думаю, что ваша цель достигнута.
Как вы можете видеть в моем коде, все в порядке с const inputs = document.querySelectorAll('#indic, #preuve'); проблема в том, что вкладка может быть [null, input1, input2] вместо [ID, input1, input2]
Давайте продолжим обсуждение в чате.
Спасибо, но это не работает, мне нужно, чтобы CreeID() возвращал значение (id) и помещал его на вкладку в первом индексе. В вашем решении на вкладке находится только пользовательский ввод