移动 google 应用程序脚本到 v8 文件上传停止从边栏工作

Moving google apps script to v8 file upload stopped working from sidebar

我在 Google 电子表格中有一个 HTML 边栏,其中的文件上传输入字段不适用于新的 v8 引擎。它确实在旧运行时版本DEPRECATED_ES5中工作。

边栏中的文件上传用于将单个文件上传到我的 google 驱动器。

Html 文件

<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>

这里是简化的 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);

}

这个答案怎么样?请将此视为几个可能的答案之一。

问题和解决方法:

我可以确认与您的问题大致相同的情况(这是在 Google 的 Issue Tracker 上报告的。在这种情况下,我认为当启用 V8 时,当对象被发送到 Google Apps Script side with google.script.run 时,表单对象可能无法被解析。虽然我认为这可能会在未来的更新中被修改,但作为目前的解决方法,我想建议将上传的文件作为字节数组发送到GAS端。

当你的脚本修改后,变成如下。

修改后的脚本:

HTML&Javascript方: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);
}

Google Apps 脚本端: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
}

注:

  • 如上修改,上传文件时,将文件转换为byte数组发送给GAS端。然后,从字节数组创建文件。并返回文件 ID。你可以在控制台看到它。

参考文献:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。