#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..
untilLogger.log(getFileID.id);};
, в функцию. И выполняйте только эту функцию из редактора сценариев.2. Тем не менее, в любом языке программирования рекомендуется печатать ваши переменные, чтобы увидеть, что они содержат. Внутри функции
getFileByName
и передDriveApp.getFilesByName(fileName);
doconsole.log(fileName)
, чтобы увидеть, получаете ли вы ожидаемое значение, а затем doconsole.log(typeof fileName)
, чтобы увидеть, получаете ли вы обратно строку. Вы опубликовали почти 100 строк кода, но нам сложно / невозможно выполнить его или протестировать, и люди могут захотеть закрыть вопрос как"needs debugging details"
.3. Спасибо @Marios, вы правы, теперь все в порядке.
Ответ №1:
Я не смог воспроизвести вашу проблему, когда вы передали параметр, и он завершается с ошибкой, а вы передали строку, и она работает.
Но кажется, что вы работаете getFileByName()
напрямую по умолчанию, поэтому это приводит к таким ошибкам.
Поместите все остальное в основную функцию и запустите вместо нее эту функцию. Я получаю ожидаемый результат, когда делаю это с помощью вашего кода.
Это должно выглядеть так:
убедитесь, что выбранная функция является вашей основной функцией, которая вызывает getFileByName, и просто запустите код.
Комментарии:
1. Это именно то, что я сказал в комментарии. Но приятно, что вы дали здесь ответ.
2. Я редактировал и исправлял форматирование, не смог увидеть ваши комментарии как можно скорее. Я понял, когда увидел ваш комментарий после публикации ответа. отличная рекомендация, однако, по вашему 2-му комментарию, которого не хватает в моем ответе
3. У вас все хорошо, не беспокойтесь 🙂 Я проголосовал за ваш ответ, потому что я думаю, что это решит проблему 🙂
4. Спасибо, все сделано правильно, ответ принят и проголосован, добро пожаловать в сообщество stackoverflow 🙂
5. Я ценю понимание @HasanAYousef. Ты тоже Мариос. Спасибо вам обоим за высокую оценку.