Javascript 为使用google apps脚本和web app表单上传的所有文件创建一个文件夹
我有一个带GAS的web应用程序。此web应用程序有三个输入(输入1、输入2、上载文件输入),两个用于元数据,一个用于上载文件。上传输入是一个多上传文件输入。当我提交表单时,代码必须为我上传的所有文件生成一个文件夹,并在谷歌表单中注册数据。例如,我上传了文件1和文件2,文件名或输入1作为文件夹的名称。但是,当我转到google drive时,代码会生成两个同名文件夹,换句话说,例如,两个文件夹,第一个文件夹的文件名为“folder 1”,第二个文件夹的文件名为“folder 1”。如何为所有文件只生成一个文件夹?我的代码有什么问题?你能帮助我吗? 问候语! 这是我的密码: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”。如何为所有文件
标题
安格尔达托斯酒店
地毯将军
函数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脚本端的
函数和Javascript端的addNewRow
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()
,如下所示
发件人:
致:
参考资料:
[...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));