Сценарий приложений: как зацикливать диалоговые окна по нажатию двух кнопок?

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

Как показать диалог с данными, заставить скрипт ждать нажатия кнопки и затем переходить к следующему пункту в списке?

Это сценарий, который у меня есть до сих пор:

<script>
  function myfunction() {
    google.script.run.withSuccessHandler(qcComparison).qcGetData();
  }

  function qcComparison(sheetsData) {
    var sheet1 = sheetsData["sheet1"];
    var sheet2 = sheetsData["sheet2"];
    var lastRow = sheet1.length;
    var lastCol = sheet1[0].length

    var headers = sheet1[0];

    for (var row=1; row<=lastRow; row++) {
      for (var col=0; col<lastCol; col++) {
      // Do the comparison one cell at a time
        var value1 = sheet1[row][col];
        var value2 = sheet1[row][col];

        if (value1 != value2) {
          // Do something
        }
      }
    }
  }
  document.addEventListener("DOMContentLoaded", myfunction());
</script>

И это диалоговое окно HTML, которое я хочу обновить с помощью данных:

     <table id = "qc-table" class = "qc-table">
        <tr>
          <td><button id = "sheet-1" class = "btn btn-primary btn-sm">Sheet 1</button></td>
          <td class = "profile-data"><p id = "sheet-1-profile">Data from cell 1</p></td>
        </tr>
        <tr>
          <td><button id = "sheet-2" class = "btn btn-secondary btn-sm">Sheet 2</button></td>
          <td class = "profile-data"><p id = "sheet-2-profile">Data form cell 2</p></td>
        </tr>
      </table>
Поведение ключевого слова "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) для оценки ваших знаний,...
0
0
552
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Чтобы отобразить диалоговое окно, когда значения не равны, вы можете вызвать службу HTML для создания HTML в скрипте приложений, а затем использовать getUi().showModalDialog.

Обновлено: for циклы — не лучшее решение, поскольку они будут продолжать выполняться, пока открыто диалоговое окно. В этом случае лучше использовать рекурсию.

Пример кода ниже:

var sheet1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
var range1 = sheet1.getRange(1,1,sheet1.getLastRow(),sheet1.getLastColumn()).getValues();
var range2 = sheet2.getRange(1,1,sheet2.getLastRow(),sheet2.getLastColumn()).getValues();

function qcComparison() {
    var row = 0, col = 0;
    compare(row, col);
}

function compare(row, col) {
    Logger.log(row, col);
    if (range1[row][col] != range2[row][col]) {
          Logger.log("Different values!");
          var html = HtmlService.createTemplateFromFile("page");
          html.row = row;
          html.col = col;
          html.cell1 = range1[row][col];
          html.cell2 = range2[row][col];
          var htmlOutput = html.evaluate();
          SpreadsheetApp.getUi().showModalDialog(htmlOutput, 'Choice');
    }
    else {
          compareNext(row, col);
    }
}

function compareNext(row, col) {
    Logger.log("Compare next", row, col);
    if (col < range1[row].length) {
      if (row < range1[col].length-1) {
            compare(++row, col);
      }
      else {
            row = 0;
            compare(row, ++col);
      }
    }
    return;
}

HTML изменен, чтобы принимать значения из скрипта приложений, пример кода ниже:

<!DOCTYPE html>
<html>
  <head>
    <base target = "_top">
  </head>
  <body>
         <table id = "qc-table" class = "qc-table">
        <tr>
          <td>
            <button id = "sheet-1" class = "btn btn-primary btn-sm" onclick = "google.script.run.setSheet1(<?=row?>,<?=col?>,<?=cell1?>);google.script.host.close();">Sheet 1</button></td>
          <td class = "profile-data"><p id = "sheet-1-profile">Data from Sheet 1: <?=cell1?>   </p></td>
        </tr>
        <tr>
          <td><button id = "sheet-2" class = "btn btn-secondary btn-sm" onclick = "google.script.run.setSheet2(<?=row?>,<?=col?>,<?=cell2?>);google.script.host.close();">Sheet 2</button></td>
          <td class = "profile-data"><p id = "sheet-2-profile">Data from Sheet 2: <?=cell2?>   </p></td>
        </tr>
      </table>
  </body>
</html>

Обратите внимание, что скрипт теперь запускает функции при нажатии на Лист 1 или Лист 2 для обновления значений:

function setSheet1(row, col, value) {
    sheet2.getRange(++row,++col).setValue(value);
    compareNext(--row, --col);
}

function setSheet2(row, col, value) {
    sheet1.getRange(++row,++col).setValue(value);
    compareNext(--row, --col);
}

Использованная литература:

showModalDialog()

HTML-шаблон

Связь между HTML и скриптом приложений

Загрузка данных в диалог не является проблемой (хотя использование этих скриптлетов является хорошей альтернативой, о которой я не знал). Я сомневаюсь, как заставить скрипт «ждать» нажатия одной из кнопок, чтобы перейти к следующей итерации в цикле для отображения следующих значений данных.

everspader 10.12.2020 10:25

@everspader Нашел решение для скрипта ждать ввода из диалогового окна :) Отредактированный ответ.

CMB 10.12.2020 17:38

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

everspader 11.12.2020 09:02

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