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>
我很想在我的应用程序中使用表单,但官方 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>