Как я могу различать файл и папку в DriveApp с помощью GAS

#google-apps-script #google-drive-api

#google-apps-script #google-drive-api

Вопрос:

Я знаю, что папка на самом деле представляет собой файл со специальным типом mimeType application/vnd.google-apps.folder на Google Диске. Но документация о классе папки DriveApp не содержит метода getMimeType(), как это делает класс файла DriveApp.

Как узнать в функции, ссылается ли аргумент этой функции на папку или на (обычный) файл?

 function displayResults(fileOrFolder)
{
  var id   = fileOrFolder.getId();
  var name =  fileOrFolder.getName();

  var mimeType = fileOrFolder.getMimeType();  // works if file; error if folder

  if (fileOrFolder == <Class File>)
  {
     <do something>
  }
  else if (fileOrFolder == <Class Folder>)
  {
     <do something else>
  }
}
 

Ответ №1:

Посмотрите, существует ли этот метод. Если obj.getMimeType=== не определено, это папка.
или, чтобы сделать его более надежным в случае изменения api (добавляет метод в папки), используйте
if (obj.getMimeType===undefined || obj.getMimeType.toLowerCase() =="application/vnd.google-apps.folder")

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

1. никогда не будьте слишком осторожны 😉 1 за исчерпывающую информацию.

2. Извините, но это не работает. На самом деле я сам попробовал использовать getMimeType() (см. Код в моем ответе)

3. нет, это не getMimeType(), это getMimeType . Посмотрите код, скопируйте и вставьте его.

Ответ №2:

Я не понимаю, почему вы говорите, что ответ Zig не работает… Все тесты, которые я сделал, были положительными.

пример того, как я его тестировал (идентификатор теста общедоступен и поэтому должен работать для всех):

 function test(){
  var item = DriveApp.getFileById('0B3qSFd3iikE3MS0yMzU4YjQ4NC04NjQxLTQyYmEtYTExNC1lMWVhNTZiMjlhMmI');
  testDriveFolders(item);
  var item = DriveApp.getFileById('1fXxLHuDlySZ6rOQjTsZdUl6rnw14sa17Q0ZTZ0HoGk1jbuHX-eLq1dyf');
  testDriveFolders(item);
}

function testDriveFolders(obj){
  try{var mimeType = obj.getMimeType()}catch(e){mimeType = 'folder'};
  var name =  obj.getName();
  if (mimeType =="application/vnd.google-apps.folder" || mimeType == 'folder'){
    Logger.log(name ' is a folder');
  }else{
        Logger.log(name ' is of the type ' mimeType);
  }
}
 

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

1. Нет необходимости в try / catch. В предоставленном мной коде я не вызываю getMymeType(), я делаю obj.getMimeType===undefined, что сильно отличается. Проверяет наличие функции, не вызывая ее (до более позднего времени)

2. Да, действительно, я использовал его, смешивая другой пост и ваш, потому что я начал с тестирования его кода (который, как было сказано, «не работает»). В конце концов, оба метода кажутся полезными…

3. да, извините, я не жаловался на этот подход, просто указывая, почему его попытка не сработала. try / catch в целом — не лучшая идея, потому что методы могут вызывать подлинные исключения ошибок, а не только языковые исключения из-за несуществующего метода.

Ответ №3:

Получить объект file, связанный с ID. getMimeType() будет работать:

 var mt = DriveApp.getFileByID(fileOrFolder.getId()).getMimeType();
if (mt == MimeType.FOLDER) {
  // it's a folder
} else {
  // it's a file.
}