Why cannot Object FolderIterator find function get

2019-08-08 17:42发布

问题:

I try to run a code below. The code moves gmail attachment to the defined folders. It returns error "Object FolderIterator cannot find function getId". the code stops at var folderID = folder.getId() Folder is defined by DriveApp Why cannot Object FolderIterator find function getId?

  function sendtoDrive() {

  var ss1 = SpreadsheetApp.openById(SpreadSheetID);
  var ash = ss1.getSheets()[0];
  var dr = ash.getDataRange();
  var lr = dr.getLastRow();
  var dvs = dr.getValues();
  var n=0;
 var properties = PropertiesService.getScriptProperties();

  for(n=1;n<lr;n++ ){
    try {
      var sdr = dvs[n][0];
      try {
        var folder = DriveApp.getFoldersByName(sdr);
      }
      catch (e) {
        try {
          var folder = DriveApp.createFolder(sdr);
        }
        catch (e) {
          Logger.log(e.message);
          throw e;
        }        
      } 
      var mailsAlreadyProcessed = properties.getProperty(sdr);
      if(mailsAlreadyProcessed == undefined){
         var folderID=folder.getId()
         properties.setProperty(sdr, folderID + ',');
        var mailsAlreadyProcessed = properties.getProperty(sdr);
      }

      var label = GmailApp.getUserLabelByName(sdr);
      var labelDone = GmailApp.getUserLabelByName('Done');
      var threads = label.getThreads();

      if (threads.length > 0) {
        var folderId = mailsAlreadyProcessed.split(',')[0];
        var folder = DriveApp.getFolderById(folderId);

        for (i in threads) {
          if (threads[i].getLabels() != 'Done') {
            var messages = threads[i].getMessages();
            for (j in messages) {
              var attachments = messages[j].getAttachments();
              if (attachments.length > 0 && mailsAlreadyProcessed.indexOf(messages[j].getId()) == -1) {
                mailsAlreadyProcessed += messages[j].getId();

                for (k in attachments) {
                  var file = attachments[k];
                  folder.createFile(file);
                  Utilities.sleep(100); 
                }

                ScriptProperties.setProperty('mailsAlreadyProcessed', mailsAlreadyProcessed);
              }
            }
            labelDone.addToThread(threads[i]);
            label.removeFromThread(threads[i]);
            Utilities.sleep(100); 
          }
        }
      }
    }      
    catch (e) {
      Logger.log(e.message);
      throw e;
    }
  }
}

回答1:

DriveApp.getFoldersByName(sdr) returns a folder iterator because in Google Drive more than one folder can have the same name. If you're absolutely certain than only one folder with that name exists then you can get the folder object with a .next() following the code.

folder = DriveApp.getFoldersByName(sdr).next();