Kas*_*und 4 v8 file-upload web-applications google-sheets google-apps-script
我在 Google 电子表格中有一个 HTML 侧边栏,其中包含一个不适用于新 v8 引擎的文件上传输入字段。它确实适用于旧的 runtimeVersion DEPRECATED_ES5。
侧边栏中的文件上传用于将单个文件上传到我的谷歌驱动器。
<body>
<h1>File Uploader</h1>
<form>
<input type="file" name="myFile" id="file">
<br>
<input class="blue" type="button" id="submitBtn" value="Upload File" onclick="uploadthis(this.parentNode)">
</form>
<input type="button" value="Close" onclick="google.script.host.close()" />
<script>
function uploadthis(fileForm){
google.script.run
.uploadFiles(fileForm)
}
</script>
</body>
Run Code Online (Sandbox Code Playgroud)
这里是简化的 gs
function uploadContract() {
var html = HtmlService.createHtmlOutputFromFile('ContractUpload').setTitle('Kontrakt upload').setWidth(300);
SpreadsheetApp.getUi().showSidebar(html);
}
function uploadFiles(data){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sStamdata = ss.getSheetByName('Stamdata_New');
var contractFolderId = sStamdata.getRange('D60').getValue();
var idag = Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd");
var title = sStamdata.getRange('D52').getValue();
var file = data.myFile;
var folder = DriveApp.getFolderById(contractFolderId);
var createFile = folder.createFile(file);
createFile.setName(idag+" - KONTRAKT - "+title);
}
Run Code Online (Sandbox Code Playgroud)
这个答案怎么样?请将此视为几种可能的答案之一。
我可以确认您的问题的相同情况(这是在 Google 的 问题跟踪器上报告的)。在这种情况下,我认为当启用 V8 时,当使用 google.script.run 将对象发送到 Google Apps Script 端时,可能无法解析表单对象。虽然我认为这可能会在未来的更新中修改,但作为当前的解决方法,我想建议将上传的文件作为字节数组发送到 GAS 端。
当你的脚本被修改时,它变成如下。
ContractUpload.html请修改uploadthis如下。
function uploadthis(fileForm){
const file = fileForm.myFile.files[0];
const fr = new FileReader();
fr.onload = function(e) {
const obj = {
// filename: file.name, // In your script, the filename is given at GAS side. So I removed this.
mimeType: file.type,
bytes: [...new Int8Array(e.target.result)]
};
google.script.run.withSuccessHandler((e) => console.log(e)).uploadFiles(obj);
};
fr.readAsArrayBuffer(file);
}
Run Code Online (Sandbox Code Playgroud)
Code.gs请修改uploadFiles如下。
function uploadFiles(data){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sStamdata = ss.getSheetByName('Stamdata_New');
var contractFolderId = sStamdata.getRange('D60').getValue();
var idag = Utilities.formatDate(new Date(), "GMT+1", "yyyyMMdd");
var title = sStamdata.getRange('D52').getValue();
var file = Utilities.newBlob(data.bytes, data.mimeType, idag+" - KONTRAKT - "+title); // Modified
var folder = DriveApp.getFolderById(contractFolderId);
var createFile = folder.createFile(file);
return createFile.getId(); // Added
}
Run Code Online (Sandbox Code Playgroud)
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。