Конвертируйте файлы Excel в Google Spreadsheet и автоматически заменяйте существующие файлы электронных таблиц. - PullRequest
0 голосов
/ 01 апреля 2019

Приведенный код конвертирует файлы из Excel в Google Sheet. Код отсюда , но он не перезаписывает / не заменяет текущие существующие файлы электронных таблиц в целевой папке. Можно ли преобразовать все, включая те, которые находятся внутри подпапок, и заменить любые существующие файлы электронных таблиц Google с тем же именем?

function convertCollection1() 
{
  var user = Session.getActiveUser(); // Used for ownership testing.1aJcbdGhwliTs_CZ-3ZUvQmGRDzBM7fv9
  var origin = DriveApp.getFolderById("1dPsDfoqMQLCokZK4RN0C0VRzaRATr9AN");
  var dest = DriveApp.getFolderById("1M6lDfc_xEkR4w61pUOG4P5AXmSGF1hGy");

  // Index the filenames of owned Google Sheets files as object keys (which are hashed).
  // This avoids needing to search and do multiple string comparisons.
  // It takes around 100-200 ms per iteration to advance the iterator, check if the file
  // should be cached, and insert the key-value pair. Depending on the magnitude of
  // the task, this may need to be done separately, and loaded from a storage device instead.
  // Note that there are quota limits on queries per second - 1000 per 100 sec:
  // If the sequence is too large and the loop too fast, Utilities.sleep() usage will be needed.
  var gsi = dest.getFilesByType(MimeType.GOOGLE_SHEETS), gsNames = {};
  while (gsi.hasNext())
  {
    var file = gsi.next();
    if(file.getOwner().getEmail() == user.getEmail())
      gsNames[file.getName()] = true;

    Logger.log(JSON.stringify(gsNames))
  }

  // Find and convert any unconverted .xls, .xlsx files in the given directories.
  var exceltypes = [MimeType.MICROSOFT_EXCEL, MimeType.MICROSOFT_EXCEL_LEGACY];
  for(var mt = 0; mt < exceltypes.length; ++mt)
  {
    var efi = origin.getFilesByType(exceltypes[mt]);
    while (efi.hasNext())
    {
      var file = efi.next();
      // Perform conversions only for owned files that don't have owned gs equivalents.
      // If an excel file does not have gs file with the same name, gsNames[ ... ] will be undefined, and !undefined -> true
      // If an excel file does have a gs file with the same name, gsNames[ ... ] will be true, and !true -> false
      if(file.getOwner().getEmail() == user.getEmail() && !gsNames[file.getName().replace(/\.[^/.]+$/, "")])
      {
        Drive.Files.insert (
          {title: file.getName(), parents: [{"id": dest.getId()}]},
          file.getBlob(),
          {convert: true}
        );
        // Do not convert any more spreadsheets with this same name.
        gsNames[file.getName()] = true;
      }
    }
  }
  Logger.log(JSON.stringify(gsNames))
}

1 Ответ

0 голосов
/ 12 апреля 2019
  1. В папке с несколькими подпапками находятся файлы Excel (имя файла с расширениями .xlsx или .xls).
  2. Существуют файлы электронных таблиц (имя файла без расширений .xlsx или .xls).) в папке без вложенных папок.
  3. Вы хотите перезаписать существующие файлы электронных таблиц преобразованными электронными таблицами из файлов Excel.
  4. Количество файлов электронных таблиц и Excel совпадает.

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

Сначала я тестировал обновление файлов по пакетному запросу.В результате, кажется, что обновление файла не может быть достигнуто пакетным запросом, когда файловый блоб используется для обновления.Об этом, если я найду обходной путь для этой ситуации, я бы хотел обновить свой ответ.

Так что в этом примере сценария я предлагаю метод использования Drive API Advanced Google Services для вышеуказанной ситуации.

При использовании этого сценария, пожалуйста, включите Drive API в Advanced Google Services и консоли API.Об этом вы можете узнать по здесь .

Поток:

Порядок выполнения этого сценария следующий:

  1. Получитьфайлы в исходной и целевой папках.
  2. Когда имена файлов в исходной папке существуют в целевой папке, эти файлы перезаписывают существующие файлы электронных таблиц.
  3. Когда имена файлов в исходной папкене существует в папке назначения, эти файлы преобразуются в электронную таблицу как новые файлы.

Пример сценария:

Перед запуском сценария установите sourceFolderId и destinationFolderId.

function myFunction() {
  var sourceFolderId = "###"; // Folder ID including source files.
  var destinationFolderId = "###"; // Folder ID that the converted files are put.

  var getFileIds = function (folder, fileList, q) {
    var files = folder.searchFiles(q);
    while (files.hasNext()) {
      var f = files.next();
      fileList.push({id: f.getId(), fileName: f.getName().split(".")[0].trim()});
    }
    var folders = folder.getFolders();
    while (folders.hasNext()) getFileIds(folders.next(), fileList, q);
    return fileList;
  };
  var sourceFiles = getFileIds(DriveApp.getFolderById(sourceFolderId), [], "mimeType='" + MimeType.MICROSOFT_EXCEL + "' or mimeType='" + MimeType.MICROSOFT_EXCEL_LEGACY + "'");
  var destinationFiles = getFileIds(DriveApp.getFolderById(destinationFolderId), [], "mimeType='" + MimeType.GOOGLE_SHEETS + "'");
  var createFiles = sourceFiles.filter(function(e) {return destinationFiles.every(function(f) {return f.fileName !== e.fileName});});
  var updateFiles = sourceFiles.reduce(function(ar, e) {
    var dst = destinationFiles.filter(function(f) {return f.fileName === e.fileName});
    if (dst.length > 0) {
      e.to = dst[0].id;
      ar.push(e);
    }
    return ar;
  }, []);
  if (createFiles.length > 0) createFiles.forEach(function(e) {Drive.Files.insert({mimeType: MimeType.GOOGLE_SHEETS, parents: [{id: destinationFolderId}], title: e.fileName}, DriveApp.getFileById(e.id))});
  if (updateFiles.length > 0) updateFiles.forEach(function(e) {Drive.Files.update({}, e.to, DriveApp.getFileById(e.id))});
}

Примечание:

  • Если у вас много файлов для конвертации и время выполнения скрипта истекло, разделите файлы и запустите скрипт.

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...