Nivel de programación: Principiante
Duración: 15 minutos
Tipo de proyecto: Automatización con un menú personalizado
Objetivos
- Comprender lo que hace la solución
- Comprender lo que hacen los servicios de Apps Script en la solución
- Configura la secuencia de comandos.
- Ejecuta la secuencia de comandos.
Acerca de esta solución
Para ahorrar tiempo y reducir los errores que se generan cuando copias y pegas contenido de forma manual, puedes importar automáticamente el contenido de varios documentos a un documento principal.
Esta solución se enfoca en agregar informes de estado del proyecto, pero puedes editarla para que se adapte a tus necesidades.
Cómo funciona
La secuencia de comandos crea una carpeta para almacenar los documentos desde los que deseas importar contenido y un documento de plantilla desde donde comenzar la importación. La secuencia de comandos también incluye funciones que crean documentos de muestra para demostrar esta solución.
Cuando un usuario selecciona Importar resúmenes en el menú personalizado, la secuencia de comandos obtiene todos los archivos de Documentos de la carpeta y, luego, itera a través de cada uno. La secuencia de comandos busca una cadena y un tipo de encabezado específicos para identificar el texto de resumen que debe copiar. Después de copiar el texto, la secuencia de comandos cambia el color del texto de la cadena de identificador para mitigar la duplicación. La secuencia de comandos pega los resúmenes en el documento principal, cada uno en su propia tabla de una sola celda.
Servicios de Apps Script
En esta solución, se usan los siguientes servicios:
- Servicio de documentos: Crea la plantilla y los documentos de origen de muestra. Itera en cada documento de origen en busca de resúmenes de proyectos nuevos para importar. Importa los resúmenes al documento principal.
Actualiza los documentos de origen para evitar que los resúmenes se importen más de una vez.
- Servicio de Drive: Crea una carpeta para almacenar los documentos de origen. Agrega el documento de plantilla y los documentos de origen de muestra a la carpeta.
- Servicio de utilidades: Da formato a la fecha en la que la secuencia de comandos agrega al documento principal cada vez que la secuencia de comandos importa resúmenes desde los documentos de origen.
- Servicio base: usa la clase
Session
para obtener la zona horaria de la secuencia de comandos. La secuencia de comandos usa la zona horaria cuando agrega la fecha de
importación al documento principal.
Requisitos previos
Para usar esta muestra, necesitas los siguientes requisitos previos:
- Una Cuenta de Google (es posible que las cuentas de Google Workspace requieran la aprobación del administrador)
- Un navegador web con acceso a Internet
Configura la secuencia de comandos
Haz clic en el botón que aparece a continuación para crear una copia del documento Contenido agregado.
Crear una copia
Ejecuta la secuencia de comandos:
Ejecutar una demostración con documentos de muestra
- Haz clic en Importar resúmenes > Configurar
> Ejecutar la configuración de la demostración con documentos de muestra.
Es posible que debas actualizar la página para que aparezca este menú personalizado.
Cuando se te solicite, autoriza la secuencia de comandos.
Si la pantalla de consentimiento de OAuth muestra la advertencia Esta app no está verificada, selecciona Configuración avanzada >
Ir a {Nombre del proyecto} (no seguro).
Vuelve a hacer clic en Importar resúmenes > Configurar
> Ejecutar la configuración de la demostración con documentos de muestra.
Cuando se te solicite, copia la URL de la carpeta de Drive para usarla en un paso posterior.
Haz clic en OK.
Haz clic en Importar resúmenes > Importar resúmenes.
Cuando se te solicite, haz clic en Aceptar.
Revisa los resúmenes del proyecto que se importaron a partir de los documentos de muestra.
Cómo agregar e importar un resumen
- En una pestaña nueva del navegador, pega la URL de la carpeta para abrir la carpeta Project status.
- Abre el archivo Project ABC.
- Crea un resumen nuevo para importar. Para ello, agrega el siguiente contenido al final del documento:
- Escribe
Summary
y establece el estilo de texto en Título 3.
- Justo debajo de
Summary
, inserta una tabla de 1 x 1. Asegúrate de que no haya líneas en blanco entre Summary
y la tabla.
- En la tabla, escribe
Hello world!
.
- Vuelve al documento principal y haz clic en Importar resúmenes
> Importar resúmenes.
- Cuando se te solicite, haz clic en Aceptar.
- Consulta tu importación más reciente al final del documento.
Revisa el código
Para revisar el código de Apps Script de esta solución, haz clic en Ver código fuente a continuación:
Consulta el código fuente
Setup.gs
/**
* Copyright 2022 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* This file contains functions that create the template and sample documents.
*/
/**
* Runs full setup configuration, with option to include samples.
*
* Called from menu & setupWithSamples()
*
* @param {boolean} includeSamples - Optional, if true creates samples files. *
*/
function setupConfig(includeSamples) {
// Gets folder to store documents in.
const folder = getFolderByName_(PROJECT_FOLDER_NAME)
let msg =
`\nDrive Folder for Documents: '${PROJECT_FOLDER_NAME}'
\nURL: \n${folder.getUrl()}`
// Creates sample documents for testing.
// Remove sample document creation and add your own process as needed.
if (includeSamples) {
let filesCreated = 0;
for (let doc of samples.documents) {
filesCreated += createGoogleDoc(doc, folder, true);
}
msg += `\n\nFiles Created: ${filesCreated}`
}
const ui = DocumentApp.getUi();
ui.alert(`${APP_TITLE} [Setup]`, msg, ui.ButtonSet.OK);
}
/**
* Creates a single document instance in the application folder.
* Includes import settings already created [Heading | Keywords | Table]
*
* Called from menu.
*/
function createSampleFile() {
// Creates a new Google Docs document.
const templateName = `[Template] ${APP_TITLE}`;
const doc = DocumentApp.create(templateName);
const docId = doc.getId();
const msg = `\nDocument created: '${templateName}'
\nURL: \n${doc.getUrl()}`
// Adds template content to the body.
const body = doc.getBody();
body.setText(templateName);
body.getParagraphs()[0].setHeading(DocumentApp.ParagraphHeading.TITLE);
body.appendParagraph('Description').setHeading(DocumentApp.ParagraphHeading.HEADING1);
body.appendParagraph('');
const dateString = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'MMMM dd, yyyy');
body.appendParagraph(`${FIND_TEXT_KEYWORDS} - ${dateString}`).setHeading(APP_STYLE);
body.appendTable().appendTableRow().appendTableCell('TL;DR');
body.appendParagraph("");
// Gets folder to store documents in.
const folder = getFolderByName_(PROJECT_FOLDER_NAME)
// Moves document to application folder.
DriveApp.getFileById(docId).moveTo(folder);
const ui = DocumentApp.getUi();
ui.alert(`${APP_TITLE} [Template]`, msg, ui.ButtonSet.OK);
}
/**
* Configures application for demonstration by setting it up with sample documents.
*
* Called from menu | Calls setupConfig with option set to true.
*/
function setupWithSamples() {
setupConfig(true)
}
/**
* Sample document names and demo content.
* {object} samples[]
*/
const samples = {
'documents': [
{
'name': 'Project GHI',
'description': 'Google Workspace Add-on inventory review.',
'content': 'Reviewed all of the currently in-use and proposed Google Workspace Add-ons. Will perform an assessment on how we can reduce overlap, reduce licensing costs, and limit security exposures. \n\nNext week\'s goal is to report findings back to the Corp Ops team.'
},
{
'name': 'Project DEF',
'description': 'Improve IT networks within the main corporate building.',
'content': 'Primarily focused on 2nd thru 5th floors in the main corporate building evaluating the network infrastructure. Benchmarking tests were performed and results are being analyzed. \n\nWill submit all findings, analysis, and recommendations next week for committee review.'
},
{
'name': 'Project ABC',
'description': 'Assess existing Google Chromebook inventory and recommend upgrades where necessary.',
'content': 'Concluded a pilot program with the Customer Service department to perform inventory and update inventory records with Chromebook hardware, Chrome OS versions, and installed apps. \n\nScheduling a work plan and seeking necessary go-forward approvals for next week.'
},
],
'common': 'This sample document is configured to work with the Import summaries custom menu. For the import to work, the source documents used must contain a specific keyword (currently set to "Summary"). The keyword must reside in a paragraph with a set style (currently set to "Heading 3") that is directly followed by a single-cell table. The table contains the contents to be imported into the primary document.\n\nWhile those rules might seem precise, it\'s how the application programmatically determines what content is meant to be imported and what can be ignored. Once a summary has been imported, the script updates the heading font to a new color (currently set to Green, hex \'#2e7d32\') to ensure the app ignores it in future imports. You can change these settings in the Apps Script code.'
}
/**
* Creates a sample document in application folder.
* Includes import settings already created [Heading | Keywords | Table].
* Inserts demo data from samples[].
*
* Called from menu.
*/
function createGoogleDoc(document, folder, duplicate) {
// Checks for duplicates.
if (!duplicate) {
// Doesn't create file of same name if one already exists.
if (folder.getFilesByName(document.name).hasNext()) {
return 0 // File not created.
}
}
// Creates a new Google Docs document.
const doc = DocumentApp.create(document.name).setName(document.name);
const docId = doc.getId();
// Adds boilerplate content to the body.
const body = doc.getBody();
body.setText(document.name);
body.getParagraphs()[0].setHeading(DocumentApp.ParagraphHeading.TITLE);
body.appendParagraph("Description").setHeading(DocumentApp.ParagraphHeading.HEADING1);
body.appendParagraph(document.description);
body.appendParagraph("Usage Instructions").setHeading(DocumentApp.ParagraphHeading.HEADING1);
body.appendParagraph(samples.common);
const dateString = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), 'MMMM dd, yyyy');
body.appendParagraph(`${FIND_TEXT_KEYWORDS} - ${dateString}`).setHeading(APP_STYLE);
body.appendTable().appendTableRow().appendTableCell(document.content);
body.appendParagraph("");
// Moves document to application folder.
DriveApp.getFileById(docId).moveTo(folder);
// Returns if successfully created.
return 1
}
Colaboradores
Google mantiene esta muestra con la ayuda de Expertos de Google Developers.
Próximos pasos