google-apps-script - problems - formulario google excel
Exporte(o imprima) con un script de google la nueva versión de las hojas de cálculo de google al archivo pdf, usando las opciones de PDF (2)
Estoy tratando de hacer un script de google para exportar (o imprimir) una nueva versión de la hoja de cálculo (o hoja) de google a pdf, con los parámetros de página (retrato / paisaje, ...)
Investigué sobre esto y encontré una posible solución aquí . Existen varias soluciones similares como esta, pero solo funcionan con la versión anterior de la hoja de cálculo de Google.
Por favor, considere este código:
function exportAsPDF() {
//This code runs from a NEW version of spreadsheet
var oauthConfig = UrlFetchApp.addOAuthService("google");
oauthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
oauthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope=https://spreadsheets.google.com/feeds/");
oauthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
oauthConfig.setConsumerKey("anonymous"); oauthConfig.setConsumerSecret("anonymous");
var requestData = { "method": "GET", "oAuthServiceName": "google","oAuthUseToken": "always" };
var ssID1="0AhKhywpH-YlQdDhXZFNCRFROZ3NqWkhBWHhYTVhtQnc"; //ID of an Old version of spreadsheet
var ssID2="10xZX9Yz95AUAPu92BkBTtO0fhVk9dz5LxUmJQsJ7yPM"; //ID of a NEW version of spreadsheet
var ss1 = SpreadsheetApp.openById(ssID1); //Old version ss object
var ss2 = SpreadsheetApp.openById(ssID2); //New version ss object
var sID1=ss1.getActiveSheet().getSheetId().toString(); // old version sheet id
var sID2=ss2.getActiveSheet().getSheetId().toString(); // new version sheet id
//For Old version, this runs ok.
var url1 = "https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key="+ssID1+"&gid="+sID1+"&portrait=true"+"&exportFormat=pdf";
var result1 = UrlFetchApp.fetch(url1 , requestData);
var contents1=result1.getBlob();
var pdfFile1=DriveApp.createFile(contents1).setName("FILE1.pdf");
//////////////////////////////////////////////
var url2 = "https://spreadsheets.google.com/feeds/download/spreadsheets/Export?key="+ssID2+"&gid="+sID2+"&portrait=true"+"&exportFormat=pdf";
var result2 = UrlFetchApp.fetch(url2 , requestData);
var contents2=result2.getBlob();
var pdfFile2=DriveApp.createFile(contents2).setName("FILE2.pdf");
}
Funciona correctamente y genera el archivo "FILE1.pdf", que se puede abrir correctamente. Pero para la nueva versión de la hoja de cálculo, da como resultado el error 302 ( respuesta del servidor truncado ) en " var result2 = UrlFetchApp.fetch (url2, requestData); ". Bueno, está bien porque el formato url para la nueva versión no incluye el argumento "clave". Una URL correcta para las nuevas versiones debe ser como "https://docs.google.com/spreadsheets/d/"+ssID2+"/export?gid="+sID2+"&portrait=true&format=pdf"
Al usar esto para url2 ( var url2 = "https://docs.google.com/spreadsheets/d/"+ssID2+"/export?gid="+sID2+"&portrait=true&format=pdf"
) falla nuevamente con el error " Autorización no se puede realizar para el servicio: google ". Bueno, este error podría deberse a un alcance incorrecto para RequestTokenUrl . Encontré el alcance alternativo https://docs.google.com/feeds
y lo configuré: oauthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope=https://docs.google.com/feed/");
Después de que el código se ejecuta nuevamente, ocurre un nuevo error en la línea con UrlFetchApp.fetch(url2 , requestData);
: " Error OAuth " ... No sé cómo continuar ... He probado cientos de variaciones sin buenos resultados.
¿Algunas ideas? ¿Es correcto el alcance de docs.google.com/feeds para la nueva versión de las hojas de cálculo? es correcto el oauthConfig ?
Gracias por adelantado.
Aquí está mi script de hoja de cálculo a PDF. Funciona con la nueva API de Google Spreadsheet.
// Convert spreadsheet to PDF file.
function spreadsheetToPDF(id,index,url,name)
{
SpreadsheetApp.flush();
//define usefull vars
var oauthConfig = UrlFetchApp.addOAuthService("google");
var scope = "https://docs.google.com/feeds/";
//make OAuth connection
oauthConfig.setAccessTokenUrl("https://www.google.com/accounts/OAuthGetAccessToken");
oauthConfig.setRequestTokenUrl("https://www.google.com/accounts/OAuthGetRequestToken?scope="+scope);
oauthConfig.setAuthorizationUrl("https://www.google.com/accounts/OAuthAuthorizeToken");
oauthConfig.setConsumerKey("anonymous");
oauthConfig.setConsumerSecret("anonymous");
//get request
var request = {
"method": "GET",
"oAuthServiceName": "google",
"oAuthUseToken": "always",
"muteHttpExceptions": true
};
//define the params URL to fetch
var params = ''?gid=''+index+''&fitw=true&exportFormat=pdf&format=pdf&size=A4&portrait=true&sheetnames=false&printtitle=false&gridlines=false'';
//fetching file url
var blob = UrlFetchApp.fetch("https://docs.google.com/a/"+url+"/spreadsheets/d/"+id+"/export"+params, request);
blob = blob.getBlob().setName(name);
//return file
return blob;
}
Tuve que usar el parámetro "muteHttpExceptions" para conocer exactamente la nueva URL. Con este parámetro, descargué mi archivo con la extensión HTML para obtener una página "Movido permanentemente" con mi url final (" https://docs.google.com/a/ " + url + "/ spreadsheets / d /" + id + "/ exportar" + params ").
Y tenga en cuenta que estoy en una organización. Así que tuve que especificar su nombre de dominio (parámetro "url", es decir, "mydomain.com").
(Copiado de esta respuesta )
Esta función es una adaptación de un script proporcionado por "ianshedd ..." aquí .
Eso:
- Genera archivos PDF de TODAS las hojas en una hoja de cálculo y las almacena en la misma carpeta que contiene la hoja de cálculo. (Supone que solo hay una carpeta haciendo eso, aunque Drive permite la contención múltiple).
- Nombres de archivos PDF con nombres de hojas de cálculo y hojas.
- Utiliza el servicio de Drive (DocsList está en desuso).
- Puede usar una ID de hoja de cálculo opcional para operar en cualquier hoja. Por defecto, espera trabajar en la "hoja de cálculo activa" que contiene la secuencia de comandos.
- Solo necesita autorización "normal" para operar; no es necesario activar servicios avanzados o
oAuthConfig
conoAuthConfig
.
Con un poco de investigación y esfuerzo, puede conectarse a una API PDF Merge en línea para generar un solo archivo PDF. Salvo eso, y hasta que Google proporcione una forma de exportar todas las hojas en un PDF, usted se quedará atrapado con archivos separados.
Guión:
/**
* Export one or all sheets in a spreadsheet as PDF files on user''s Google Drive,
* in same folder that contained original spreadsheet.
*
* Adapted from https://code.google.com/p/google-apps-script-issues/issues/detail?id=3579#c25
*
* @param {String} optSSId (optional) ID of spreadsheet to export.
* If not provided, script assumes it is
* sheet-bound and opens the active spreadsheet.
* @param {String} optSheetId (optional) ID of single sheet to export.
* If not provided, all sheets will export.
*/
function savePDFs( optSSId, optSheetId ) {
// If a sheet ID was provided, open that sheet, otherwise assume script is
// sheet-bound, and open the active spreadsheet.
var ss = (optSSId) ? SpreadsheetApp.openById(optSSId) : SpreadsheetApp.getActiveSpreadsheet();
// Get URL of spreadsheet, and remove the trailing ''edit''
var url = ss.getUrl().replace(/edit$/,'''');
// Get folder containing spreadsheet, for later export
var parents = DriveApp.getFileById(ss.getId()).getParents();
if (parents.hasNext()) {
var folder = parents.next();
}
else {
folder = DriveApp.getRootFolder();
}
// Get array of all sheets in spreadsheet
var sheets = ss.getSheets();
// Loop through all sheets, generating PDF files.
for (var i=0; i<sheets.length; i++) {
var sheet = sheets[i];
// If provided a optSheetId, only save it.
if (optSheetId && optSheetId !== sheet.getSheetId()) continue;
//additional parameters for exporting the sheet as a pdf
var url_ext = ''export?exportFormat=pdf&format=pdf'' //export as pdf
+ ''&gid='' + sheet.getSheetId() //the sheet''s Id
// following parameters are optional...
+ ''&size=letter'' // paper size
+ ''&portrait=true'' // orientation, false for landscape
+ ''&fitw=true'' // fit to width, false for actual size
+ ''&sheetnames=false&printtitle=false&pagenumbers=false'' //hide optional headers and footers
+ ''&gridlines=false'' // hide gridlines
+ ''&fzr=false''; // do not repeat row headers (frozen rows) on each page
var options = {
headers: {
''Authorization'': ''Bearer '' + ScriptApp.getOAuthToken()
}
}
var response = UrlFetchApp.fetch(url + url_ext, options);
var blob = response.getBlob().setName(ss.getName() + '' - '' + sheet.getName() + ''.pdf'');
//from here you should be able to use and manipulate the blob to send and email or create a file per usual.
//In this example, I save the pdf to drive
folder.createFile(blob);
}
}