@8x8z

Метод getFilesByName() не находит файлы, если в имени с кириллицей присутствуют буквы в верхнем регистре?

Вообще, все началось с того, что надо было сохранять приатаченные файлы, полученные через GmailApp на Google Drive
Все шло хорошо, пока не появилась необходимость перезаписывать файл, если он уже есть на диске.
Если просто сохранять, то файлы с одинаковыми именами сохраняются как FileName(n-1).ext - где n - число полученных файлов с одним и тем же именем.
Соответственно, появилась необходимость определить, присутствует ли файл с определенным именем на диске и при положительном результате удалить его, а новый сохранить.
И вот что обнаружилось при поиске файлов с кириллицей.

function startFindFile() {
          
  var folder =  DriveApp.getFolderById(DriveApp.getFoldersByName("prices").next().getId()); 
  var fileNameCyr1 = "Прайс1_Склад ЦС.xls";
  var fileNameCyr2 = "прайс1_склад цс.xls";
  var fileNameEng = "Price.txt";
  
  Logger.log("List all files:" );
  var files = folder.getFiles();
  findFile(files);
  
  Logger.log("Find files: " + fileNameEng ); 
  files = folder.getFilesByName(fileNameEng);
  findFile(files);
  
  Logger.log("Find files: " + fileNameCyr1 ); 
  files = folder.getFilesByName(fileNameCyr1);
  findFile(files);
  
  Logger.log("Find files: " + fileNameCyr2 );
  files = folder.getFilesByName(fileNameCyr2);
  findFile(files);
}

function findFile(files) {

   while (files.hasNext()) {
    var file = files.next();
    Logger.log(file.getName() + " " + file.getId());

   }

}


Что имеем в результате.
getFilesByName ищет файлы на кириллице только в нижнем регистре?

40f8a0ff3d264aaf9c6b233bf9105646.jpgВопрос: как найти файл на Google Drive в имени которого есть буквы на кириллице в верхнем регистре?
  • Вопрос задан
  • 728 просмотров
Решения вопроса 1
oshliaer
@oshliaer Куратор тега Google Apps Script
Google Products Expert
Как раз сейчас описываю этот баг. Поставьте звездочку тут.

Используйте менее точный поиск с дополнительной обработкой результатов. И сервис DriveApp и сервис Drive умеют в строке запроса обрабатывать директиву title contains. См. Search for Files. На данный момент, 2017-08-13, используется API v2, и для поиска в данном случае - это принципиально. Следующий код вернет то, что вы ожидаете:
function getFileByName(name) { 
  var files = DriveApp.searchFiles(Utilities.formatString('title contains "%s" and trashed=false', name));
  var result = undefined;
  while(files.hasNext()){
    var file = files.next();
    if(file.getName() === name){
      result = file;
      break;
    }
  }
  return result;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы