HTML 服务 - 表单示例不起作用

HTML Service - Form example doesn't work

我很想在我的应用程序中使用表单,但官方 Google 示例不起作用。

将表单作为参数传递给函数,可防止函数被调用。

https://developers.google.com/apps-script/guides/html/communication#forms

查看 index.html

中的这一行
<input type="button" value="Submit"
  onclick="google.script.run
      .withSuccessHandler(updateUrl)
      .processForm(this.parentNode)" />

看到this.parentNode参数了吗?删除它允许 .processForm 被调用。事实上,用除表单以外的任何东西替换它,也会让 processForm 被调用(尽管传递了无用的测试字符串)。

我尝试了多种方法将表单作为参数传递给 processForm,所有这些方法都阻止调用 processForm。如果有人曾经将表单数据传递给 Google 脚本,请告诉我。

this.parentNode 不会是您要传递给 .processForm()<form> 元素。确保您的输入类型包含在 <form> 标记中,就像在示例中一样:

<form id="myForm">
  <input type="button" value="Submit"
      onclick="google.script.run
        .withSuccessHandler(updateUrl)
        .processForm(this.parentNode)" />
</form>

呃。好吧,在几乎向 Google 发布错误后,我通过搜索他们的错误数据库发现这是文件上传的一个已知错误 - 如果您的表单没有文件上传,该表单将起作用。

此外,如果您真的想在表单中上传文件,还有一个解决方法。

https://code.google.com/p/google-apps-script-issues/issues/detail?id=4610

我不明白为什么他们不删除表单示例的文件部分。这是唯一阻止它工作的东西,也没有必要证明这一点。在尝试学习他们的语言时本可以节省我 3 个小时,一直认为这是我的错。

这是我在 IFRAME 模式下从表单上传文件的解决方法。这支持多个文件:

code.gs

function doGet() {
  return HtmlService.createHtmlOutputFromFile('index').setSandboxMode(HtmlService.SandboxMode.IFRAME);

}

function saveFile(data,name) {

  var contentType = data.substring(5,data.indexOf(';'));
  var file = Utilities.newBlob(Utilities.base64Decode(data.substr(data.indexOf('base64,')+7)), contentType, name);
  DriveApp.getRootFolder().createFile(file);

}

index.html

<div>
 <input type="file"  id="myFiles" name="myFiles" multiple/>
 <input type="button" value="Submit" onclick="SaveFiles()" />
</div>

<script>

  var reader = new FileReader();
  var files;
  var fileCounter = 0;



  reader.onloadend = function () {
   google.script.run
    .withSuccessHandler(function(){
      fileCounter++;      
      postNextFile();
    }).saveFile(reader.result,files[fileCounter].name);

  }



function SaveFiles(){
  files = document.getElementById("myFiles").files;  
  postNextFile();
 }


function postNextFile(){if(fileCounter < files.length){reader.readAsDataURL(files[fileCounter]);}else{fileCounter=0;alert("upload done")}}

</script>