Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/460.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.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 apps脚本和web app表单上传的所有文件创建一个文件夹_Javascript_Google Apps Script_Google Drive Api - Fatal编程技术网

Javascript 为使用google apps脚本和web app表单上传的所有文件创建一个文件夹

Javascript 为使用google apps脚本和web app表单上传的所有文件创建一个文件夹,javascript,google-apps-script,google-drive-api,Javascript,Google Apps Script,Google Drive Api,我有一个带GAS的web应用程序。此web应用程序有三个输入(输入1、输入2、上载文件输入),两个用于元数据,一个用于上载文件。上传输入是一个多上传文件输入。当我提交表单时,代码必须为我上传的所有文件生成一个文件夹,并在谷歌表单中注册数据。例如,我上传了文件1和文件2,文件名或输入1作为文件夹的名称。但是,当我转到google drive时,代码会生成两个同名文件夹,换句话说,例如,两个文件夹,第一个文件夹的文件名为“folder 1”,第二个文件夹的文件名为“folder 1”。如何为所有文件

我有一个带GAS的web应用程序。此web应用程序有三个输入(输入1、输入2、上载文件输入),两个用于元数据,一个用于上载文件。上传输入是一个多上传文件输入。当我提交表单时,代码必须为我上传的所有文件生成一个文件夹,并在谷歌表单中注册数据。例如,我上传了文件1和文件2,文件名或输入1作为文件夹的名称。但是,当我转到google drive时,代码会生成两个同名文件夹,换句话说,例如,两个文件夹,第一个文件夹的文件名为“folder 1”,第二个文件夹的文件名为“folder 1”。如何为所有文件只生成一个文件夹?我的代码有什么问题?你能帮助我吗? 问候语! 这是我的密码:


标题
安格尔达托斯酒店
地毯将军
函数envirardatos(){
var sip=document.getElementById(“numsip”);
var rut=document.getElementById(“rut”);
var数组={numsip:sip.value,rut:rut.value};
常量f=document.getElementById(“文件”);
[…f.files].forEach((文件,i)=>{
const fr=new FileReader();
fr.onload=(e)=>{
const data=e.target.result.split(“,”);
常量对象={
文件名:f.files[i].name,
mimeType:数据[0]。匹配(/:(\w.+);/)[1],
数据:数据[1],
};
google.script.run
.withSuccessHandler((id)=>{
console.log(id);
})
.addNewRow(数组,obj);
};
fr.readAsDataURL(文件);
});
警报(“Se ha generado地毯”);
}
以下是google apps脚本的服务器端函数:

函数addNewRow(数组,obj){
var timestamp=新日期();
var parentFolderId='URLPARENTFOLDER';
var parentFolder=DriveApp.getFolderById(parentFolderId);
var user=Session.getActiveUser().getEmail();
var foldercreated=parentFolder.createFolder('SIP'+array.numsip+'/'+array.rut);
var idfolder=foldercreated.getId();
var url='URLSHEET';
var值=SpreadsheetApp.openByUrl(url);
var ss=values.getSheetByName('DATA');
ss.appendRow([array.numsip,array.rut,timestamp,user,idfolder]);
var blob=Utilities.newBlob(Utilities.base64Decode(obj.data)、obj.mimeType、obj.fileName);
返回foldercreated.createFile(blob.getId();
}

*我省略了“doGet”函数…

我相信您的目标如下

  • 您希望将上载的文件放入特定文件夹
  • parentFolder
    中存在
    “SIP”+array.numsip+“/”+array.rut
    文件夹名时,您不希望创建具有相同文件夹名的文件夹。您希望将文件放入现有文件夹
修改点:
  • 在本例中,我建议修改Google Apps脚本端的
    addNewRow
    函数和Javascript端的
    enviardatos()
  • 在当前脚本中,新文件夹是由
    var foldercreated=parentFolder.createFolder(“SIP”+array.numsip+“/”+array.rut)
    每次运行时创建的。所以这部分需要修改。
    • 它检查是否存在具有相同文件夹名称的文件夹
  • 而且,在谷歌应用程序脚本方面,我认为
    var parentFolder=DriveApp.getFolderById(parentFolderId)
  • 但是,在您的脚本中还有一个更重要的点。
    […f.files].forEach((file,i)=>{,,})中的脚本与异步进程一起运行。这样,即使修改了GoogleApps脚本端的脚本,也会创建重复的文件夹名称。因此还需要修改Javascript端的脚本
当上述各点反映到脚本中时,它将变成如下所示。请修改
addNewRow
的功能,如下所示

修改脚本: 谷歌应用程序脚本端: 请设置
URLPARENTFOLDER
URLSHEET

function addNewRow(array,obj) {
  var timestamp = new Date();
  var parentFolderId = "URLPARENTFOLDER";
  var parentFolder = DriveApp.getFolderById(parentFolderId);
  var user = Session.getActiveUser().getEmail();
  var folderName = "SIP "+array.numsip+"/"+array.rut;
  var foldercreated = parentFolder.getFoldersByName(folderName);
  foldercreated = foldercreated.hasNext() ? foldercreated.next() : parentFolder.createFolder(folderName);
  var idfolder= foldercreated.getId()
  var url = "URLSHEET";
  var values = SpreadsheetApp.openByUrl(url);
  var ss= values.getSheetByName("DATA");
  ss.appendRow([array.numsip,array.rut,timestamp,user,idfolder]);
  return obj.map(({fileName, mimeType, data}) => {
    var blob = Utilities.newBlob(Utilities.base64Decode(data), mimeType, fileName);
    return foldercreated.createFile(blob).getId();
  });
}
Javascript方面: 请在Javascript端修改
enviardatos()
,如下所示

发件人: 致: 参考资料:

哇!效果很好。我对Promise函数一点也不熟悉。非常感谢@Tanaike的回答和提供的知识,我还有一个问题。使用我上面的代码,我能够获得文件的ID,如何才能获得文件夹中文件的ID并在工作表中设置注册表?你好@感谢您的回复。我很高兴你的问题解决了。我愿意支持你。但问题的答复是新的问题,这与你的问题不同。你能把它作为新问题发布吗?因为当你的初始问题被评论改变时,看到你的问题的其他用户会感到困惑。通过将其作为新问题发布,包括我在内的用户可以想到您的新问题。当时,。如果你能合作解决你的新问题,我很高兴。你能合作吗?再次感谢@Tanaika,我会按照你的建议回答未来的问题,但是关于新问题,不需要生成问题,因为实际上访问包含所有í文件的文件夹,一切都会更容易。你好@路易斯·杰尔曼·奥雷戈·坎帕诺欢迎您。谢谢你让我知道。我很高兴你的问题解决了。如果您的问题已解决,请按“接受”按钮。与你有相同问题的其他人也可以将你的问题作为
[...f.files].forEach((file, i) => {
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((id) => {console.log(id);}).addNewRow(array, obj);
}
fr.readAsDataURL(file);
});
Promise.all([...f.files].map((file, i) => {
  const fr = new FileReader();
  return new Promise((r, rj) => {
    fr.onload = (e) => {
      const data = e.target.result.split(",");
      r({fileName: f.files[i].name, mimeType: data[0].match(/:(\w.+);/)[1], data: data[1]});
    }
    fr.onerror = (e) => rj(e);
    fr.readAsDataURL(file);
  });
}))
.then(obj => google.script.run.withSuccessHandler(console.log).addNewRow(array, obj))
.catch(err => console.log(err));