为了账号安全,请及时绑定邮箱和手机立即绑定

Apps 脚本:如何通过单击两个按钮循环加载对话框?

Apps 脚本:如何通过单击两个按钮循环加载对话框?

呼啦一阵风 2023-11-02 21:49:14
基本上,我正在比较两张表中的数据,因此我想显示一个对话框,其中包含两张表中两个单元格的数据和两个按钮,供用户选择哪个数据单元格是正确的。然后我想循环遍历一张纸与另一张纸不同的所有数据。如何显示包含数据的对话框,使脚本等待按下按钮,然后转到列表中的下一项?这是我到目前为止的脚本:<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>
查看完整描述

1 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

要在值不相等时显示对话框,您可以调用 HTML 服务在 Apps 脚本中创建 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 已更改为接受来自 Apps 脚本的值,示例代码如下:


<!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);

}


查看完整回答
反对 回复 2023-11-02
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信