От приложенного Excel в Outlook или Gmail к Google листу (VBA / Script) - возможно? - PullRequest
0 голосов
/ 18 февраля 2019

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

Хорошо, так что дело в том, что я ежедневно получаю электронное письмо в Outlook с приложенным листом Excel (он содержит данные).

Я работаю с приборной панелью / шаблонами в Google Data Studio и с Google-листами, и для того, чтобы это работало гладко, мне нужно автоматически перенести данные из Excel-листа на мой Google-лист.Возможно ли это случайно?

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

Может быть, код VBA для переноса прикрепленного файла excel на google-диск, и тогда я смогу обновить свой лист google?Возможно ли это?

Есть идеи?Вся помощь приветствуется.Спасибо!Примечание: я еще не достаточно опытен, чтобы написать скрипт VBA / APP с нуля.

1 Ответ

0 голосов
/ 22 февраля 2019

Q: ОП спрашивает: можно ли перенести электронную таблицу Excel, полученную в качестве вложения Outlook, на google-диск, а затем обновить ее до формата Google Sheet?

A: Да.


Q: Какие отдельные шаги необходимы для достижения цели ОП?
A:
1 - написать макрос в Outlook для автоматической пересылки электронной почты иВложение Excel в учетную запись GMail ОП;специально для учетной записи, используемой для входа в Google Sheets.Для целей этого ответа этот аспект, хотя и довольно простой, рассматривается как не по теме.

2 - Создайте папку (или папку / подпапку) на Google Диске, где можно сохранить электронную таблицу Excel.Это может быть сделано вручную или по сценарию.«Вручную» проще, «по сценарию» веселее и предлагает больше гибкости.

3 - Запустите скрипт Google, чтобы получить доступ к учетной записи ОП Gmail, идентифицировать вложения Excel (например, файлы, заканчивающиеся на «xls»,«xlsx», «xlsm» - могут быть добавлены другие варианты) и сохраните файл Excel в папке Google Drive.Прикрепите «ярлык» к каждому соответствующему письму, чтобы обрабатывались только новые необработанные сообщения.

4 - Запустите скрипт Google для доступа к папке / подпапке на Google Диске и преобразуйте электронную таблицу Excel в Google Sheet.


Как отмечалось в комментариях, эта тема поднималась в той или иной форме много раз раньше: Существует ли какой-либо API Google, который мог бы сохранять вложения в сообщения gmail на диске Google? и Конвертироватьвсе xls файлы, доступные в папке в «Google Doc Spreadsheets»? являются двумя хорошими примерами.Поиск Google покажет много других тем - о StackOverflow и других источниках.

Однако службы Google (Документы, скрипты, API и т. Д.) Постоянно совершенствуются.Одним из побочных продуктов этой разработки является то, что некоторые методы прекращены, и это может сделать ранее правильный ответ устаревшим.

К сожалению, это относится к превосходной функции GmailToDrive(), предоставленной в ответе на январь 2018 года на Существует ли какой-либо API Google, который может сохранять вложения в сообщения gmail на диске Google? .Google Advanced Drive Service и Drive API изменились в течение 2018 года, и этот превосходный ответ теперь стоит за последним препятствием.

Следующий код предоставляется для предоставления обновления до февраля 2019 года. Основой этого ответа является функция GmailToDrive(), предоставляемая Mr.Rebot, но измененная для файлов Excel.


Триггер

Код должен быть установлен как управляемый по времени, устанавливаемый триггер.Частота будет варьироваться от случая к случаю.ОП может сделать свою собственную оценку.Есть другие источники, которые могут объяснить это.


API-интерфейс Drive

OP должен активировать API-интерфейс Drive (Advanced Services, а также Google Cloud).Платформа API Dashboard).Для ясности в конце этого ответа приводится краткое описание шагов.


Код

// GLOBALS
// Array of file extension which you would like to extract to Drive
var fileTypesToExtract = ['xls', 'xlsx', 'xlsm'];

//Name of the folders in google drive in which files will be put
var homeFolder = "009-StackExchange"; // a folder branching from the root
var ExcelFolderName = "010-GmailToDrive"; // sub folder of "homeFolder"

//Name of the label which will be applied after processing the mail message
var emaillabelName = 'GmailToDrive';

