Google Apps Script
Google Apps Script
Google Apps Script
#google-
apps-script
Tabla de contenido
Acerca de 1
Observaciones 2
Examples 2
Instalación o configuración 2
Tipos de scripts 3
Hola Mundo 4
Observaciones 6
Examples 6
Introducción 12
Examples 12
Ejemplo básico 13
Capítulo 4: DriveApp 14
Examples 14
Obtenga todas las carpetas: coloque las carpetas en un token de continuación y luego recup 15
Examples 19
Introducción 20
Examples 20
Ahora ha insertado el firebaseURL y la clave secreta. Ahora estás listo para ir. Haga clic 24
Capítulo 7: GmailApp 26
Observaciones 26
Examples 26
Introducción 27
Examples 27
Sintaxis 33
Parámetros 33
Observaciones 33
Examples 33
Introducción 35
Examples 35
Este es un ejemplo de una llamada del lado del cliente a un script de aplicación de Google 35
Capítulo 11: Script de la aplicación web de Google para descarga automática desde Google D 36
Introducción 36
Observaciones 36
Examples 36
forms.html 36
código.gs 37
Cómo funciona 38
Observaciones 41
Examples 41
Hoja 41
Observaciones 44
Examples 44
Obtenga todas las carpetas: coloque las carpetas en un token de continuación y luego recup 45
Parámetros 47
Examples 47
Obtenga archivos por tipo de archivo con cadena coincidente en nombre de archivo 47
Observaciones 49
Examples 49
Creditos 50
Acerca de
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: google-apps-script
It is an unofficial and free google-apps-script ebook created for educational purposes. All the
content is extracted from Stack Overflow Documentation, which is written by many hardworking
individuals at Stack Overflow. It is neither affiliated with Stack Overflow nor official google-apps-
script.
The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.
Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to [email protected]
https://riptutorial.com/es/home 1
Capítulo 1: Empezando con google-apps-
script
Observaciones
La descripción oficial de Google Apps Script se publica en http://www.google.com/script/start ,
desde allí
Desde https://developers.google.com/apps-script/guides/services/#basic_javascript_features
Examples
Instalación o configuración
Google Apps Script no requiere instalación o instalación. El único requisito es una cuenta de
Google. Una cuenta de Gmail funciona tan bien como una cuenta de Google Apps for Work /
Education / Government. Puede crear una nueva cuenta de Google yendo a accounts.google.com
Comience su primer script yendo a script.google.com . También puede acceder a Google Apps
Script en las tools -> Script editor... de muchas aplicaciones de Google, es decir , documentos,
hojas, formularios, etc. Google Apps Script también se puede agregar directamente a su Google
Drive con la función Connect more apps..
Para que los scripts de aplicación se ejecuten, deben contener un archivo code.gs. El archivo
code.gs debe contener una función llamada doGet (secuencias de comandos independientes) o
una función onOpen (secuencias de comandos adicionales). Los inicios rápidos en la
documentación contienen ejemplos.
Si una api está activada en el script de aplicación, también debe estar activada en la consola de
desarrolladores. Sin embargo, la consola de desarrolladores contiene api que se pueden activar
https://riptutorial.com/es/home 2
pero no aparecen en la interfaz de la aplicación-script. Por ejemplo, Marketplace SDK debe estar
activado en la consola de desarrolladores antes de que la aplicación pueda publicarse en Google
Play Store o en una implementación de dominio de G Suite.
Para las aplicaciones de Google para educación / trabajo / gobierno, hay configuraciones en la
consola de administración de dominio que se pueden ajustar para permitir o no permitir que se
ejecuten los scripts de aplicación.
Tipos de scripts
• Ser único
• Limitado a las aplicaciones de Google
• Aplicaciones web
Escritura independiente
Script enlazado a Google Apps también conocido como script enlazado a contenedor; a diferencia
de los scripts independientes, están vinculados a las aplicaciones de Google, es decir, Google
Docs o Google Sheets, etc. Los scripts encuadernados en contenedores pueden crearse
seleccionando tools> Script editor desde Google App. Algunas funciones, como los cuadros de
diálogo, las indicaciones, los menús y la barra lateral, solo se proporcionan mediante secuencias
de comandos de contenedor. Además, las secuencias de comandos de contenedor se utilizan
para crear complementos de Google . Consulte la documentación para los scripts enlazados al
contenedor.
Aplicaciones web
Google App Script se puede utilizar como aplicación web, ya que se puede acceder a él mediante
el navegador. La aplicación web puede proporcionar una interfaz de usuario en el navegador y
puede hacer uso de las aplicaciones de Google, es decir , documentos, hojas, etc. Tanto las
secuencias de comandos independientes como las de Google Apps pueden convertirse en
aplicaciones web. Para que cualquier script funcione como una aplicación web, el script debe
cumplir con dos requisitos:
https://riptutorial.com/es/home 3
Las funciones Inshort, doGet() y doPost() funcionan como los controladores http get y post request
respectivamente.
En su código, si tiene más de una función, antes de ejecutarla, debe mencionar la función con la
que desea ejecutar. Por ejemplo :
Alternativamente, puede presionar ctrl + r desde su teclado para ejecutar el código. Guardará el
código primero, si no se guarda, y luego lo ejecutará. Pero, para que esto funcione, debe haber
seleccionado la función, como se ve en la imagen de arriba.
Además, si algunas actividades externas invocan su script, aún podrá ver los registros haciendo
clic en ver-> registros si está registrando algo después de que se ejecuta el código.
Hola Mundo
function helloWorld()
{
Browser.msgBox("Hello World");
}
Para ejecutar el script, haga clic en ▶ o seleccione el elemento de menú Ejecutar -> helloWorld
Google Apps Script es una plataforma como servicio basado en JavaScript que se utiliza
https://riptutorial.com/es/home 4
principalmente para automatizar y ampliar Google Apps. Apps Script se ejecuta exclusivamente
en la infraestructura de Google y no requiere aprovisionamiento ni configuración del servidor. Un
IDE en línea sirve como interfaz para toda la plataforma que conecta todos los servicios que están
disponibles para Apps Script. La autenticación del usuario se incluye en la plataforma a través de
OAuth2 y no requiere ningún código o configuración por parte del autor del script.
Apps Script se ejecuta en el lado del servidor, pero puede tener interfaces de usuario creadas con
HTML, CSS, JavaScript o cualquier otra tecnología compatible con el navegador. A diferencia de
Nodejs, que está controlado por eventos, los scripts de aplicación se ejecutan en un modelo de
subprocesos. Todas las llamadas a un script generan una instancia única de ese script que se
ejecuta de forma aislada de todas las demás instancias. Cuando una instancia de un script
termina su ejecución se destruye.
Las funciones en Apps Script están bloqueando, por lo que no se necesitan patrones de
devolución de llamada y de programación asíncrona. El bloqueo se utiliza para evitar que las
secciones críticas de código, como el archivo IO, se ejecuten simultáneamente en diferentes
instancias.
https://riptutorial.com/es/home 5
Capítulo 2: Aplicaciones Script Web Apps
Observaciones
Esta es una aplicación web de formulario de ejemplo, el bit del lado del cliente muestra algunos
diseños UX básicos, como un botón de envío deshabilitado cuando se envía el formulario, o un
mensaje de error si falla ... etc.
El bit de Script de aplicaciones es muy básico. Contiene solo el código necesario para entregar el
html y validar el campo.
Aquí hay un enlace a esta aplicación de ejemplo en acción: Ejemplo de formulario de script de
aplicaciones
• Code.gs
• index.html
• Hoja de estilo.html
• JavaScript.html
Examples
Formulario de aplicación web
Script de aplicaciones:
//Called from the client with form data, basic validation for blank values
function formSubmit(formData){
for(var field in formData){
if(formData[field] == ''){
return {success: false, message: field + ' Cannot be blank'}
}
}
return {success: true, message: 'Sucessfully submitted!'};
}
HTML
https://riptutorial.com/es/home 6
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<link href="https://ssl.gstatic.com/docs/script/css/add-ons1.css" rel="stylesheet">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"
type="text/javascript"></script>
</head>
<body>
<div id="mainForm">
<h1>Example Form</h1>
<form>
<div>
<div class="inline form-group">
<label for="name">Name</label>
<input id="nameInput" style="width: 150px;" type="text">
</div>
</div>
<div>
<div class="inline form-group">
<label for="city">City</label>
<input id="cityInput" style="width: 150px;" type="text">
</div>
<div class="inline form-group">
<label for="state">State</label>
<input id="stateInput" style="width: 40px;" type="text">
</div>
<div class="inline form-group">
<label for="zip-code">Zip code</label>
<input id="zip-codeInput" style="width: 65px;" type="number">
</div>
</div>
<div class="block form-group">
<label for="typeSelect">Type</label>
<select id="typeSelect">
<option value="">
</option>
<option value="Type 1 ">
Type 1
</option>
<option value="Type 2 ">
Type 2
</option>
<option value="Type 3 ">
Type 3
</option>
<option value="Type 4 ">
Type 4
</option>
</select>
</div>
<button class="action" id="submitButton" type="button">Submit</button>
<button class="clear" id="clearFormButton" type="button">Clear Form</button>
</form>
<div class="hidden error message">
<div class="title">Error:</div>
<div class="message"></div>
</div>
<div class="hidden success message">
https://riptutorial.com/es/home 7
<div class="title">Message:</div>
<div class="message">Sucessfully submitted</div>
</div>
</div>
<?!= HtmlService.createHtmlOutputFromFile('JavaScript').getContent(); ?>
<?!= HtmlService.createHtmlOutputFromFile('Stylesheet').getContent(); ?>
</body>
</html>
CSS
<style>
.hidden {
display: none;
}
.form-group {
margin: 2px 0px;
}
#submitButton {
margin: 4px 0px;
}
body {
margin-left: 50px;
}
.message {
padding: 2px;
width: 50%;
}
.message > * {
display: inline-block;
}
.message .title {
font-weight: 700;
font-size: 1.1em;
}
.success.message {
border: 1px solid #5c9a18;
background: #e4ffe4;
color: #2a8e2a;
}
.error.message {
background: #f9cece;
border: 1px solid #7d2929;
}
.error.message .title {
color: #863030;
}
button.clear {
background: -moz-linear-gradient(top, #dd6e39, #d17636);
https://riptutorial.com/es/home 8
background: -ms-linear-gradient(top, #dd6e39, #d17636);
background: -o-linear-gradient(top, #dd6e39, #d17636);
background: -webkit-linear-gradient(top, #dd6e39, #d17636);
background: linear-gradient(top, #dd6e39, #d17636);
border: 1px solid transparent;
color: #fff;
text-shadow: 0 1px rgba(0, 0, 0, .1);
}
button.clear:hover {
background: -moz-linear-gradient(top, #ca602e, #bd6527);
background: -ms-linear-gradient(top, #ca602e, #bd6527);
background: -o-linear-gradient(top, #ca602e, #bd6527);
background: -webkit-linear-gradient(top, #ca602e, #bd6527);
background: linear-gradient(top, #ca602e, #bd6527);
border: 1px solid transparent;
color: #fff;
text-shadow: 0 1px rgba(0, 0, 0, .1);
}
</style>
JavaScript
<script>
var inputs = [
'nameInput',
'cityInput',
'stateInput',
'zip-codeInput',
'typeSelect'
];
$(function(){
var pageApp = new formApp();
$('#submitButton').on('click', pageApp.submitForm);
$('#clearFormButton').on('click', pageApp.clearForm);
});
google.script.run
.withSuccessHandler(self.sucessfullySubmitted)
.withFailureHandler(self.failedToSubmit)
https://riptutorial.com/es/home 9
.formSubmit(self.getFormData());
};
//Sets the general message box's message and enables or disabled the error box
function setSuccessMessage(show, message){
if(show){
$('.success.message').removeClass('hidden');
$('.success.message .message').text(message);
} else {
$('.success.message').addClass('hidden');
$('.success.message .message').text('');
}
}
//Sets the error message box's message and enables or disabled the error box
function setErrorMessage(show, message){
if(show){
$('.error.message').removeClass('hidden');
$('.error.message .message').text(message);
} else {
$('.error.message').addClass('hidden');
$('.error.message .message').text('');
}
}
function getFormData(){
var output = {};
for(var i = 0; i < inputs.length; i++){
output[inputs[i]] = $('#'+inputs[i]).val();
https://riptutorial.com/es/home 10
}
return output;
}
</script>
https://riptutorial.com/es/home 11
Capítulo 3: Crear una función personalizada
para las hojas de Google
Introducción
Una función personalizada en google docs está vinculada a un documento específico (y, por lo
tanto, solo se puede utilizar en ese documento).
Por lo tanto, debe crearse con la edición de secuencias de comandos de ese documento
(Herramientas -> Editor de secuencias de comandos). Una vez guardado, se puede usar como
cualquier otra fórmula de hoja de cálculo regular.
Examples
Gravedad estándar personalizada constante
/**
* Returns the standard gravity constant in the specified acceleration units
* Values taken from https://en.wikipedia.org/wiki/Standard_gravity on July 24, 2016.
*
* @param {number} input 1 for cm/s², 2 for ft/s², 3 for m/s²
*
* @customfunction
*/
function sg(units_key) {
var value;
switch(units_key) {
case 1:
value = 980.665;
break;
case 2:
value = 32.1740;
break;
case 3:
value = 9.80665;
break;
default:
throw new Error('Must to specify 1, 2 or 3');
}
return value;
}
Para usar la función, debe estar vinculada a una hoja de cálculo utilizando el editor de secuencias
de comandos (Herramientas -> Editor de secuencias de comandos ...). Una vez que se agrega la
función, se puede usar como cualquier otra función de las hojas de Google llamando a la función
en la fórmula de una celda.
https://riptutorial.com/es/home 12
Observe cómo se muestra la función en autocompletar cuando se escribe en una fórmula. Esto se
debe al comentario de varias líneas sobre la declaración de la función que se utiliza para describir
qué hace la función similar a JSDoc y Javadoc. Para que la fórmula aparezca en autocompletar,
la etiqueta @customfunction debe especificarse en el comentario.
Ejemplo básico
Para evitar errores antiestéticos #DIV/0 en una hoja de cálculo, se puede usar una función
personalizada.
/**
* Divides n by d unless d is zero, in which case, it returns
* the given symbol.
*
* @param {n} number The numerator
* @param {d} number The divisor
* @param {symbol} string The symbol to display if `d == 0`
* @return {number or string} The result of division or the given symbol
*
* @customfunction
*/
function zeroSafeDivide(n, d, symbol) {
if (d == 0)
return symbol;
else
return n / d;
}
Para usar la función, debe estar vinculada a una hoja de cálculo utilizando el editor de secuencias
de comandos ( Herramientas -> Editor de secuencias de comandos ... ). Una vez que se
agrega la función, se puede usar como cualquier otra función de las hojas de Google llamando a
la función en la fórmula de una celda.
Observe cómo se muestra la función en autocompletar cuando se escribe en una fórmula. Esto se
debe al comentario de varias líneas sobre la declaración de la función que se utiliza para describir
qué hace la función similar a JSDoc y Javadoc. Para que la fórmula aparezca en autocompletar,
la etiqueta @customfunction debe especificarse en el comentario.
Lea Crear una función personalizada para las hojas de Google en línea:
https://riptutorial.com/es/google-apps-script/topic/5572/crear-una-funcion-personalizada-para-las-
hojas-de-google
https://riptutorial.com/es/home 13
Capítulo 4: DriveApp
Examples
Crear una nueva carpeta en una raíz de Google Drive
function createNewFolderInGoogleDrive(folderName) {
return DriveApp.createFolder(folderName);
}
Use la función createNewFolderInGoogleDrive para crear una carpeta llamada Test folder en una
raíz de Google Drive:
function createGoogleDriveFileOfMimeType() {
var content,fileName,newFile;//Declare variable names
fileName = "Test File " + new Date().toString().slice(0,15);//Create a new file name with
date on end
content = "This is the file Content";
function createGoogleDriveTextFile() {
var content,fileName,newFile;//Declare variable names
fileName = "Test Doc " + new Date().toString().slice(0,15);//Create a new file name with
date on end
content = "This is the file Content";
function createGoogleDriveFileWithBlob() {
https://riptutorial.com/es/home 14
var blob,character,data,fileName,i,L,max,min,newFile,randomNmbr;//Declare variable names
fileName = "Test Blob " + new Date().toString().slice(0,15);//Create a new file name with
date on end
function processGoogleDriveFolders() {
var arrayAllFolderNames,continuationToken,folders,foldersFromToken,thisFolder;//Declare
variable names
https://riptutorial.com/es/home 15
function processGoogleDriveFiles() {
var arrayAllFileNames,continuationToken,files,filesFromToken,fileIterator,thisFile;//Declare
variable names
Logger.log(arrayAllFileNames);
};
if (!child) {
body = "There is no folder";
MailApp.sendEmail(Session.getEffectiveUser().getEmail(), "", "Error Adding Folder!", body)
return;
};
function createNewFolderInGoogleDrive() {
var folder,newFolderName,timeStamp,dateTimeAsString;
newFolderName = 'Test Folder Name ' + dateTimeAsString;//Create new folder name with
date/time appended to name
https://riptutorial.com/es/home 16
var body,returnedFolder;//Declare variable names
if (!child) {
body = "There is no file";
MailApp.sendEmail(Session.getEffectiveUser().getEmail(), "", "Error Adding File!", body)
return;
};
returnedFolder = DriveApp.addFile(child);
function createNewFileInGoogleDrive() {
var content,file,newFileName,timeStamp,dateTimeAsString;
content = "This is test file content, created at: " + dateTimeAsString;//Create content for
new file
newFileName = 'Test File ' + dateTimeAsString;//Create new file name with date/time appended
to name
function onOpen() {
function getFiles() {
// Look in the same folder the sheet exists in. For example, if this template is in
// My Drive, it will return all of the files in My Drive.
var ssparents = DriveApp.getFileById(ssid).getParents();
var sheet = ss.getActiveSheet();
// Loop through all the files and add the values to the spreadsheet.
var folder = ssparents.next();
var files = folder.getFiles();
var i=1;
https://riptutorial.com/es/home 17
while(files.hasNext()) {
var file = files.next();
if(ss.getId() == file.getId()){
continue;
}
sheet.getRange(i+1, 1, 1,
4).setValues([[file.getLastUpdated(),file.getOwner().getName(),file.getName(),
file.getUrl()]]);
i++;
}
}
https://riptutorial.com/es/home 18
Capítulo 5: DriveApp - getFileById (id)
Observaciones
También es posible obtener un archivo por la URL del archivo. El ID de un archivo está en la url,
por lo que usar el ID en lugar de la URL completa significa que el parámetro es más corto.
Almacenar la URL en lugar de la ID ocupa más espacio.
Examples
Obtenga un archivo de Google Drive utilizando el ID de archivo
function getGoogleDriveFileById(id) {
var file;
https://riptutorial.com/es/home 19
Capítulo 6: Firebase y AppScript:
Introducción
Introducción
Integre Firebase con Google AppScript para leer y escribir datos en la base de datos de Firebase.
Firebase es un sistema de base de datos NoSQL de Google que utiliza una base de datos en
tiempo real para ayudar a crear y alojar aplicaciones en dispositivos móviles, de escritorio y
tabletas. Las bases de datos NoSQL utilizan los objetos JSON para almacenar los datos en
formato estructurado.
Examples
Conexión a un proyecto de Firebase en GAS y transferencia de datos de
Google Spreadsheet a Firebase
https://riptutorial.com/es/home 20
• Ahora en la versión elegir la versión de lanzamiento público estable.
https://riptutorial.com/es/home 21
• Haga clic en Guardar. Ahora Firebase se instaló correctamente en su AppScript para que
pueda trabajar.
https://riptutorial.com/es/home 22
• Ahora para construir la base de datos en Firebase usando esta tabla en las hojas. Agregue
el siguiente código en el AppScript.
function writeDataToFirebase() {
var ss = SpreadsheetApp.openById("1LACsj0s3syAa9gvORdRWBhJ_YcXHybjQfHPgw3TLQ6g");
var sheet = ss.getSheets()[0];
var data = sheet.getDataRange().getValues();
var dataToImport = {};
for(var i = 1; i < data.length; i++) {
var firstName = data[i][0];
var lastName = data[i][1];
dataToImport[firstName + '-' + lastName] = {
firstName:firstName,
lastName:lastName,
emailAddress:data[i][2],
semester:data[i][4],
department:data[i][5],
};
}
var firebaseUrl = "https://example-app.firebaseio.com/";
var secret = "secret-key";
var base = FirebaseApp.getDatabaseByUrl(firebaseUrl, secret);
base.setData("", dataToImport);
}
https://riptutorial.com/es/home 23
• Vaya a la sección Cuentas de servicio donde puede encontrar el databaseURL. Esto sirve
como el firebaseURL.
• Ahora haga clic en la pestaña Secretos de la base de datos y podrá encontrar la clave
secreta.
Para ver la base de datos, vaya al panel de Firebase y haga clic en la base de datos para
ver la base de datos.
function myFunction(){
var firebaseUrl = "https://example-app.firebaseio.com/";
var secret = "secret-key";
var base = FirebaseApp.getDatabaseByUrl(firebaseUrl, secret);
base.setData("test", "Hello Firebase");
}
function getAllData() {
var firebaseUrl = "https://example-app.firebaseio.com/";
var secret = "secret-key";
var base = FirebaseApp.getDatabaseByUrl(firebaseUrl, secret);
var data = base.getData();
for(var i in data) {
Logger.log(data[i].firstName + ' ' + data[i].lastName);
}
}
Los datos leídos se muestran en los registros. Para verificar los registros, haga clic en
haga clic en Ver → Registros o simplemente use Control + Intro.
https://riptutorial.com/es/home 24
var firebaseUrl = "https://example-app.firebaseio.com/";
var secret = "secret-key";
var base = FirebaseApp.getDatabaseByUrl(firebaseUrl, secret);
var contact = base.getData("Yash-Udasi");
Logger.log(contact);
}
Los datos leídos se muestran en los registros. Para verificar los registros, haga clic en
haga clic en Ver → Registros o simplemente use Control + Intro.
function updateData() {
var firebaseUrl = "https://example-app.firebaseio.com/";
var secret = "secret-key";
var base = FirebaseApp.getDatabaseByUrl(firebaseUrl, secret);
base.updateData("Yash-Udasi/emailAddress", "[email protected]");
}
https://riptutorial.com/es/home 25
Capítulo 7: GmailApp
Observaciones
Consulte también la referencia de API oficial de GmailApp para obtener más detalles sobre los
métodos disponibles.
Examples
Obtener archivo CSV adjunto a un correo
Supongamos que tenemos un sistema que envía informes diarios por correo electrónico en forma
de archivos CSV adjuntos y que queremos acceder a ellos.
function getCsvFromGmail() {
// Get the newest Gmail thread based on sender and subject
var gmailThread = GmailApp.search("from:[email protected] subject:\"My daily report\"", 0,
1)[0];
// Get and and parse the CSV from the first attachment
var csv = Utilities.parseCsv(attachments[0].getDataAsString());
return csv;
}
https://riptutorial.com/es/home 26
Capítulo 8: Google hojas MailApp
Introducción
Este servicio permite a los usuarios enviar correos electrónicos con control completo sobre el
contenido del correo electrónico. A diferencia de GmailApp, el único propósito de MailApp es
enviar un correo electrónico. MailApp no puede acceder a la bandeja de entrada de Gmail de un
usuario.
Es más probable que los cambios en los scripts escritos con GmailApp desencadenen una
solicitud de nueva autorización de un usuario que los scripts de MailApp.
Examples
Un ejemplo básico de aplicación de correo
MailApp es la api de Google App Script que puede usarse para enviar correo
function sendEmails() {
• Usuario consumidor (es decir, cuenta personal de Gmail): 100 destinatarios / día
• Cliente de Google Apps (legado): 100 destinatarios / día
• GSuite (básico / Gov / Edu / Business): 1500 destinatarios / día
function checkQuota() {
Logger.log(MailApp.getRemainingDailyQuota());
}
function getSheetData() {
https://riptutorial.com/es/home 27
var numCols = 15; // Number of columns to process
return data;
}
También puede modificar la función anterior de la siguiente manera para obtener un rango
dinámico de datos del contenido presente en la hoja:
function getDataSheet() {
sheet = SpreadsheetApp.getActiveSheet();
return data;
}
function getDataSheet() {
sheet = SpreadsheetApp.getActiveSheet();
https://riptutorial.com/es/home 28
startRow = 2; // First row of data to process
numRows = 100; // Number of rows to process
startCol = 1; //First column of data to process
numCols = 15; // Number of columns to process
return data;
}
function sendEmail() {
//Sheet range starts from index 1 and data range starts from index 0
sheet.getRange(1 + i, emailCol).setValue(emailSent);
}
}
}
https://riptutorial.com/es/home 29
Enviando contenido HTML en correo
https://riptutorial.com/es/home 30
Ahora, actualice el método getMessage () del ejemplo anterior de la siguiente manera:
return message;
}
https://riptutorial.com/es/home 31
function getDataSheet() {
sheet = SpreadsheetApp.getActiveSheet();
return data;
}
return message;
}
function sendEmail() {
sheet.getRange(startRow + i, emailCol).setValue(emailSent);
}
}
}
https://riptutorial.com/es/home 32
Capítulo 9: Hoja de cálculo Añadir menú
Sintaxis
1. addMenu (nombre, subMenus)
Parámetros
Nombre Descripción
Observaciones
Por lo general, deseará llamar a addMenu desde la función onOpen para que el menú se cree
automáticamente cuando se carga la hoja de cálculo.
activeSheet.addMenu("addMenuExample", menuEntries);
}
Examples
Crear un nuevo menú
Crea un nuevo menú en la interfaz de usuario de la hoja de cálculo. Cada entrada del menú
ejecuta una función definida por el usuario.
https://riptutorial.com/es/home 33
activeSheet.addMenu("addMenuExample", menuEntries);
/*
Método: para crear un menú personalizado Esta es la primera función que se debe llamar cuando
se carga la aplicación
*/
function onOpen() {
var ui = SpreadsheetApp.getUi();
// Or DocumentApp or FormApp.
ui.createMenu('My HR')
.addItem('Send Form to All', 'sendIDPForm_All')
.addItem('Trigger IDP System', 'applyCategory')
.addToUi();
}
https://riptutorial.com/es/home 34
Capítulo 10: Llamadas del cliente a Google
apps-script
Introducción
Google Appscript funciona bien como una plataforma independiente y en el formato de
complemento para documentos, hojas y formularios de Google. Sin embargo, hay ocasiones en
que un navegador cliente puede necesitar llamar a una aplicación de Google para realizar alguna
acción.
Por lo tanto, Google introdujo las solicitudes del lado del cliente a los scripts de aplicaciones de
Google. Para resolver este problema, Google introdujo las bibliotecas del lado del cliente.
Examples
Este es un ejemplo de una llamada del lado del cliente a un script de
aplicación de Google
<script src="https://apis.google.com/js/api.js"></script>
<script>
function start() {
// 2. Initialize the JavaScript client library.
gapi.client.init({
'apiKey': 'YOUR_API_KEY',
// clientId and scope are optional if auth is not required.
'clientId': 'YOUR_WEB_CLIENT_ID.apps.googleusercontent.com',
'scope': 'profile',
}).then(function() {
// 3. Initialize and make the API request.
return gapi.client.request({
'path': 'https://people.googleapis.com/v1/people/me',
})
}).then(function(response) {
console.log(response.result);
}, function(reason) {
console.log('Error: ' + reason.result.error.message);
});
};
// 1. Load the JavaScript client library.
gapi.load('client', start);
</script>
https://riptutorial.com/es/home 35
Capítulo 11: Script de la aplicación web de
Google para descarga automática desde
Google Drive
Introducción
Esta sencilla aplicación web de Google Script (independiente) permite que Google Drive se vuelva
a sondear para que los archivos se descarguen en la PC local del usuario. Muestra cómo usar un
script de aplicación para proporcionar la función de: 1. La interfaz de usuario (una simple en este
ejemplo) 2. La página de descarga de archivos. Para una explicación más completa de cómo
funciona, lea el Ejemplo "Cómo funciona".
Observaciones
El Web Script debe ser publicado para que funcione.
Examples
forms.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<script>
setInterval(
function ()
{
document.getElementById('messages').innerHTML = 'Event Timer Fetching';
google.script.run
.withSuccessHandler(onSuccess)
.withFailureHandler(onFailure)
.fetchFromGoogleDrive();
}, 60000);
function callFetchGoogleDrive() {
document.getElementById('messages').innerHTML = 'Fetching';
google.script.run
.withSuccessHandler(onSuccess)
.withFailureHandler(onFailure)
.fetchFromGoogleDrive();
}
function onSuccess(sHref)
{
https://riptutorial.com/es/home 36
if(new String(sHref).valueOf() == new String("").valueOf())
{
document.getElementById('messages').innerHTML = 'Nothing to download';
}
else
{
document.getElementById('messages').innerHTML = 'Success';
document.getElementById('HiddenClick').href = sHref;
document.getElementById('HiddenClick').click(); // Must enable Pop Ups for
https://script.google.com
}
}
function onFailure(error)
{
document.getElementById('messages').innerHTML = error.message;
}
</script>
</head>
<body>
<div id="messages">Waiting to DownLoad!</div>
<div>
<a id="HiddenClick" href="" target="_blank" onclick="google.script.host.close"
style="visibility: hidden;">Hidden Click</a>
</div>
<div>
<button type="button" onclick='callFetchGoogleDrive();' id="Fetch">Fetch Now!</button>
</div>
</body>
</html>
código.gs
function doGet(e){
var serveFile = e.parameter.servefile;
var id = e.parameter.id;
if(serveFile)
{
return downloadFile(id); // and Hyde
}
if (fileslist.hasNext()) {
var afile = fileslist.next();
var html = ScriptApp.getService().getUrl()+"?servefile=true&id="+afile.getId();
return html;
}
else
{
return '';
}
https://riptutorial.com/es/home 37
}
Cómo funciona
Google Drive (Standalone) Web App para descargar automáticamente (Sondeo) archivos desde
Drive a la PC local del usuario (Carpeta de descarga).
DriveApp proporciona mecanismos para buscar y descargar archivos. Sin embargo, el mecanismo
de descarga tiene algunas limitaciones importantes debido a la arquitectura cliente / servidor que
heredó Google Apps. (No es culpa de Google)
El lado del servidor DriveApp no proporciona una función directa para descargar a la PC local
porque el servidor no tiene idea de dónde está el cliente y la descarga del archivo al servidor en sí
no tendría sentido.
El código del lado del servidor necesita un mecanismo para proporcionar al código del lado del
cliente los datos del archivo o un enlace al archivo. Se proporcionan estos dos mecanismos, pero
los datos del primero se limitan a ser utilizados directamente por el código del lado del cliente. El
cliente no tiene ningún mecanismo para guardar los datos, una vez obtenidos, en la PC local. Por
lo tanto, se puede utilizar para mostrar los datos en la propia página web.
El segundo mecanismo permite que la url de la secuencia de comandos (en sí) o la url del archivo
de Drive se devuelva. La URL del archivo de Drive no es muy útil ya que no se puede usar
directamente en el navegador del cliente para descargar el archivo. Colocar esta URL en el ancla
(y hacer clic en ella) solo da como resultado una página web que se abre pero que en realidad no
hace nada (excepto posiblemente ver el archivo en línea).
Eso deja el script url. Sin embargo, la URL del script solo proporciona el script y no el archivo.
Para iniciar una descarga, el archivo del servicio Drive debe devolverse desde la función doGet /
doPost de la secuencia de comandos del lado del servidor utilizando ContentService
createTextOutput exactamente como se muestra en las guías en línea de Google. Sin embargo,
https://riptutorial.com/es/home 38
esto implica que no puede haber ningún otro elemento de UI en la página web generado por los
resultados devueltos por doGet / doPost.
Esto nos deja con una solución muy poco atractiva. Una página web en blanco sin elementos de
usuario de la interfaz de usuario que descarga una página, se cierra y requiere que se abra
manualmente cada vez que se requiera otra descarga.
Este script utiliza un enfoque del Dr. Jekyll y Mr Hyde para resolver este problema.
Si el script se abre sin parámetros para GET (doGet), entonces se muestra de forma
predeterminada un formulario. Esta será la condición cuando la aplicación publicada se abra por
primera vez por un usuario. La forma proporcionada en este ejemplo es extremadamente simple.
Si el script se abre con el parámetro servefile = true, entonces el script se comporta como una
descarga de archivos de Drive.
El javascript del lado del cliente contiene un mecanismo de sondeo (temporizador de eventos
setInterval) que periódicamente llama al script del lado del servidor para verificar la disponibilidad
de otro archivo para descargar.
Cuando se ejecuta el script del lado del servidor si encuentra algún archivo de Drive que coincida
con los criterios de búsqueda *, devuelve la url del script adjunto con los parámetros:
Esta información se devuelve como una cadena al cliente a través del mecanismo reconocido con
SucursHandler.
La secuencia de comandos java del cliente luego actualiza el HREF de un ancla oculta con esta
información devuelta y luego hace clic en el ancla automáticamente.
Esto hace que se inicie otra invocación de la aplicación / script. Cuando se inicie la nueva
invocación de la aplicación, doGet detectará el parámetro de archivo de servicio y, en lugar de
devolver la interfaz de usuario, devolverá el archivo al navegador. El archivo devuelto será el
identificado por el parámetro de ID proporcionado que fue previamente devuelto por la búsqueda
descrita anteriormente.
Dado que el archivo con el ID proporcionado todavía existe, se descargará y la nueva invocación
de la aplicación se cerrará, quedando la primera invocación para repetir este proceso.
Por supuesto, la forma simple puede extenderse para proporcionar una interfaz de usuario más
https://riptutorial.com/es/home 39
rica si es necesario. Tales como proporcionar los criterios de búsqueda de archivos.
Lea Script de la aplicación web de Google para descarga automática desde Google Drive en
línea: https://riptutorial.com/es/google-apps-script/topic/8212/script-de-la-aplicacion-web-de-
google-para-descarga-automatica-desde-google-drive
https://riptutorial.com/es/home 40
Capítulo 12: Servicio de hoja de cálculo
Observaciones
La referencia de API oficial para el servicio de hoja de cálculo se puede encontrar en
https://developers.google.com/apps-script/reference/spreadsheet/ .
Examples
Hoja
Insertar columna
Insertar fila
Valor de celda
https://riptutorial.com/es/home 41
cell.setValue(100);
Copiar celdas
Fórmula
Imagine que tenemos una hoja de cálculo de Google por separado y necesitamos obtener el valor
de la celda B2 a la celda D5 en su hoja actual.
function copyValueandPaste()
{
var source = SpreadsheetApp.openById('spread sheet id is here'); //Separate spreadsheet
book
var sourcesheet = source.getSheetByName('Sheet1'); //Sheet tab with source data
var sourceCellValue = sourcesheet.getRange('B2').getValue(); // get B2 cell value
https://riptutorial.com/es/home 42
Inserción de matrices como filas
Tenga en cuenta que esto agregará la fila después de la última fila no vacía .
var newRowIndex = 2;
var row = ["Gandalf", "?", "Wizard", "?", 2019];
someSheet.insertRowBefore(newRowIndex);
// getRange(row, col, numRows, numCols)
someSheet.getRange(newRowIndex, 1, 1, row.length).setValues([row]); // Note 2D array!
Gran parte de este código inútil se puede abstraer en una función auxiliar:
https://riptutorial.com/es/home 43
Capítulo 13: Servicio DriveApp
Observaciones
Los tipos Mime de Google no se pueden usar para el tercer parámetro de Tipos Mime. El uso de
un tipo Mime de Google generará un error que indica:
No se puede usar "DriveApp.createFile ()" para crear tipos MIME de Google. Por favor, utilice el
servicio de unidad avanzada
MimeType.GOOGLE_APPS_SCRIPT
MimeType.GOOGLE_DOCS
MimeType.GOOGLE_DRAWINGS
MimeType.GOOGLE_FORMS
MimeType.GOOGLE_SHEETS
MimeType.GOOGLE_SLIDES
Examples
Crear una nueva carpeta en la unidad raíz de Google
function createNewFolderInGoogleDrive() {
var folderName,newFolder;//Declare variable names
function createGoogleDriveFileOfMimeType() {
var content,fileName,newFile;//Declare variable names
fileName = "Test File " + new Date().toString().slice(0,15);//Create a new file name with
date on end
content = "This is the file Content";
https://riptutorial.com/es/home 44
function createGoogleDriveTextFile() {
var content,fileName,newFile;//Declare variable names
fileName = "Test Doc " + new Date().toString().slice(0,15);//Create a new file name with
date on end
content = "This is the file Content";
function createGoogleDriveFileWithBlob() {
var blob,character,data,fileName,i,L,max,min,newFile,randomNmbr;//Declare variable names
fileName = "Test Blob " + new Date().toString().slice(0,15);//Create a new file name with
date on end
function processGoogleDriveFolders() {
var arrayAllFolderNames,continuationToken,folders,foldersFromToken,thisFolder;//Declare
variable names
https://riptutorial.com/es/home 45
the continuation token is working
function processGoogleDriveFiles() {
var arrayAllFileNames,continuationToken,files,filesFromToken,fileIterator,thisFile;//Declare
variable names
Logger.log(arrayAllFileNames);
};
https://riptutorial.com/es/home 46
Capítulo 14: Servicio DriveApp - Archivos por
tipo y cadena de búsqueda
Parámetros
Examples
Obtenga archivos por tipo de archivo con cadena coincidente en nombre de
archivo
Obtenga todos los formularios de Google con la palabra "Sin título" en el nombre del archivo.
function mainSearchFunction(searchStr) {
var fileInfo,arrayFileIDs,arrayFileNames,arrayOfIndexNumbers,
allFileIDsWithStringInName,i,searchStr,thisID;//Declare variables
if (!searchStr) {
searchStr = "Untitled";//Assign a string value to the variable
};
allFileIDsWithStringInName = [];
arrayFileIDs = fileInfo[0];
for (i=0;i<arrayOfIndexNumbers.length;i+=1) {
thisID = arrayFileIDs[arrayOfIndexNumbers[i]];
allFileIDsWithStringInName.push(thisID);
};
Logger.log(allFileIDsWithStringInName)
};
function getFilesOfType() {
var allFormFiles,arrFileName,arrFileID,arrFileUrls,thisFile;
allFormFiles = DriveApp.getFilesByType(MimeType.GOOGLE_FORMS);
arrFileName = [];
arrFileID = [];
arrFileUrls = [];
while (allFormFiles.hasNext()) {
https://riptutorial.com/es/home 47
thisFile=allFormFiles.next();
arrFileName.push(thisFile.getName());
arrFileID.push(thisFile.getId());
arrFileUrls.push(thisFile.getUrl());
};
//Logger.log(arrFileName)
return [arrFileID,arrFileName];
};
function searchFileNamesForString(arrayFileNames,searchStr) {
var arrayIndexNumbers,i,L,thisName;
arrayIndexNumbers = [];
L = arrayFileNames.length;
for (i=0;i<L;i+=1){
thisName = arrayFileNames[i];
Logger.log(thisName);
Logger.log('thisName.indexOf(searchStr): ' + thisName.indexOf(searchStr));
return arrayIndexNumbers;
};
https://riptutorial.com/es/home 48
Capítulo 15: SpreadsheetApp Active Sheet
Observaciones
Método: getActive ()
Examples
getActive () - Obtener hoja de cálculo activa
https://riptutorial.com/es/home 49
Creditos
S.
Capítulos Contributors
No
Aplicaciones Script
2 Douglas Gaskell
Web Apps
DriveApp -
5 Sandy Good
getFileById (id)
Firebase y
6 AppScript: Joseba, Vishal Vishwakarma
Introducción
7 GmailApp nibarius
Google hojas Bhupendra Piprava, Brian, Jordan Rhea, Kos, nibarius, Saloni
8
MailApp Vithalani
Hoja de cálculo
9 Bishal, iJay, nibarius
Añadir menú
Script de la
aplicación web de
11 Google para Walter
descarga automática
desde Google Drive
Servicio de hoja de
12 cdrini, iJay, nibarius, Sandy Good, sudo bangbang
cálculo
https://riptutorial.com/es/home 50
Archivos por tipo y
cadena de búsqueda
SpreadsheetApp
15 iJay
Active Sheet
https://riptutorial.com/es/home 51