google apps script - sheets - Guión de aplicaciones de Google para enviar por correo electrónico la hoja de cálculo de google a la versión Excel
hoja de calculo google drive (5)
Como pasé cerca de cuatro horas jugando Rumpelstiltskin porque ninguno de los fragmentos de código normalmente muy antiguos para las antiguas versiones de hoja de cálculo y el antiguo OAUTH puedes encontrar cuando buscas en google "google docs script send excel attachment" o similar (es decir, quieres tomar una existente Hoja de cálculo, convertirlo a formato Excel y enviarlo como archivo adjunto de correo electrónico) realmente funcionó, finalmente encontré la solución.
Para crear el contenido del archivo adjunto real, ni el supuesto res.getContent () ni res.getBlob () ni res.getBytes funcionaron por sí solos. ¡Estas pistas son engañosas!
Lo único que funciona para mí es response.getBlob (). GetContent ()!
Código entero:
function sendCurrentDocAsEmail() {
var driveService = getDriveService();
var ssID = SpreadsheetApp.getActiveSpreadsheet().getId();
var sheetName = SpreadsheetApp.getActiveSpreadsheet().getName();
var email = "[email protected]"
var subject = "Here be Subjects";
var body = "Don''t even think about learning how to code. It''s wasted time.";
var file = Drive.Files.get(ssID );
var url = file.exportLinks[MimeType.MICROSOFT_EXCEL];
var response = UrlFetchApp.fetch(url, {
headers: {
Authorization: ''Bearer '' + driveService.getAccessToken()
}
});
var attachments = [{
fileName:sheetName+".xlsx",
content: response.getBlob().getBytes(), // this single line has cost me hours!
mimeType:"application//xls",
headers: {
Authorization: ''Bearer '' + driveService.getAccessToken()
}
}];
MailApp.sendEmail(email,subject ,body, {attachments:attachments});
}
Donde getDriveService () es una función del archivo léame "OAuth2 for Apps Script" de Google en https://github.com/googlesamples/apps-script-oauth2
Me gustaría escribir un script de aplicaciones para enviar por correo electrónico una versión de Excel de mi hoja de cálculo de Google. Sé que puedo guardar la hoja de cálculo como un archivo de Excel. No estoy seguro si puedo usar la secuencia de comandos para enviar por correo electrónico la versión de Excel como archivo adjunto. ¿Cómo puede hacerse esto?
Utilice el siguiente fragmento de código después de modificarlo para adaptarlo a sus necesidades
var file = DocsList.getFileById(FILE_ID);
var attachment = file.getAs(''application/vnd.ms-excel'');
MailApp.sendEmail("[email protected]", "Subject", " Body" , {"fileName": "Your_file_name" , "mimeType" : "application/vnd.ms-excel" , "content":attachment.getBytes() } );
Tenga en cuenta que este código no está probado, así que no dude en corregir un error o dos que puedan aparecer.
El que funcionó para mí:
var AUTH_TOKEN = "Enter your OAuth_Token";
ssID = SpreadsheetApp.getActiveSpreadsheet().getId();
var url = "http://spreadsheets.google.com/feeds/download/spreadsheets/Export?key="+ ssID + "&exportFormat=xls";
//Add &gid=x at the end of above url if you only want a particular sheet
var auth = "AuthSub token=/"" + AUTH_TOKEN + "/"";
var res = UrlFetchApp.fetch(url, {headers: {Authorization: auth}});
var attachments = [{fileName:"<Filename>.xls", content: res.getContent(),mimeType:"application/vnd.ms-excel"}];
MailApp.sendEmail("<recipient''s email id>", "<email subject>", "<email body>", {attachments: attachments});
Obtenga la documentación de OAuth y su token desde aquí https://developers.google.com/accounts/docs/OAuth2
La última versión de trabajo está debajo. Según este ejemplo, es decir, similar a la respuesta anterior, pero utiliza la cuenta de servicio de Google, que no requiere un enlace humano para recibir un token. Debes instalar la biblioteca de Oath de Google, las instrucciones son bastante claras.
var PRIVATE_KEY = ''xxx''
var CLIENT_EMAIL = ''xxx'';
var USER_EMAIL=Session.getActiveUser().getEmail()
function getOathService() {
return OAuth2.createService(''GoogleDrive:'' + USER_EMAIL)
// Set the endpoint URL.
.setTokenUrl(''https://accounts.google.com/o/oauth2/token'')
// Set the private key and issuer.
.setPrivateKey(PRIVATE_KEY)
.setIssuer(CLIENT_EMAIL)
// Set the name of the user to impersonate. This will only work for
// Google Apps for Work/EDU accounts whose admin has setup domain-wide
// delegation:
// https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority
.setSubject(USER_EMAIL)
// Set the property store where authorized tokens should be persisted.
.setPropertyStore(PropertiesService.getScriptProperties())
// Set the scope. This must match one of the scopes configured during the
// setup of domain-wide delegation.
.setScope(''https://www.googleapis.com/auth/drive'');
}
function sendEmail() {
var oathService = getOathService();
var ssID = SpreadsheetApp.getActiveSpreadsheet().getId();
var file = Drive.Files.get(ssID );
var url = file.exportLinks[MimeType.MICROSOFT_EXCEL];
var file = UrlFetchApp.fetch(url, {
headers: {
Authorization: ''Bearer '' + oathService.getAccessToken()
}
});
var attachments = [{
fileName:''xxx.xls'',//TODO DATE
content: file.getBlob().getBytes(),
mimeType:"application//xls",
headers: {
Authorization: ''Bearer '' + oathService.getAccessToken()
}
}];
MailApp.sendEmail(''[email protected]'', ''xxx'', ''Hi,/n/nPlease see the last data in attachment'',{attachments:attachments});
}
Después de una respuesta en otra publicación reciente ( Thomas van Latum ), probé la doc api sugerida y obtuve un resultado interesante ... aquí está el código de prueba que usé y que está funcionando bien, excepto que el archivo está en formato xlsx, no en xls pero esto no es necesariamente un problema en estos días:
function googleOAuth_(name,scope) {
var oAuthConfig = UrlFetchApp.addOAuthService(name);
oAuthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope);
oAuthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
oAuthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
oAuthConfig.setConsumerKey(''anonymous'');
oAuthConfig.setConsumerSecret(''anonymous'');
return {oAuthServiceName:name, oAuthUseToken:"always"};
}
function test(){
var id = ''spreadsheet_ID''
var url = ''https://docs.google.com/feeds/'';
var doc = UrlFetchApp.fetch(url+''download/spreadsheets/Export?key=''+id+''&exportFormat=xls'',
googleOAuth_(''docs'',url)).getBlob()
DocsList.createFile(doc).rename(''newfile.xls'')
}
Nota: si no le cambia el nombre, su nombre predeterminado es Export.xlsx
, podría ser más útil obtener su ID para usarlo más tarde ... así que la última línea podría ser así:
var xlsfileID = DocsList.createFile(doc).getId()
EDITAR: para activar el proceso de autorización, pruebe una pequeña función como esta, ejecútela desde el editor de scripts
function autorise(){
// function to call to authorize googleOauth
var id=SpreadsheetApp.getActiveSpreadsheet().getId();
var url = ''https://docs.google.com/feeds/'';
var doc = UrlFetchApp.fetch(url+''download/documents/Export?exportFormat=html&format=html&id=''+id,
googleOAuth_(''docs'',url)).getContentText();
}