function so54755021()
// an adaptation of function GmailToDrive()
{

  //build query to search emails
  var query = '';

  // loop through the filestoextract and add to query
  for (var i in fileTypesToExtract) {
    query += (query == '' ? ('filename:' + fileTypesToExtract[i]) : (' OR filename:' + fileTypesToExtract[i]));
  }
  //Logger.log("DEBUG: #01 the query is: " + query); //DEBUG

  query = 'in:inbox has:nouserlabels ' + query;
  //Logger.log("DEBUG: #02 the query is: " + query); //DEBUG

  var threads = GmailApp.search(query);
  //Logger.log("DEBUG: threads = " + threads + "; threads length = " + threads.length); //DEBUG

  var label = getGmailLabel_(emaillabelName);
  //Logger.log("DEBUG: label = " + label); //DEBUG (GmailToDrive)

  var parentFolder;

  if (threads.length > 0) {
    //Logger.log("DEBUG: threads length is more than zero");//DEBUG

    //Logger.log("DEBUG: folder name = " + folderName); //DEBUG  
    //parentFolder = getFolder_(folderName); // subroutine

    // build sub-folder if necessary
    createDriveFolder(homeFolder, ExcelFolderName);
    parentFolder = homeFolder;

  }


  for (var i in threads) {
    var mesgs = threads[i].getMessages();
    for (var j in mesgs) {
      //get attachments
      var attachments = mesgs[j].getAttachments();
      for (var k in attachments) {
        var attachment = attachments[k];
        //Logger.log("DEBUG: attachment: " + attachment);//DEBUG

        var isExcelType = checkIfExcel_(attachment);
        //Logger.log("DEBUG: isExceltype = " + isExcelType);//DEBUG

        if (!isExcelType) continue;

        // Copy the Blob
        var attachmentBlob = attachment.copyBlob();
        //Logger.log("DEBUG: attachmentblob = " + attachmentBlob);//DEBUG

        var ExcelFolderObject = DriveApp.getFoldersByName(ExcelFolderName).next();

        //Create the Excel file in Google Drive
        var file = ExcelFolderObject.createFile(attachmentBlob);

        // get the file name and ID
        var fileid = file.getId();
        var filename = file.getName();
        // Logger.log("DEBUG: file = " + file + ", and ID = " + fileid + ", and file name: " + filename);//DEBUG
        var fileType = file.getMimeType()
        // Logger.log("DEBUG: the MIME type is " + fileType);//DEBUG

        // copy the Blob again in preparation for conversion
        var xBlob = file.getBlob();

        // get the folder ID to copy the file
        var folderId = DriveApp.getFoldersByName(ExcelFolderName).next().getId();

        // set parameters for the new file
        var newFile = {
          title: filename + '_converted',
          key: fileid,
          parents: [{
            "id": folderId
          }]

        }

        // convert the file
        var convfile = Drive.Files.insert(newFile, xBlob, {
          convert: true
        });
        // Logger.log("DEBUG: the converted file is " + convfile);//DEBUG

      }
    }

    // Add the label to the Gmail item
    threads[i].addLabel(label);
  }
}


// If necessary, create the label in GMail
function getGmailLabel_(name) {
  var label = GmailApp.getUserLabelByName(name);
  if (label == null) {
    label = GmailApp.createLabel(name);
  }
  return label;
}

function createDriveFolder(baseFolder, folderName) {

  var baseFolderObject = DriveApp.getFoldersByName(baseFolder).next();
  //Logger.log("DEBUG: basefolderobject = " + baseFolderObject);//DEBUG
  var folders = DriveApp.getFoldersByName(baseFolder).next().getFolders();
  //Logger.log("DEBUG: folders: "+folders);//DEBUG

  // set variable to detect a match
  var foldermatch = 0;

  //Loop through folders
  while (folders.hasNext()) {

    var folder = folders.next();
    //Logger.log(DEBUG: folder.getName());//DEBUG

    // If the folder name matches
    if (folder.getName() == folderName) {

      // update the match variable
      foldermatch = 1;
      // Logger.log("DEBUG: there's a match/folder exists: " + folder.getName());//DEBUG
    }
  }

  // Do something is there is a match
  if (foldermatch != 0) {
    //Logger.log("DEBUG: There was a match so do NOTHING");//DEBUG


  } else {
    // Logger.log("DEBUG: There was no match so create the folder"); //DEBUG
    baseFolderObject.createFolder(folderName);
  }

  // The folder already existed, or it has been created. Either way, our work is done.
  return;
}


// this function will check for filextension type.
// and return boolean
function checkIfExcel_(attachment) {
  var fileName = attachment.getName();
  var temp = fileName.split('.');
  var fileExtension = temp[temp.length - 1].toLowerCase();
  if (fileTypesToExtract.indexOf(fileExtension) != -1) return true;
  else return false;
}


Включить Drive Api

1 - В Редакторе сценариев выберите Ресурсы> Расширенные службы Google;выберите Drive API и переведите переключатель в положение «Вкл.»
Advanced Google Services


2 - нажмите ссылку на «Панель инструментов API Google Cloud Platform»


3 - В новом окне открывается окно Google Cloud Platform - API и службы.
Нажмите ссылку, чтобы включить API и службы Google Cloud Platform - Enable APIs and Services


4 - Найдите «диск», а затем выберите опцию «Drive API».Search for


5 - Нажмите кнопку «Включить» для Drive API
enter image description here


6 - Система отобразит данные Drive API;обратите внимание, что Drive API включен.Тогда просто закройте это окно.the Drive API is enabled


7 - Нажмите кнопку ОК на экране «Дополнительные услуги Google» (который оставался открытым все это время).Вы готовы запустить скрипт.

...