Nível de programação: iniciante
Duração: 15 minutos
Tipo de projeto: automação com um menu personalizado
Objetivos
- Entenda o que a solução faz.
- Entenda o que os serviços do Apps Script fazem na solução.
- Configure o script.
- Execute o script.
Sobre esta solução
Para poupar tempo e reduzir erros ao copiar e colar manualmente, importe automaticamente o conteúdo de vários documentos para um documento principal.
Essa solução se concentra na agregação de relatórios de status de projeto, mas é possível editá-los
de acordo com suas necessidades.
Como funciona
O script cria uma pasta para armazenar os documentos de que você quer importar
o conteúdo e um documento de modelo para começar a importar. O script também
inclui funções que criam documentos de amostra para demonstrar essa solução.
Quando um usuário seleciona Importar resumos no menu personalizado, o script coleta todos os arquivos do documento na pasta e percorre cada um deles. O script procura uma string e um tipo de título específicos para identificar o texto de resumo que precisa ser copiado. Depois que o texto é copiado, o script muda a cor do texto da string identificador para reduzir a duplicação. O script cola os resumos no documento principal, cada um na própria tabela de célula única.
Serviços do Apps Script
Essa solução usa os seguintes serviços:
- Serviço de documentos: cria o modelo e
os documentos de origem de amostra. Itera em cada documento de origem procurando
novos resumos de projetos para importar. Importa os resumos para o documento principal.
Atualiza os documentos de origem para evitar que os resumos sejam importados mais
de uma vez.
- Serviço do Drive: cria uma pasta para armazenar os
documentos de origem. Adiciona à pasta o documento de modelo e os documentos de origem de amostra.
- Serviço utilitários: formata a data que o script adiciona ao documento principal sempre que o script importa resumos dos documentos de origem.
- Serviço base: usa a classe
Session
para saber o fuso horário do script. O script usa o fuso horário ao adicionar a data da
importação ao documento principal.
Pré-requisitos
Para usar esta amostra, você precisa dos seguintes pré-requisitos:
- Uma Conta do Google (as contas do Google Workspace podem
exigir a aprovação do administrador).
- Um navegador da Web com acesso à Internet.
Configurar o script
Clique no botão abaixo para fazer uma cópia do documento Conteúdo agregado.
Fazer uma cópia
Executar o script
Fazer uma demonstração com documentos de amostra
- Clique em Importar resumos > Configurar
> Executar configuração de demonstração com documentos de amostra.
Talvez seja necessário atualizar a página para que o menu personalizado apareça.
Quando solicitado, autorize o script.
Se a tela de permissão OAuth exibir o aviso Este app não foi verificado,
continue selecionando Avançado >
Ir para {Nome do projeto} (não seguro).
Clique em Importar resumos > Configurar
> Executar configuração de demonstração com documentos de amostra
novamente.
Quando solicitado, copie o URL da pasta do Drive para usar em uma
etapa posterior.
Clique em OK.
Clique em Importar resumos > Importar resumos.
Quando for solicitado, clique em OK.
Revise os resumos do projeto que foram importados dos documentos de amostra.
Adicionar e importar um resumo
- Em uma nova guia do navegador, cole o URL da pasta para abrir a pasta
Status do projeto.
- Abra o arquivo Projeto ABC.
- Crie um novo resumo para importar adicionando o seguinte conteúdo ao final
do documento:
- Digite
Summary
e defina o estilo de texto como Cabeçalho 3.
- Logo abaixo de
Summary
, insira uma tabela 1 x 1. Verifique se não há linhas em branco entre Summary
e a tabela.
- Na tabela, digite
Hello world!
.
- Volte para o documento principal e clique em Importar resumos
> Importar resumos.
- Quando for solicitado, clique em OK.
- Veja a importação mais recente no final do documento.
Revisar o código
Para revisar o código do Apps Script para esta solução, clique em
Ver código-fonte abaixo:
Acessar código-fonte
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
Esta amostra é mantida pelo Google com a ajuda de especialistas do Google Developers.
Próximas etapas