Pedro Moreira
Pedro Moreira

Reputation: 1

Error: Cannot Retrieve the next object: iterator has reached the end. createFolder @ Function: createFolder.gs:8

I've used a code I saw on SO for saving a document into a specific folder in Google Drive, but by date (YYYY-MM-DD). I've ran this script, but I keep getting the above message. I've tried to look into the code, but cannot see where I'm going wrong - can someone help me please? Thank you so much!

function createFolder(){
  var formattedDate = Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd");
  var folderYearDate = Utilities.formatDate(new Date(), "GMT", "yyyy");
  var folderMonthDate = Utilities.formatDate(new Date(), "GMT", "MMMM");
  var name = "XXXX" + formattedDate; //file name
  var parent = DriveApp.getFolderById("XXXX").getFoldersByName("XXXX")
  var yearExist = parent.next();
  var yearFolders = yearExist.getFoldersByName(folderYearDate);
  if(yearFolders.hasNext()){
    var yearFolder = yearFolders.next()
    Logger.log('Yes, there is a year folder')
    //return;
  } else {
    var yearFolder = yearExist.createFolder(folderYearDate)

    Logger.log('There was no year folder, but it was created.')
    //return;
  }

  var monthFolders = yearFolder.getFoldersByName(folderMonthDate);
  if(monthFolders.hasNext()){
    var monthFolder = monthFolders.next()
    Logger.log('Yes, there is a month folder.')

  } else {
    var monthFolder = yearFolder.createFolder(folderMonthDate);
    Logger.log('There was no month folder, but it was created')
  }
}

Upvotes: 0

Views: 276

Answers (2)

Nikko J.
Nikko J.

Reputation: 5533

By definition,

next() - Gets the next item in the collection of files or folders. Throws an exception if no items remain.

To avoid the exception, you must determine whether calling next() will return an item by using hasNext().

In your code:

if(parent.hasNext()){
  var yearExist = parent.next();
  //some operations
}

References

next()

hasNext()

Upvotes: 1

Diego
Diego

Reputation: 9571

It fails because the DriveApp.getFolderById("XXXX").getFoldersByName("XXXX") call isn't finding any folders. You should always call .hasNext() before .next() to see if there is anything (as you do later in your code).

var parent = DriveApp.getFolderById("XXXX").getFoldersByName("XXXX")

// Check if the folder exists
if (!parent.hasNext()) {
  Logger.log("Folder not found. Exiting...");
  return;
}

var yearExist = parent.next();

Upvotes: 1

Related Questions