我正在使用AppScript开发Gmail附加组件。 我的目标是创建类似于下图的内容。有提示吗?
AppScript:如何创建上传表单?
lawdragon 回答:AppScript:如何创建上传表单?
问题
在Gmail附件中上传文件。简而言之-不完全是。 Gmail附加组件使用CardService
类来构建Ui-它没有file
输入类型,也没有任何拖放功能。但是有一种解决方法。
第1步。创建触发器小部件
然后,确保您的Card
包含一个CardSection
,ImageButton
或TextButton
小部件的KeyValue
且其操作集为OpenLink
在他们。使用setUrl(url)
方法设置URL以在单击小部件时打开时,请使用可以通过ScriptApp.getService().getUrl()
调用动态访问的当前项目的URL(在同时部署为WebApp和附件时)。
第2步。创建文件提交表单
在附加项目中,创建一个处理文件上传的HTML文件。您可以使用示例之一或创建自己的实现。该示例文件使用FileReader
Web API处理提交的文件(请注意,Google Apps Script中的客户端到服务器通信要求阻止submit
事件处理程序,并通过{{1}调用服务器端函数}仅API)。
goolge.script.run
第3步。设置doGet()
在您的WebApp代码中,添加所需的<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<form>
<input name="file" type="file" />
<button id="submit" type="submit">Save file</button>
</form>
<script>
var form = document.forms[0];
form.addEventListener('submit',(event) => {
event.preventDefault();
var file = form.elements[0].files[0];
var reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = () => {
var buffer = reader.result;
var data = Array.from(new Int8Array(buffer));
google.script.run.withSuccessHandler((server) => {
top.window.close();
}).saveFile(data,file.name,file.type);
};
});
</script>
</body>
</html>
函数,该函数将显示我们在第2步中创建的文件上传表单。它可以像几行代码一样简单(只需确保返回html doGet()
解析的文件):
HtmlService
第4步。处理文件上传
在WebApp代码中,添加将接收文件数据的处理程序(此示例假定您将其读取为byte [],有关详细信息,请参见步骤2)。
function doGet() {
var html = HtmlService.createHtmlOutputFromFile('file name from step 2');
return html;
}
第5步。部署为WebApp
最后,您将必须将附加组件同时部署为WebApp(或捆绑在一起)和一个附加组件。假设您已经为附加组件配置了清单,请转到“发布”菜单,选择“作为Web应用程序部署”,创建一个部署并允许任何人访问。
注释
- 此方法不允许您轻松更新Ui以显示上传了哪些文件,但是您可以向
function saveFile(upload,name,mime) { var blob = Utilities.newBlob(upload,mime,name); var file = DriveApp.createFile(blob); Logger.log(file.getUrl()) //test upload; //handle file as needed; return; }
添加一个withSuccessHandler()
调用,以成功在服务器端处理上传的文件用窗体关闭窗口,将状态信息保存到缓存/用户属性。然后,如果将google.script.run
的{{1}}属性设置为OpenLink
(请参阅步骤1),则可以有条件地更新Ui,以通知用户上传成功。 - 更新:在Tanaike发表评论后,我对uload流程进行了改进,以更好地处理文件:将已读为
OnClose
的二进制字符串文件更改为RELOAD_ADD_ON
并以{{1 }}实例。 - 当前问题是上传了
ArrayBuffer
个文件(尽管传输正确)。解决后将更新答案。
参考