Google.script.run.function() возвращает ноль

На листе 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)
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В случае вашего скрипта 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 и введенные значения добавляются в электронную таблицу.

Ссылка:

Спасибо, но это не работает, мне нужно, чтобы CreeID() возвращал значение (id) и помещал его на вкладку в первом индексе. В вашем решении на вкладке находится только пользовательский ввод

mthgn 02.06.2023 17:10

@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., я думаю, что это может быть ваш фактический ожидаемый результат. Но я не могу этого понять. Итак, можете ли вы предоставить подробную информацию о вашем фактическом ожидаемом результате? Исходя из этого, я хотел бы изменить его.

Tanaike 03.06.2023 02:11

@mthgn Я хотел бы поддержать тебя. Итак, если вы можете сотрудничать, чтобы решить ваш вопрос, я рад. Можете ли вы сотрудничать, чтобы решить эту проблему?

Tanaike 03.06.2023 02:49

спасибо за вашу помощь и извините за задержку ... Я отредактировал вопрос, надеюсь, это поможет вам понять, что мне нужно.

mthgn 05.06.2023 15:02

@mthgn Спасибо за ответ. Из вашего ответа и обновленного вопроса я понял, что вы добавили еще один вопрос. В ваш вопрос включены следующие 2 вопроса. 1. Вы хотите удалить проблему google.script.run.function() returning null. 2. Вы хотите добиться example :. Когда я увидела example :, к сожалению, я не могу этого понять. Прошу прощения за мое плохое знание английского. Для того, чтобы правильно понять ваш дополнительный вопрос, у меня есть следующие 3 вопроса. Я хотел бы придумать решение, правильно поняв ваш дополнительный вопрос.

Tanaike 06.06.2023 01:48

@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]. Могу я узнать подробности?

Tanaike 06.06.2023 01:48

еще раз спасибо за вашу помощь и не беспокойтесь о ваших знаниях английского языка, мои не так хороши. Я отредактировал вопрос на основе ваших вопросов. столбцы A, B и C в электронной таблице, и единственная оставшаяся проблема заключается в том, что google.script.run.withSuccessHandler(data => {alert("preuve ajoutée")}).creeID() возвращает null

mthgn 06.06.2023 09:54

@mthgn Спасибо за ответ и обновление вопроса. Из вашего обновленного вопроса вы вводите число и строку в 2 входных тега, и вы хотите получить следующий идентификационный номер и хотите добавить значение, например ["newIDNumber", "indicateur", "preuve"], к листу «PREUVES». Если я правильно понимаю, когда используется ваш обновленный сценарий, пожалуйста, измените предложенный мной сценарий следующим образом. От const inputs = document.querySelectorAll('input[type = "text"]'); до const inputs = document.querySelectorAll('#indic, #preuve');. На этом я думаю, что ваша цель достигнута.

Tanaike 06.06.2023 10:03

Как вы можете видеть в моем коде, все в порядке с const inputs = document.querySelectorAll('#indic, #preuve'); проблема в том, что вкладка может быть [null, input1, input2] вместо [ID, input1, input2]

mthgn 06.06.2023 10:37

Давайте продолжим обсуждение в чате.

mthgn 06.06.2023 13:11

Другие вопросы по теме