首页 > 解决方案 > 将输入文本传递到客户端并保存为变量

问题描述

我创建了一个从 Google 表格导出 CSV 的脚本。此 CSV 被导出到 Drive 文件夹,我最初使用 var folder = DriveApp.getFolderById("ID goes here"); 在代码中放置了一个 ID。

现在,我想为我的用户动态设置导出位置。我还希望他们选择自动导出的频率。我创建了一个 html 文件并调用了一个对话框让用户输入他们想要的 ID 和频率。

function openFolderForm() {
 
  var html = HtmlService.createHtmlOutputFromFile('html')
        .setHeight(525)
        .setWidth(800);
  
  SpreadsheetApp.getUi().showModalDialog(html, 'Export Settings');
}

在 html 文件中,我有..

<form id="form">
    <div class="block form-group">
    <input type='text' name='IDdrive' id="IDdrive" style="width: 300px;"/>
    </div>
    <br>
    <p>Frequency?</p>

    <div> 
    <input type="radio" name="radio" id="radioDaily">
    <label for="radioDaily">Daily</label>
    </div>

    <div>
    <input type="radio" name="radio" id="radioWeekly">
    <label for="radioWeekly">Weekly</label>
    </div>

    <button type = "submit" class = "action"
      onClick="google.script.run.updateSettings();">Submit</button>
 </form>

最后,在我的代码中,我有...

function updateSettings(form) {
var formQ1 = form.IDdrive;
if (form.radioDaily == true) { var formQ2 = 1; } else { var formQ2 = 7}

};

function exportCSV() {
  var changelogSheetName = "data";
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var tab = ss.getSheetByName('data');
  var folder = DriveApp.getFolderById(formQ1); //putting in dynamic form
 etc etc etc

function createTimeTrigger() {
 ScriptApp.newTrigger("exportCSV")
  .timeBased()
  .atHour(3)
  .inTimezone("America/Los_Angeles")
  .everyDays(formQ2)  //input radio variable answer here
  .create();
}

};

但是,我的代码不起作用。表单答案的变量未成功传递到客户端。如果我直接输入 ID,代码确实有效。

我意识到这个问题已经在这个网站上以各种形式提出过,但我已经阅读了大部分这些主题,但仍然无法解决。有人可以帮助 Scripts App 新手吗?:)

下面的完整代码,以 .gs 开头:

function onOpen() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('Scripts')
      .addItem('Export CSV', 'exportCSV')
      .addItem('Update export settings', 'openFolderForm')
      .addToUi();
}

function openFolderForm() {
  var html = HtmlService.createHtmlOutputFromFile('html').setHeight(525).setWidth(800);
  SpreadsheetApp.getUi().showModalDialog(html, 'Export Settings');
  }

function updateSettings(form) {
var formQ1 = form.IDdrive;
if (form.radioDaily == true) { var formQ2 = 1; } else { var formQ2 = 7};
google.script.host.close();
};

function exportCSV() {
  var changelogSheetName = "data";
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var tab = ss.getSheetByName('data');
  var folder = DriveApp.getFolderById(formQ1);
  //export code here
}


function convertRangeToCsvFile_(csvFileName, sheet) {
  
  var activeRange = sheet.getDataRange();
  try {
    var data = activeRange.getValues();
    var csvFile = undefined;

    
    if (data.length > 1) {
      var csv = "";
      for (var row = 0; row < data.length; row++) {
        for (var col = 0; col < data[row].length; col++) {
          if (data[row][col].toString().indexOf(",") != -1) {
            data[row][col] = "\"" + data[row][col] + "\"";
          }
        }

      
        if (row < data.length-1) {
          csv += data[row].join(",") + "\r\n";
        }
        else {
          csv += data[row];
        }
      }
      csvFile = csv;
    }
    return csvFile;
  }
  catch(err) {
    Logger.log(err);
    Browser.msgBox(err);
  }
}

function createTrigger() {

  ScriptApp.newTrigger('exportCSV')
      .timeBased()
      .atHour(3)
      .everyDays(formQ2) //radio question here
      .inTimezone("America/Los_Angeles")
      .create();

和完整的HTML...

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
    <title><b>Output Folder</b></title>
  </head>
  <body>
  <p>Enter the ID of your output folder.  A Drive ID is made up by the characters after the last /folder/ in the URL</p>
  
    <form id="form">
    <div class="block form-group">
 
    <input type='text' name='IDdrive' id="IDdrive" style="width: 300px;"/>
    </div>

  <div> 
  <input type="radio" name="radio" id="radioDaily"> <label for="radioDaily">Daily</label>
  </div>
  <div>
  <input type="radio" name="radio" id="radioWeekly"> <label for="radioWeekly">Weekly</label>
  </div>

  <br>
  <div class="inline form-group">
  <input type="button" value="Submit" class="action" onClick="google.script.run.updateSettings();" /> //or "google.script.run.updateSettings(this.parentNode);"
  <input type="button" value="Cancel" class="cancel" onClick="google.script.host.close();" />
  </div>

  <br>
  </form>

  </body>
</html>

标签: javascripthtmlgoogle-apps-scriptgoogle-sheets

解决方案


您没有将任何内容传递给 updateSettings google.script.run.updateSettings();>

我会这样做:

<input type = "button"  value="Submit" onClick="google.script.run.updateSettings(this.parentNode);" />

我将其作为对话框运行,现在运行正常。我向单选按钮添加了值,现在每周返回“每周”,每天返回“每日”,IDdrive 返回一个字符串。

GS:

function openFolderForm() {  SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutputFromFile('ah1').setHeight(525).setWidth(800), 'Export Settings');
}

function updateSettings(form) {
  console.log(form)
  var formQ1=form.IDdrive;
  if (form.radioDaily == true) { var formQ2 = 1; } else { var formQ2 = 7}
}

function exportCSV() {
  var changelogSheetName = "data";
  var ss=SpreadsheetApp.getActive();
  var sheets=ss.getSheets();
  var tab=ss.getSheetByName('data');
  var folder=DriveApp.getFolderById(formQ1);  
}

html:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
    <title><b>Output Folder</b></title>
  </head>
  <body>
    <p>Enter the ID of your output folder. A Drive ID is made up by the characters after the last /folder/ in the URL</p>
    <form>
      <input type='text' name='IDdrive' id="IDdrive" style="width: 300px;"/><br />
      <input type="radio" name="radio" id="radioDaily" value="daily"> <label for="radioDaily">Daily</label><br />
      <input type="radio" name="radio" id="radioWeekly" value="weekly"> <label for="radioWeekly">Weekly</label><br />
      <input type="button" value="Submit" class="action" onClick="google.script.run.updateSettings(this.parentNode);" />
      <input type="button" value="Cancel" class="cancel" onClick="google.script.host.close();" />
  </form>
  </body>
</html>

推荐阅读