רמת קידוד: מתחילים
משך: 15 דקות
סוג הפרויקט: אוטומציה עם תפריט מותאם אישית
מטרות
- מבינים מה הפתרון עושה.
- להבין מה שירותי Apps Script עושים בפתרון.
- מגדירים את הסקריפט.
- מריצים את הסקריפט.
מידע על הפתרון הזה
כדי לחסוך זמן ולצמצם שגיאות הקשורות להעתקה והדבקה באופן ידני, אפשר לייבא באופן אוטומטי תוכן ממספר מסמכים למסמך ראשי אחד.
הפתרון הזה מתמקד בצבירה של דוחות סטטוס של פרויקט, אבל אתם יכולים לערוך אותו לפי הצרכים שלכם.
איך זה עובד
הסקריפט יוצר תיקייה לשמירת המסמכים שמהם רוצים לייבא תוכן ותבנית של מסמך כדי להתחיל לייבא ממנה. הסקריפט כולל גם פונקציות שיוצרות מסמכים לדוגמה כדי להדגים את הפתרון הזה.
כשמשתמש בוחר באפשרות ייבוא סיכומים מהתפריט המותאם אישית, הסקריפט מקבל את כל קובצי ה-Docs שבתיקייה ומבצע איטרציה בכל אחד מהם. הסקריפט מחפש מחרוזת ספציפית וסוג כותרת מסוים כדי לזהות את טקסט הסיכום שצריך להעתיק. אחרי העתקת הטקסט, הסקריפט משנה את צבע הטקסט של מחרוזת המזהה כדי לצמצם כפילויות. הסקריפט מדביק את הסיכומים במסמך הראשי, כל אחד בטבלה נפרדת בתא יחיד.
שירותי Apps Script
הפתרון הזה משתמש בשירותים הבאים:
- Document service – יוצר את התבנית ומסמכי המקור לדוגמה. עוברים על כל מסמך מקור כדי לחפש סיכומי פרויקטים חדשים לייבוא. מתבצע ייבוא של הסיכומים למסמך הראשי.
מתבצע עדכון של מסמכי המקור כדי למנוע ייבוא של סיכומים יותר מפעם אחת.
- שירות Drive – יצירת תיקייה לשמירת מסמכי המקור. הוספה של מסמך התבנית ומסמכי המקור לדוגמה לתיקייה.
- שירות תחזוקה – פורמט התאריך שבו הסקריפט מוסיף למסמך הראשי בכל פעם שהסקריפט מייבא סיכומים ממסמכי המקור.
- שירות בסיסי – משתמש במחלקה
Session
כדי לקבל
את אזור הזמן של הסקריפט. הסקריפט משתמש באזור הזמן כאשר מוסיפים את תאריך הייבוא למסמך הראשי.
דרישות מוקדמות
כדי להשתמש בדוגמה הזו, אתם צריכים את הדרישות המוקדמות הבאות:
- חשבון Google (יכול להיות שלחשבונות Google Workspace יהיה צורך באישור אדמין).
- דפדפן אינטרנט עם גישה לאינטרנט.
הגדרת הסקריפט
אפשר ללחוץ על הלחצן שלמטה כדי ליצור עותק של המסמך צבירה של תוכן.
יצירת עותק
הרצת הסקריפט
הפעלת הדגמה עם מסמכים לדוגמה
- לוחצים על ייבוא סיכומים > הגדרה
> הפעלת הגדרות הדגמה עם מסמכים לדוגמה.
ייתכן שיהיה צורך לרענן את הדף כדי להציג את התפריט המותאם אישית הזה.
כשמוצגת בקשה, מאשרים את הסקריפט.
אם במסך ההסכמה של OAuth מוצגת האזהרה האפליקציה הזו לא מאומתת, ממשיכים בלחיצה על מתקדם >
מעבר אל {Project Name} (לא בטוח).
לוחצים שוב על ייבוא סיכומים > הגדרה
> הפעלת הגדרה לדוגמה עם מסמכים לדוגמה.
כשמתבקשים לעשות זאת, מעתיקים את כתובת ה-URL של תיקיית Drive כדי להשתמש בה בשלב מאוחר יותר.
לוחצים על אישור.
לוחצים על ייבוא סיכומים > ייבוא סיכומים.
כשמופיעה בקשה, לוחצים על אישור.
בודקים את סיכומי הפרויקטים שיובאו מהמסמכים לדוגמה.
הוספה וייבוא של סיכום
- בכרטיסיית דפדפן חדשה, מדביקים את כתובת ה-URL של התיקייה כדי לפתוח את התיקייה Project status.
- פותחים את הקובץ Project ABC.
- כדי ליצור סיכום חדש לייבוא, מוסיפים את התוכן הבא לסוף המסמך:
- מקלידים
Summary
ומגדירים את סגנון הטקסט לכותרת 3.
- מוסיפים טבלה בגודל 1x1 ישירות מתחת ל-
Summary
. ודאו שאין שורות ריקות בין Summary
לבין הטבלה.
- מקלידים
Hello world!
בטבלה.
- חזרו למסמך הראשי ולחצו על ייבוא סיכומים
> ייבוא סיכומים.
- כשמופיעה בקשה, לוחצים על אישור.
- ניתן לצפות בייבוא האחרון שלך בסוף המסמך.
בדיקת הקוד
כדי לבדוק את קוד Apps Script של הפתרון הזה, יש ללחוץ על
הצגת קוד מקור למטה:
הצגת קוד המקור
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
}
תורמים
הדוגמה הזו מנוהלת על ידי Google בעזרת מומחי המפתחים של Google.
השלבים הבאים