【问题标题】:Exception: Cannot retrieve the next object: iterator has reached the end. when running by other user异常:无法检索下一个对象:迭代器已到达末尾。由其他用户运行时
【发布时间】: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


猜你喜欢
  • 2022-01-17
  • 2017-03-29
  • 2021-08-29
  • 2021-10-24
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多