Niveau de codage: Débutant
Durée: 15 minutes
Type de projet: Automatisation avec un menu personnalisé
Objectifs
- Comprendre ce que la solution fait
- Comprendre ce que font les services Apps Script dans la solution.
- Configurez le script.
- Exécutez le script.
À propos de cette solution
Pour gagner du temps et réduire les erreurs liées au copier-coller manuel, vous pouvez importer automatiquement le contenu de plusieurs documents dans un document principal.
Cette solution se concentre sur l'agrégation des rapports d'état des projets, mais vous pouvez la modifier en fonction de vos besoins.
Fonctionnement
Le script crée un dossier pour stocker les documents à partir desquels vous souhaitez importer du contenu et un document de modèle à partir duquel commencer l'importation. Le script inclut également des fonctions qui créent des exemples de documents pour présenter cette solution.
Lorsqu'un utilisateur sélectionne Importer des récapitulatifs dans le menu personnalisé, le script récupère tous les fichiers Docs du dossier et les parcourt. Le script recherche une chaîne et un type de titre spécifiques pour identifier le texte récapitulatif à copier. Une fois le texte copié, le script modifie la couleur du texte de la chaîne d'identifiant pour limiter les duplications. Le script colle les résumés dans le document principal, chacun dans sa propre table à cellule unique.
Services Apps Script
Cette solution utilise les services suivants:
- Service de documents : crée le modèle et des exemples de documents sources. Itère dans chaque document source à la recherche de nouveaux résumés de projet à importer. Importe les résumés dans le document principal.
Met à jour les documents sources pour éviter que les résumés ne soient importés plusieurs fois.
- Service Drive : crée un dossier pour stocker les documents sources. Ajoute le document de modèle et des exemples de documents sources au dossier.
- Service d'utilitaires : formate la date que le script ajoute au document principal chaque fois qu'il importe des récapitulatifs à partir des documents sources.
- Service de base : utilise la classe
Session
pour obtenir le fuseau horaire du script. Le script utilise le fuseau horaire lors de l'ajout de la date d'importation au document principal.
Prérequis
Pour utiliser cet exemple, vous devez remplir les conditions préalables suivantes:
- Un compte Google (l'approbation de l'administrateur peut être nécessaire pour les comptes Google Workspace).
- Un navigateur Web avec accès à Internet
Configurer le script
Cliquez sur le bouton ci-dessous pour créer une copie du document Contenu agrégé.
Créer une copie
Exécuter le script
Exécuter une démonstration avec des exemples de documents
- Cliquez sur Importer des récapitulatifs > Configurer
> Exécuter la configuration de démonstration avec des exemples de documents.
Vous devrez peut-être actualiser la page pour que ce menu personnalisé s'affiche.
Lorsque vous y êtes invité, autorisez le script.
Si l'écran d'autorisation OAuth affiche l'avertissement Cette application n'est pas validée, sélectionnez Avancé >
Accéder à {Nom du projet} (non sécurisé).
Cliquez à nouveau sur Importer des récapitulatifs > Configurer
> Exécuter la configuration de démonstration avec des exemples de documents.
Lorsque vous y êtes invité, copiez l'URL du dossier Drive à utiliser à l'étape suivante.
Cliquez sur OK.
Cliquez sur Importer des récapitulatifs > Importer des récapitulatifs.
Lorsque vous y êtes invité, cliquez sur OK.
Examinez les résumés de projet importés à partir des exemples de documents.
Ajouter et importer un résumé
- Dans un nouvel onglet de navigateur, collez l'URL du dossier pour ouvrir le dossier État du projet.
- Ouvrez le fichier Project ABC (Projet ABC).
- Créez un résumé à importer en ajoutant le contenu suivant à la fin du document :
- Saisissez
Summary
, puis définissez le style de texte sur Titre 3.
- Juste en dessous de
Summary
, insérez un tableau 1x1. Assurez-vous qu'aucune ligne vide ne se trouve entre Summary
et le tableau.
- Dans le tableau, saisissez
Hello world!
.
- Revenez au document principal, puis cliquez sur Importer des récapitulatifs
> Importer des récapitulatifs.
- Lorsque vous y êtes invité, cliquez sur OK.
- Consultez votre dernière importation à la fin du document.
Examiner le code
Pour consulter le code Apps Script de cette solution, cliquez sur Afficher le code source ci-dessous:
Afficher le code source
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
}
Contributeurs
Cet exemple est géré par Google avec l'aide des experts Google pour les développeurs.
Étapes suivantes