在 Google 脚本中存储持久性 HTML 表单数据

Store persistent HTML form data in Google Script

我编写了一个 Google 脚本网络应用程序来将选定的 Gmail 标签备份到用户定义的 Google 驱动器位置。 Forml.html 以表格格式显示数据。每行都有索引(复选框)、标签和驱动器目标。

我们希望每行中的数据从一个页面加载到下一个页面持续存在,以便选定的行保持选中状态。在弄清楚如何使数据持久化之后,我可以构建一个触发器,使应用程序 运行 按计划运行并备份选定的标签。关于如何最好地实现随时间存储 HTML 表单数据的效果,有什么想法吗?我正在考虑使用属性服务,但我不知道如何更改初始 doGet 以在空白表单和具有预先存在的数据的表单之间进行选择。

Form.html

<div id="formDiv">
    <form id="myForm" target="_self">
        <table class="table table-hover">
            <thead>
                <tr>
                    <th scope="col">
                        <h3 span style="font-family:arial,helvetica,sans-serif;">Select</span></th>
                    <th scope="col">
                        <h3 span style="font-family:arial,helvetica,sans-serif;">Label</span></th>
                    <th scope="col">
                        <h3 span style="font-family:arial,helvetica,sans-serif;">Drive target</span></th>
                </tr>
            </thead>
            <tbody>
                <? var label = GmailApp.getUserLabels();
                   for (i = 0; i < label.length; i++) { ?>    
                <tr>
                    <td style="text-align: center;">
                        <span style="font-family:arial,helvetica,sans-serif;"><input id="index" type="checkbox" name="index" value="<?= [i]; ?>"  /></span></td>
                    <td>
                        <span style="font-family:arial,helvetica,sans-serif;"><input id="label" type="text" style="border:none" size="60" name="label" value="<?= label[i].getName(); ?>" readonly /></span></td>
                    <td>
                        <span style="font-family:arial,helvetica,sans-serif;">Gmail Backup/<input id="target" type="text" size="60" maxlength="128" name="target" value="<?= label[i].getName(); ?>" /></span></td>
                </tr>
                <? } ?>
            </tbody>
        </table>
        <p><input type="submit" value="Test" onclick="google.script.run.gmailBackup(this.parentNode.parentNode)" />   
        </p>
    </form>
</div>

Code.gs

    function doGet() {
      var template = HtmlService.createTemplateFromFile("Form")
      .evaluate()
      .setSandboxMode(HtmlService.SandboxMode.NATIVE);
      return template;
    }

    function gmailBackup(template) {
      // Set HTML form variables
      var indices = template.index;
      var labels = template.label;
      var targets = template.target;
      for (i = 0; i < indices.length; i++) {
        var index = indices[i].toString();
        var label = labels[indices[i]].toString();
        var target = "Gmail Backup/" + targets[indices[i]].toString();    
    ...
    }

我最终使用 PropertiesService 为每个用户存储 HTML 表单属性。这看起来会工作得很好(特别是一旦我准确地找到每个 的数据存储位置)。

来自Form.html

<input onclick="google.script.run.setProperties(this.parentNode.parentNode);" type="submit" value="Save" >

来自Code.gs

function setProperties(form) {
  var filledForm = PropertiesService.getUserProperties().setProperty("FORM", form);
}