По сути, я сравниваю данные на двух листах, поэтому я хочу показать диалоговое окно с данными двух ячеек с двух листов и две кнопки, чтобы пользователь мог выбрать, какая ячейка данных верна. Затем я хотел бы перебрать все данные, которые отличались от одного листа к другому.
Как показать диалог с данными, заставить скрипт ждать нажатия кнопки и затем переходить к следующему пункту в списке?
Это сценарий, который у меня есть до сих пор:
<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>
Чтобы отобразить диалоговое окно, когда значения не равны, вы можете вызвать службу 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);
}
Использованная литература:
Связь между HTML и скриптом приложений
@everspader Нашел решение для скрипта ждать ввода из диалогового окна :) Отредактированный ответ.
это было хорошим решением. Мне просто нужно было настроить несколько вещей, таких как индексы, но все работает отлично. Мне интересно, могу ли я поместить этот скрипт в HTML и продолжать изменять текст элементов вместо того, чтобы каждый раз загружать страницу, чтобы сделать ее быстрее.
Загрузка данных в диалог не является проблемой (хотя использование этих скриптлетов является хорошей альтернативой, о которой я не знал). Я сомневаюсь, как заставить скрипт «ждать» нажатия одной из кнопок, чтобы перейти к следующей итерации в цикле для отображения следующих значений данных.