Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 将google apps脚本移动到v8文件上载已停止从侧边栏工作_Google Apps Script_Google Sheets_File Upload_Web Applications_V8 - Fatal编程技术网

Google apps script 将google apps脚本移动到v8文件上载已停止从侧边栏工作

Google apps script 将google apps脚本移动到v8文件上载已停止从侧边栏工作,google-apps-script,google-sheets,file-upload,web-applications,v8,Google Apps Script,Google Sheets,File Upload,Web Applications,V8,我在谷歌电子表格中有一个HTML侧栏,其中有一个文件上传输入字段,不适用于新的v8引擎。它在不推荐使用的旧运行时版本_ES5中工作 侧边栏中的文件上载用于将单个文件上载到我的谷歌硬盘 Html文件 这个答案怎么样?请把这看作是几个可能的答案之一 问题和解决方法: 我可以确认你的问题的相同情况(这是谷歌的报告)。在这种情况下,我认为当启用V8时,当使用Google.Script.run将表单对象发送到Google Apps脚本端时,可能无法解析表单对象。虽然我认为这可能会在将来的更新中被修改,但作

我在谷歌电子表格中有一个HTML侧栏,其中有一个文件上传输入字段,不适用于新的v8引擎。它在不推荐使用的旧运行时版本_ES5中工作

侧边栏中的文件上载用于将单个文件上载到我的谷歌硬盘

Html文件
这个答案怎么样?请把这看作是几个可能的答案之一

问题和解决方法: 我可以确认你的问题的相同情况(这是谷歌的报告)。在这种情况下,我认为当启用V8时,当使用Google.Script.run将表单对象发送到Google Apps脚本端时,可能无法解析表单对象。虽然我认为这可能会在将来的更新中被修改,但作为当前的解决方法,我建议将上传的文件作为字节数组发送到GAS端

当您的脚本被修改时,它将变成如下所示

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);
}
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
}
修改脚本: 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);
}
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
}
谷歌应用程序脚本端:
code.gs
请修改
上传文件
,如下所示

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);
}
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
}
注:
  • 在上述修改中,当上传文件时,文件被转换为字节数组并发送到气体侧。然后,从字节数组创建文件。然后返回文件ID。你可以在控制台上看到它
参考资料:

如果我误解了你的问题,并且这不是你想要的方向,我很抱歉。

在我的测试中,
google.script.run.uploadFiles(fileForm)
调用失败。它甚至不调用函数。它抛出了一些“未捕获”的错误。我会提交一个错误报告在。当你提交时让我知道#,我会给它加上星号,因为我看到了同样的问题。事实上,我在上测试了谷歌自己的代码,除了侧边栏,它会产生同样的错误。谷歌的代码在普通的网络应用程序中确实有效。我想知道表单中的文件序列化是否仅适用于web应用程序?对于您的问题,我可以做些什么吗?如果我的回答对你的处境没有帮助。我必须道歉并修改它。如果你能合作解决你的问题,我很高兴。我想考虑一下解决办法。@Tanaike就在我发布这篇文章后,我们因为新冠病毒19而被锁定。所以我没有时间/可能去测试它。但是看起来你的答案会是一个很好的解决办法,我只是没有机会测试一下。“我一有机会也会给你反馈的。”卡斯珀·埃格伦感谢你的回复。我能理解这种情况。我也谢谢你。嗨,我试过这个方法,但不起作用。。。你能看一下吗?谢谢@Juan Bravo Roig首先,在我的环境中,我可以确认这个脚本是有效的。我看到你的问题了。虽然在你的问题中,你说你上传了mp3,但当我在你的问题中看到
console.log(file.mimeType)
时,它是
audio/wav
。我认为上传MP3时,模拟类型是
音频/mpeg
。这个怎么样?顺便问一下,我能问一下
它不起作用的细节吗…
?此外,您能否提供完整的脚本来复制您的问题?如果可以,请将其添加到您的问题中。谢谢您的快速回复。日志是audio/wav,因为我测试过mp3和wav文件,它们都不起作用。对不起,我弄错了。我的脚本和你的脚本之间唯一的区别是我传递了文件和几个表单字段。file.bytes和file.mimeType被正确地发送到服务器函数,但是当我尝试创建newBlob时,它只返回未定义的结果。@Juan Bravo Roig感谢您的回复。我测试了你添加的脚本。不幸的是,我可以确认脚本是有效的。将blob创建为文件时,可以创建二进制文件(mp3文件)。所以我不能复制你的问题。这是因为我的技术差。对此我深表歉意。您能否提供当前脚本以复制您的问题?您好!我终于解决了这个问题,真是可笑。我已经更新了问题并添加了回答。也谢谢!