Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.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
Javascript 将多张照片从google drive插入google工作表的内部单元格的代码_Javascript_Google Apps Script_Google Sheets_Google Api - Fatal编程技术网

Javascript 将多张照片从google drive插入google工作表的内部单元格的代码

Javascript 将多张照片从google drive插入google工作表的内部单元格的代码,javascript,google-apps-script,google-sheets,google-api,Javascript,Google Apps Script,Google Sheets,Google Api,我能够找到一些代码并对其进行调整,以将多个IMAG上传到驱动器(多亏了tanaikech) 但我未能创建共享照片的URL并将其粘贴到谷歌电子表格中 下面是我的示例代码.gs function doGet() { return HtmlService.createHtmlOutputFromFile('Index'); } function saveFile(obj) { var blob = Utilities.newBlob(Utilities.base64Decode(ob

我能够找到一些代码并对其进行调整,以将多个IMAG上传到驱动器(多亏了tanaikech) 但我未能创建共享照片的URL并将其粘贴到谷歌电子表格中 下面是我的示例代码.gs

    function doGet() {
  return HtmlService.createHtmlOutputFromFile('Index');
}

function saveFile(obj) {
  var blob = Utilities.newBlob(Utilities.base64Decode(obj.data), obj.mimeType, obj.fileName);
 var file=DriveApp.createFile(blob);
 var fileId= file.getId()
  return fileId



  file.setSharing(DriveApp.Access.ANYONE_WITH_LINK,DriveApp.Permission.VIEW);


        var fileUrl = "https://drive.google.com/uc?export=view&id="+fileId;
  Logger.log(fileUrl);

 var url="https://docs.google.com/spreadsheets/d/12bhRyuHXzcMP7AS8cHhtkp2Sa6kDObZYRT1FY13appU/edit#gid=0";
 var ss= SpreadsheetApp.openByUrl(url);
 var ws= ss.getSheetByName("DB");


     ws.appendRow([fileUrl]);

     return ContentService.createTextOutput("Success").setMimeType(ContentService.MimeType.JAVASCRIPT);  

}
和my Index.html:


函数getFiles(){
常量f=document.getElementById('files');
[…f.files].forEach((文件,i)=>{
const fr=new FileReader();
fr.onload=(e)=>{
const data=e.target.result.split(“,”);
const obj={fileName:f.files[i]。名称,mimeType:data[0]。匹配(/:(\w.+);/)[1],数据:data[1]};
google.script.run.withSuccessHandler((id)=>{
console.log(id);
}).saveFile(obj);
}
fr.readAsDataURL(文件);
});
}
  • 例如,当一次上载两个文件时,您希望将两个URL放在一行中
我可以像上面那样理解。我可以从中确认上述理解是正确的。在这种情况下,下面的修改如何?请把这看作是几个可能的答案之一

修改点:
  • 在脚本中,该文件是通过异步进程上载的。通过这种方式,URL被逐行放置。为了在每个上传过程中将URL放在一行中,首先需要检索URL。然后,URL被放在一行
当这反映到您的脚本中时,请进行如下修改

<script>
function saveFile(f, file, i) {
  return new Promise((resolve, reject) => {
    const fr = new FileReader();
    fr.onload = (e) => {
      const data = e.target.result.split(",");
      const obj = {fileName: f.files[i].name, mimeType: data[0].match(/:(\w.+);/)[1], data: data[1]};
      google.script.run.withSuccessHandler((url) => resolve(url)).withFailureHandler(e => reject(e)).saveFile(obj);
    };
    fr.readAsDataURL(file);
  });
}

async function getFiles() {
  let urls = [];
  const f = document.getElementById('files');
  for (var i = 0; i < f.files.length; i++) {
    const url = await saveFile(f, f.files[i], i).catch(e => console.log(e));
    urls.push(url);
  }
  google.script.run.putUrls(urls);
}
</script>
修改脚本: 谷歌应用程序脚本端:Code.gs 请修改
saveFile
的功能,并添加
putUrls
的新功能,如下所示。请设置电子表格URL

function saveFile(obj) {
  var blob = Utilities.newBlob(Utilities.base64Decode(obj.data), obj.mimeType, obj.fileName);
  var file=DriveApp.createFile(blob);
  var fileId= file.getId()
  file.setSharing(DriveApp.Access.ANYONE_WITH_LINK,DriveApp.Permission.VIEW);
  var fileUrl = "https://drive.google.com/uc?export=view&id="+fileId;
  return fileUrl;
}

function putUrls(urls) {
  Logger.log(urls)
  var url = "https://docs.google.com/spreadsheets/d/###/edit#gid=0";  // <--- Please set this.
  var ss = SpreadsheetApp.openByUrl(url);
  var ws = ss.getSheetByName("DB");
  ws.appendRow(urls);
}
函数保存文件(obj){
var blob=Utilities.newBlob(Utilities.base64Decode(obj.data)、obj.mimeType、obj.fileName);
var file=DriveApp.createFile(blob);
var fileId=file.getId()
file.setSharing(DriveApp.Access.anywhere_与链接DriveApp.Permission.VIEW);
var fileUrl=”https://drive.google.com/uc?export=view&id=“+文件ID;
返回fileUrl;
}
函数putURL(URL){
Logger.log(URL)
变量url=”https://docs.google.com/spreadsheets/d/###/edit#gid=0";  //  {
const fr=new FileReader();
fr.onload=(e)=>{
const data=e.target.result.split(“,”);
const obj={fileName:f.files[i]。名称,mimeType:data[0]。匹配(/:(\w.+);/)[1],数据:data[1]};
google.script.run.withSuccessHandler((url)=>resolve(url)).withFailureHandler(e=>reject(e)).saveFile(obj);
};
fr.readAsDataURL(文件);
});
}
异步函数getFiles(){
让URL=[];
常量f=document.getElementById('files');
对于(var i=0;iconsole.log(e));
推送(url);
}
google.script.run.putURL(URL);
}
  • 在这次修改中,文件是通过同步过程上传的,URL是放在一个数组中的。然后,在
    putUrls
    处处理数组
注:
  • 修改Web应用脚本时,请将Web应用重新部署为新版本。这样,最新的脚本就会反映到Web应用程序中。请注意这一点。

在脚本中,在
saveFile
功能中,脚本通过
返回fileId
完成。这样,用于放置URL的脚本就不会运行。因此,请删除
返回文件ID
。顺便说一下,在这个Javascript中,文件是通过异步过程上传的。通过这种方式,URL被逐行追加。这个怎么样?成功了,如何将多个文件的链接放置在同一行上,而不是逐行放置。谢谢你,塔奈克。你有一个很棒的图书馆。谢谢你的快速回复。关于
如何将多个文件的链接放在同一行而不是一行一行。
,我无法理解。您希望在每次上载时将URL放在一行。你的问题还没有解决。我的理解正确吗?每次上传将链接粘贴到一行解决了这个问题,如果我同时上传了2个文件,则需要2行,因此链接将进入一行谢谢您的回复。我不得不为我糟糕的英语水平道歉。我仍然无法理解您当前的问题。当一次上载两个文件时,您希望将两个URL放在一行中。我的理解正确吗?它工作得很好,谢谢你建议的修改。@Aboude zoua谢谢你的回复。我很高兴你的问题解决了。