#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.
}