Получение файла по имени в определенной папке

#google-apps-script

#google-apps-script

Вопрос:

Пытаясь воспроизвести этот код, чтобы оштрафовать определенный файл по имени, я получил сообщение об ошибке var files = DriveApp.getFilesByName(fileName); as Exception: Invalid argument at fileName , но если я ввел имя manually as string файла «10504-China-ReflectiveTape-NA.jpg » ` он работает правильно! Ниже приведен полный код:

 // ****EXAMPLE****
 
//My arguments for the function
var myFileName = "10504-China-ReflectiveTape-NA.jpg";
var myFileParentFolderName = "Catalog";
 
//Run the function
var getFileID = getFileByName(myFileName, myFileParentFolderName);
 
//Check if folder exists
if(getFileID.id === false){ //if file cannot be accurately found.
  Logger.log(getFileID.error); //alert or log error. Give option to try another FileName
}else{
  // If the file ID exists then proceed with the program. 
  Logger.log(getFileID.id);
};
/*
* ****Get File By Name***
*
*param 1: File Name 
*param 2: Parent Folder of File (optional)
*
*returns: Dictionary of file "id" and "error" message {"id": ,"error": }
*  -if there is no error, "id" returns file id and "error" returns false
*  -if there is an error, "id" returns false and "error" returns type of error as a string for user to display or log.
*/

function getFileByName(fileName, fileInFolder){
 
  var filecount = 0;
  var dupFileArray = [];
  var folderID = "";
  
  var files = DriveApp.getFilesByName(fileName);
  
  while(files.hasNext()){
    var file = files.next();
    dupFileArray.push(file.getId());
    
    filecount  ;
  };
  
  if(filecount > 1){
    if(typeof fileInFolder === 'undefined'){
        folderID = {"id":false,"error":"More than one file with name: " fileName ". nTry adding the file's folder name as a reference in Argument 2 of this function."}
    
    }else{
     //iterate through list of files with the same name
     for(fl = 0; fl < dupFileArray.length; fl  ){
       var activeFile = DriveApp.getFileById(dupFileArray[fl]);
       var folders = activeFile.getParents();
       var folder = ""
       var foldercount = 0;
       
       //Get the folder name for each file
       while(folders.hasNext()){
         folder = folders.next().getName(); 
         foldercount  ;
       };
       
       if(folder === fileInFolder amp;amp; foldercount > 1){
         folderID = {"id":false,"error":"There is more than one parent folder: " fileInFolder " for file " fileName}
       };
       
       if(folder === fileInFolder){
           folderID = {"id":dupFileArray[fl],"error":false};
           
       }else{
         folderID = {"id":false,"error":"There are multiple files named: " fileName ". nBut none of them are in folder, " fileInFolder}
       };
     };
   };
   
  }else if(filecount === 0){
      folderID = {"id":false,"error":"No file in your drive exists with name: " fileName};
      
  }else{ //IF there is only 1 file with fileName
    folderID = {"id":dupFileArray[0],"error":false};
    };

  return folderID;
};

 

Комментарии:

1. Вы используете блок кода глобальных переменных. Оберните его вокруг функции и запустите эту конкретную функцию. Я думаю, это решит вашу проблему. Дайте мне знать, если это произошло. Оберните код, начинающийся с var myFileName.. until Logger.log(getFileID.id);}; , в функцию. И выполняйте только эту функцию из редактора сценариев.

2. Тем не менее, в любом языке программирования рекомендуется печатать ваши переменные, чтобы увидеть, что они содержат. Внутри функции getFileByName и перед DriveApp.getFilesByName(fileName); do console.log(fileName) , чтобы увидеть, получаете ли вы ожидаемое значение, а затем do console.log(typeof fileName) , чтобы увидеть, получаете ли вы обратно строку. Вы опубликовали почти 100 строк кода, но нам сложно / невозможно выполнить его или протестировать, и люди могут захотеть закрыть вопрос как "needs debugging details" .

3. Спасибо @Marios, вы правы, теперь все в порядке.

Ответ №1:

Я не смог воспроизвести вашу проблему, когда вы передали параметр, и он завершается с ошибкой, а вы передали строку, и она работает.

Но кажется, что вы работаете getFileByName() напрямую по умолчанию, поэтому это приводит к таким ошибкам.

Поместите все остальное в основную функцию и запустите вместо нее эту функцию. Я получаю ожидаемый результат, когда делаю это с помощью вашего кода.

Это должно выглядеть так:

введите описание изображения здесь

убедитесь, что выбранная функция является вашей основной функцией, которая вызывает getFileByName, и просто запустите код.

Комментарии:

1. Это именно то, что я сказал в комментарии. Но приятно, что вы дали здесь ответ.

2. Я редактировал и исправлял форматирование, не смог увидеть ваши комментарии как можно скорее. Я понял, когда увидел ваш комментарий после публикации ответа. отличная рекомендация, однако, по вашему 2-му комментарию, которого не хватает в моем ответе

3. У вас все хорошо, не беспокойтесь 🙂 Я проголосовал за ваш ответ, потому что я думаю, что это решит проблему 🙂

4. Спасибо, все сделано правильно, ответ принят и проголосован, добро пожаловать в сообщество stackoverflow 🙂

5. Я ценю понимание @HasanAYousef. Ты тоже Мариос. Спасибо вам обоим за высокую оценку.