【发布时间】:2022-06-13 18:20:03
【问题描述】:
我有一个代码可以使用此代码获取我的 GoogleSheet 的父文件夹
var ssId = SpreadsheetApp.getActiveSpreadsheet().getId(); //get my GSheet ID
var parentFolder = DriveApp.getFileById(ssId).getParents().next(); //get the parent folder name
我已经将基本文件夹共享给具有编辑权限的整个组织。
由我运行应用程序,它运行没有任何问题。
但是当我的同事运行该应用程序时,它会收到此错误。
异常:无法检索下一个对象:迭代器已到达末尾。
试过 hasNext()
var ssId = SpreadsheetApp.getActiveSpreadsheet().getId(); //get my GSheet ID
var parentFolder = DriveApp.getFileById(ssId).getParents(); //get the parent folder
while (parentFolder .hasNext()) {
var temp1 = parentFolder .next();
Logger.log("Temp : "+temp1)
}
这不会从其他用户那里返回任何东西。
您知道这与 Google 权限安全问题或我遗漏的任何事情有关吗?
编辑代码片段
代码.gs
function doGet(request) {
return HtmlService.createTemplateFromFile('CustomerForm').evaluate().setTitle("Demo Form");
}
function uploadFile(vFolder,vFile ,vdata){
//upload folder
var drivepath = uploadFiletoDrive(vFolder);
var contentType = vdata.substring(5,vdata.indexOf(';')),
bytes = Utilities.base64Decode(vdata.substr(vdata.indexOf('base64,')+7)),
blob = Utilities.newBlob(bytes, contentType, vFile);
var folder = DriveApp.getFolderById(drivepath);
var file = folder.createFile(blob);
return file.getId();
}
function uploadFiletoDrive(folderName){
const ssId = SpreadsheetApp.getActiveSpreadsheet().getId();
const parentFolder = DriveApp.getFileById(ssId).getParents().next(); // get the parent folder location
Logger.log(ssId)
Logger.log(parentFolder)
const subFolders = parentFolder.getFolders();
while (subFolders.hasNext()) {
let folder = subFolders.next();
// Returns the existing folder if found.
Logger.log(folder.getName())
if (folder.getName() === folderName) {
Logger.log("Folder exists")
Logger.log("Folder SSID : "+folder.getId())
return folder.getId();
}
}
// Creates a new folder if one doesn't already exist.
Logger.log("Folder Creating")
//creating the folder if not exists and will put the description
folder = parentFolder.createFolder(folderName);
Logger.log("New Folder SSID : "+folder.getId())
return folder.getId();
}
CustomerForm.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<table>
<tr>
<td> Folder Name : </td>
<td> <input type="text" id="FolderName"> </td>
</tr>
<tr>
<td> Input File : </td>
<td> <input type='file' id="FileAttach"></td>
</tr>
<tr>
<td>
<button type="submit" id="SubmitFile" onclick="submitForm()" >Submit</button>
</td>
</tr>
</table>
</body>
</html>
<script>
function submitForm(){
var myFile = document.getElementById('FileAttach').files;
var myFolder = document.getElementById('FolderName').value;
var reader = new FileReader();
tempFile = myFile[0];
if(tempFile){
reader.readAsDataURL(tempFile);
reader.onloadend = function(e) {
if (e.target.error != null) {
alert("File " + tempFile.name + " could not be read.");
return;
} else {
google.script.run.withSuccessHandler(finishUpload).uploadFile(myFolder, tempFile.name, e.target.result);
}
};
}
}
function finishUpload(vFileID){
alert("Uploaded File ID is "+vFileID)
}
</script>
【问题讨论】:
-
在您的情况下,您是电子表格和脚本的所有者吗?并且,用户是否有权读取或写入电子表格的父文件夹?而且,您的脚本是如何由用户运行的?
-
是的。我是电子表格和脚本的所有者。我已授予组织范围内的编辑权限。我创建了一个将文件上传到 GDrive 的网络应用程序。所以这个应用会先检查获取父文件夹,并检查是否有同事个人文件夹,然后再将文件上传到自己的文件夹。
-
感谢您的回复。我理解
I'm the owner of the spreadsheet and the script. I've given editing rights for organization wide.。但是,很遗憾,我无法从I've created a web app that will upload a file to GDrive. So this app will check get the parent folder and check if there are the colleague personal folder before uploading the file to their own folder.了解您的情况。我为此道歉。可以问一下具体情况吗? -
当然。我创建了一个 Web 应用程序。在此 Web 应用程序中,用户将填写表格并提交附件。我的代码将获取当前的电子表格 ID 并获取父文件夹名称。
-
感谢您的回复。从您的回复中,我了解到用户通过 Web 应用程序运行您的脚本。在这种情况下,请问您的Web Apps 的
Execute as:和Who has access to the app:的设置?我想你正在使用 V8 运行时。
标签: google-apps-script google-sheets google-drive-api