google-apps-script - AppScript:如何创建上传表单?
解决方案
问题
在 Gmail 插件中上传文件。简而言之 - 不完全是。Gmail 附加组件使用CardService
类来构建 Ui - 它没有file
输入类型,也没有任何拖放功能。但是有一个解决方法。
步骤 1. 创建触发器小部件
然后,确保您Card
包含一个CardSection
带有一个ImageButton
或小部件(已弃用,使用),该小部件对它们设置了一个TextButton
操作。当使用设置 URL 以在小部件单击时打开的方法时,使用可以通过调用动态访问的当前项目的 URL(当部署为 WebApp 和 Add-on 时)。KeyValue
KeyValue
DecoratedText
OpenLink
setUrl(url)
ScriptApp.getService().getUrl()
步骤 2. 创建文件提交表单
在 Add-on 项目中,创建一个 Html 文件来处理文件上传。您可以使用示例一或创建自己的实现。示例文件使用FileReader
Web API 处理提交的文件(请注意,Google Apps 脚本中的客户端到服务器通信需要阻止事件处理程序并仅通过 APIsubmit
调用服务器端函数)。goolge.script.run
<!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>
步骤 3. 设置 doGet()
在您的 WebApp 代码中,添加doGet()
将显示我们在第 2 步中创建的文件上传表单所需的函数。它可以像几行代码一样简单(只需确保返回由 解析的 html 文件HtmlService
):
function doGet() {
var html = HtmlService.createHtmlOutputFromFile('file name from step 2');
return html;
}
步骤 4. 处理文件上传
在您的 WebApp 代码中,添加将接收文件数据的处理程序(此示例假定您将其读取为 byte[],有关详细信息,请参阅步骤 2)。
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;
}
步骤 5. 部署为 WebApp
最后,您必须将您的附加组件部署为 WebApp(或捆绑一个)和附加组件。假设您已经为插件配置了清单,请转到“发布”菜单,选择“部署为 Web 应用程序”,创建部署并允许任何人访问。
笔记
- 此方法不允许您轻松更新 Ui 以显示已上传的文件,但您可以在服务器端成功处理上传文件时添加一个
withSuccessHandler()
调用,关闭带有表单的窗口,将状态信息保存到缓存 /google.script.run
用户属性。然后,如果您将OpenLink
'OnClose
属性设置为RELOAD_ADD_ON
(参见步骤 1),您将能够有条件地更新 Ui 以通知用户上传成功。 - 更新:在 Tanaike 的评论之后,我重新设计了上传过程以更好地处理文件:将读取的二进制字符串文件更改为
ArrayBuffer
转换为Int8Array
并作为Array
实例上传。 - 当前问题是
.g*
文件上传(尽管传输正确)。解决后将更新答案。
参考
推荐阅读
- ios - 代号一-如何创建webview与native(iOS)通信
- javascript - 使用 javascript 设置的文本框的值未显示在文本框上
- r - tidyverse 和 dplyr:根据其他列有条件地替换列中的值
- python - TypeError:不支持的操作数类型 -:'str' 和 'int' 警告:进程以 a(n) Unknown (1) 错误代码退出
- linux - 给定 YYYY-MM-DD,如何找到一周的开始日期和一周的结束日期?
- c++ - 如何防止 MSVC 编译器将 const 替换为立即值
- angular - 在 Angular 中运行脚本
- geolocation - 获取交通事故 - Bing geo box
- bash - bash:如果什么也没发生则退出工具
- android - 如何在 Flutter 的原生 C++ 中使用 OpenCV 4(2021 年)(支持 Flutter 2.0)?