Скрипт Google Apps создает листовую версию файла Excel

Я работаю над автоматизацией процесса. В настоящее время я загружаю файлы Excel (.xlsx) в определенную папку на Диске. Затем я вручную конвертирую их в файл Google Sheet и перемещаю в отдельную папку. Хотелось бы автоматизировать этот процесс. Я знаю, что мне придется написать сценарий для перебора двух папок, чтобы сравнить и посмотреть, какие файлы еще не преобразованы, а затем преобразовать те, которые он не находит в обоих местах. Однако я пытаюсь найти лучший способ, чтобы это произошло.

Код ниже, который может быть или не быть на правильном пути, я новичок в этом и действительно просто попытался собрать его по кусочкам. Мы будем очень признательны за понимание любого.

function Excel2Sheets() 
{

  //Logs excel folder and string of files within
  var excelfolder = DriveApp.getFolderById('1JbamZxNhAyZT3OifrIstZKyFF_d257mq');
  var excelfiles = excelfolder.getFiles();

  // Logs sheets folder and string of files within
  var sheetfolder = DriveApp.getFolderById('1y10IwMobCdpQlYwWdveHLzxEz3Xml0Qt');
  var ID = sheetfolder.getId();
  var sheetfiles = sheetfolder.getFiles();
  var MType = MimeType.GOOGLE_SHEETS;

  while (excelfiles.hasNext()) {
    var excelfile = excelfiles.next();
    var excelname = excelfile.getName();

    while (sheetfiles.hasNext()) {
      var sheetfile = sheetfiles.next();
      var sheetname = sheetfile.getName();

      if (sheetname == excelname) {
        break;
      }
      if (sheetfiles.hasNext(0)) {
        var blob = excelfile.getBlob();
        sheetfolder.createFile(excelname, blob, MType);
        break;
      }
    }
  }
}

Я также играл с этим кодом. Спасибо

function fileChecker()
{
  try{
    //Establishes Excel Source Folder
    var excelfolder = DriveApp.getFolderById('1JbamZxNhAyZT3OifrIstZKyFF_d257mq');
    //Establishes Sheet Target Folder
    var sheetfolder = DriveApp.getFolderById('1y10IwMobCdpQlYwWdveHLzxEz3Xml0Qt');
    //Establishes Return File Type
    var MType = MimeType.GOOGLE_SHEETS;
    //Gets all files in excel folder
    var excelfiles = excelfolder.getFiles();

    //loop through excel files
    while(excelfiles.hasNext()){
      //Establishes specific excel file  
      var excelfile = excelfiles.next();
      //Checks for file with same name in sheets folder
      var sheetfiles = sheetfolder.getFilesByName(excelfile.getName());
      //Logical Test for file match
      if (sheetfiles.hasNext()){
        //Gets File Name
        var excelname = excelfile.getName();
        //Creates File Blob
        var blob = excelfile.getBlob();  
        // Creates sheet file with given name and data of excel file
        sheetfolder.createFile(excelname, blob, MType);
      }
    } 
  }
  catch(err){
    Logger.log(err.lineNumber + ' - ' + err);
  }
}

Второй код устраняет одну проблему первого (повторная инициализация цикла для файлов gsheets), но на самом деле ничего не делает с коллекцией файлов gsheet: ваш код говорит: «Если есть файлы листов, конвертируйте этот файл Excel» Примечание: есть ограничения на количество файлов, которые вы можете создавать в день! Если вы используете обычную учетную запись @gmail, вы можете ограничить до 250 таблиц в день.

tehhowch 13.03.2018 16:48

Связанный: stackoverflow.com/questions/11681873/…

tehhowch 13.03.2018 17:21
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
2
3 205
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Любой из ваших кодов, если он достигнет строки createFile, должен выдать эту ошибку:

Invalid argument: file.contentType

потому что вы передаете Blob, пока createFile(name, content, mimetype) ожидает String.

Просматривая справочную страницу для DriveApp, вы, несомненно, заметите метод File#getAs(mimetype), который возвращает Blob, и методы Folder#createFile(blob), и попробуйте что-то вроде:

var gsBlob = excelfile.getAs(MimeType.GOOGLE_SHEETS);
gsfolder.createFile(gsBlob).setName(excelfile.getName());

Однако это тоже вернет ошибку:

Converting from application/vnd.openxmlformats-officedocument.spreadsheetml.sheet to application/vnd.google-apps.spreadsheet is not supported.

Изучение документации по методу getAs указывает на то, что это, как правило, неподдерживаемая операция, за исключением случаев, когда mimetype назначения - MimeType.PDF. Я предполагаю, что это связано с тем, что преобразование PDF достаточно просто - его реализация, вероятно, использует функциональность, подобную «печати», в то время как преобразование формата электронной таблицы требует осторожного обращения с формулами, изображениями, диаграммами и т. д.

Из прошлого опыта работы с Google Диском обычный пользователь знает, что существует возможность использовать Диск для автоматического преобразования Excel -> Google Таблицы. Однако эта функция доступна только во время загрузки. Используя тесно связанный вопрос, мы замечаем, что мы должны использовать Drive API «Advanced Service», а не более простой собственный DriveApp. Включите Расширенное обслуживание, и тогда следующий фрагмент может работать. Обратите внимание, что Advanced Drive Service обрабатывает папки как файлы с определенным типом mime (поэтому не существует методов для конкретных папок), поэтому использование DriveApp и Advanced Service проще всего для тех, кто находится в среде Apps Script.

// Convert the user's stored excel files to google spreadsheets based on the specified directories.
// There are quota limits on the maximum conversions per day: consumer @gmail = 250.
function convertExcelToGoogleSheets() 
{
  var user = Session.getActiveUser(); // Used for ownership testing.
  var origin = DriveApp.getFolderById("origin folder id");
  var dest = DriveApp.getFolderById("destination folder id");

  // 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;
  }

  // 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()])
      {
        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;
      }
    }
  }
}

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

Если вы работаете с Расширенный сервис в скрипте приложений, часто бывает полезно просмотреть документацию клиентской библиотеки API Google для соответствующего API, поскольку не существует конкретного эквивалента документации скрипта приложений. Лично я считаю, что с Эквивалент Python проще всего работать.

Tehhowch, спасибо за такой ответ работает отлично. Я также ценю подробное объяснение. Я также проверю предложение Python. Очень признателен!

Pete Gorka 15.03.2018 13:11

Другие вопросы по теме