Преобразование таблицы Google в Excel с помощью AppScript и отправка по электронной почте

Я задал вопрос о том, как конвертировать электронную таблицу Google, чтобы преуспеть с AppScript 2015

и руководствовался ответом в этом другом сообщении qaru.site/questions/1566079/...

Казалось, что это сработало, но у меня возникла новая проблема: созданный файл меньше, чем должен быть, и не открывается (поврежден). Вот полный код:

function crearBackUp() {
//pone en la variable -sheet- a la hoja activa
var sheet = SpreadsheetApp.getActiveSpreadsheet();
//obtiene la fecha para ponerle al nombre del archivo
var d = new Date();
var mes = d.getMonth() + 1;
var anio = d.getFullYear();
var nombre = "backUP_BaseDatos_BN_"+mes.toString()+anio.toString();
//creo una copia y obtengo el ID para pasarlo a Drive
var theBKP = sheet.copy(nombre);
var theID = theBKP.getId();
//Abro el arch con Drive y exporto a XLS
var file = Drive.Files.get(theID);
var url = file.exportLinks[MimeType.MICROSOFT_EXCEL];
var response = UrlFetchApp.fetch(url); 
var doc = response.getBlob();
//crea el archivo con DriveApp pasasndole el Blob
var theFile = DriveApp.createFile(doc).setName(file.title + '.xlsx');
//Manda el mail
MailApp.sendEmail('[removed_email]', 'Subject','Mensaje', {
 filename: nombre,
 attachments: theFile
 })
}

Интересно, нет ли этого более простого или более прямого метода, поскольку это для меня довольно обходное решение.

1 ответ

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

В любом случае ключевая проблема, когда я пробовал этот код, заключалась в том, что Drive Advanced Service возвращал html вместо файла excel, и, глядя на этот html, он выглядел как страница авторизации. Поэтому я решил, что нам нужно предоставить токен для UrlFetch, чтобы он работал.

Здесь мой результирующий код:

function crearBackUp() {
 var sheet = SpreadsheetApp.getActiveSpreadsheet();
 var d = new Date();
 var mes = d.getMonth() + 1;
 var anio = d.getFullYear(); 
 var nombre = "backUP_BaseDatos_BN_"+mes.toString()+anio.toString();
 var file = Drive.Files.get(sheet.getId());
 var url = file.exportLinks[MimeType.MICROSOFT_EXCEL];
 var response = UrlFetchApp.fetch(url,
 {headers:{Authorization:"Bearer "+ScriptApp.getOAuthToken()}});
 var doc = response.getBlob();
 doc.setName(nombre+ '.xlsx');
 MailApp.sendEmail('[removed_email]', 'Subject', 'Mensaje', {attachments:[doc]});
}

licensed under cc by-sa 3.0 with attribution.