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 и переведите переключатель в положение «Вкл.»
2 - нажмите ссылку на «Панель инструментов API Google Cloud Platform»
3 - В новом окне открывается окно Google Cloud Platform - API и службы.
Нажмите ссылку, чтобы включить API и службы
4 - Найдите «диск», а затем выберите опцию «Drive API».
5 - Нажмите кнопку «Включить» для Drive API
6 - Система отобразит данные Drive API;обратите внимание, что Drive API включен.Тогда просто закройте это окно.
7 - Нажмите кнопку ОК на экране «Дополнительные услуги Google» (который оставался открытым все это время).Вы готовы запустить скрипт.