AppSheet automatizmusok kombinálása és összekapcsolása
Ez a feladat tökéletes példája annak, amikor átlépjük a "No-Code" határait a "Low-Code" irányába.
Bár az AppSheet beépített Automation (Bot) funkciója is tud PDF-et generálni, a Google Apps Script (GAS) használata mellett több érv is szól profi szinten:
Ingyenes/Olcsóbb: Nem fogyasztja az AppSheet "Automation" kvótáját (ami Core csomagtól felfelé számít).
Archiválás: Sokkal szabadabban kezelheted a mappastruktúrát (pl. Év/Hónap/Nap mappák dinamikus létrehozása).
Formázás: A Google Doc template-ek scriptből történő manipulálása (pl. dinamikus táblázatok beszúrása) rugalmasabb.
Íme egy forgatókönyv: "Napi Vezetői Riport". A script minden éjjel lefut, kigyűjti a tegnapi rendeléseket, beilleszti egy sablonba, PDF-et csinál belőle, és elmenti egy archív mappába.
Az Előkészületek (Prerequisites)
Mielőtt a kódot beillesztenéd, szükséged lesz 3 dologra:
Google Sheet: Az AppSheeted adatbázisa (legyen egy "Orders" munkalap).
Google Doc Sablon: Egy dokumentum, amiben vannak
{{Dátum}},{{Összeg}}típusú helyőrzők.Google Drive Mappa: Ahová a PDF-ek kerülnek.
A Script (Code)
Nyisd meg a Google Sheetet -> Extensions -> Apps Script, és másold be ezt a kódot. A kód tele van kommentekkel, hogy lásd a logikát.
function createDailyReportPDF() {
// --- 1. KONFIGURÁCIÓ (IDS) ---
// Ezeket cseréld ki a saját ID-jaidra (az URL-ből másolhatod ki őket)
const TEMPLATE_ID = '1xxxx-MINTA_DOC_ID_xxxx';
const DESTINATION_FOLDER_ID = '1xxxx-CEL_MAPPA_ID_xxxx';
const SHEET_NAME = 'Orders'; // A munkalap neve
// --- 2. ADATOK BEOLVASÁSA ---
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(SHEET_NAME);
// Teljes adattartomány beolvasása (fejléccel együtt)
const data = sheet.getDataRange().getValues();
const headers = data.shift(); // Levágjuk a fejlécet, maradnak az adatok
// Dátum logika: Tegnapi nap kiszámítása
const yesterday = new Date();
yesterday.setDate(yesterday.getDate() - 1);
const dateString = Utilities.formatDate(yesterday, Session.getScriptTimeZone(), "yyyy-MM-dd");
// Szűrés: Csak a tegnapi rendelések kellenek (feltételezve, hogy az 1. oszlop a dátum)
// Megjegyzés: A dátumformátumok egyeztetése kritikus pont, itt most egyszerűsítve van!
const dailyOrders = data.filter(row => {
let rowDate = new Date(row[0]); // Feltételezzük, hogy az 'A' oszlop a Dátum
return Utilities.formatDate(rowDate, Session.getScriptTimeZone(), "yyyy-MM-dd") === dateString;
});
if (dailyOrders.length === 0) {
Logger.log("Nincs tegnapi adat, a riport nem készül el.");
return;
}
// Összesítés (pl. végösszeg számolása a 3. oszlopból)
let totalAmount = 0;
dailyOrders.forEach(row => totalAmount += Number(row[2]));
// --- 3. DOKUMENTUM GENERÁLÁS ---
// 3.1. Másolat készítése a sablonról
const destinationFolder = DriveApp.getFolderById(DESTINATION_FOLDER_ID);
const tempFile = DriveApp.getFileById(TEMPLATE_ID).makeCopy('Napi Riport ' + dateString, destinationFolder);
const tempDoc = DocumentApp.openById(tempFile.getId());
const body = tempDoc.getBody();
// 3.2. Helyőrzők cseréje (Text Replacement)
body.replaceText('{{Datum}}', dateString);
body.replaceText('{{RendelesSzam}}', dailyOrders.length.toString());
body.replaceText('{{Vegosszeg}}', totalAmount + ' Ft');
// 3.3. Dinamikus Táblázat beszúrása (Haladó rész!)
// Beszúrunk egy táblázatot a doksi végére a tételekből
body.appendParagraph("Részletes lista:");
const table = body.appendTable();
// Fejléc sor
const tableHeader = table.appendTableRow();
tableHeader.appendTableCell("Dátum");
tableHeader.appendTableCell("Termék");
tableHeader.appendTableCell("Ár");
// Adatsorok
dailyOrders.forEach(order => {
let row = table.appendTableRow();
row.appendTableCell(order[0].toString()); // Dátum
row.appendTableCell(order[1].toString()); // Termék (B oszlop)
row.appendTableCell(order[2].toString()); // Ár (C oszlop)
});
// --- 4. PDF KONVERTÁLÁS ÉS TAKARÍTÁS ---
tempDoc.saveAndClose(); // Fontos: mentés, mielőtt PDF lesz
const pdfBlob = tempFile.getAs(MimeType.PDF);
destinationFolder.createFile(pdfBlob).setName('Napi_Riport_' + dateString + '.pdf');
// Az ideiglenes Google Doc törlése (hogy ne szemetelje tele a Drive-ot)
tempFile.setTrashed(true);
Logger.log("Sikeres PDF generálás!");
}
Hogyan automatizáld "minden éjjelre"? (A "Cron Job")
Programozóként tudod, hogy a kód önmagában nem fut le. Be kell állítani a Triggert.
Az Apps Script szerkesztőben bal oldalt kattints az óra ikonra (Triggers).
Kattints a "Add Trigger" gombra (jobb alul).
Állítsd be így:
Function to run:
createDailyReportPDFEvent source:
Time-drivenType of time based trigger:
Day timerTime of day:
Midnight to 1am(vagy amikorra biztosan minden adat beért).
Mentsd el. (Itt kérhet engedélyeket a Google fiókodhoz).
Miért jobb ez, mint az AppSheet Bot?
Dinamikus Táblázatok: Láttad a
body.appendTable()részt? Az AppSheet beépített template rendszere (Start/End kifejezések) néha nehézkes, ha komplex formázást akarsz. Itt teljes kontrollod van a DOM felett (Document Object Model).Debugolás: A
Logger.log()segítségével pontosan látod, mi történik, míg az AppSheet "Monitor" nézete néha túl általános hibaüzeneteket ad.Költséghatékonyság: Ez teljesen ingyenes, akár napi 1000 riportot is generálhatsz (a Google Drive API korlátain belül), míg az AppSheetben ez már Enterprise licenszért kiálthatna.
Szakértői tipp:
Ha igazán profi akarsz lenni, a script végére beszúrhatsz egy GmailApp.sendEmail(...) sort is, így reggelre ott vár a PDF a vezérigazgató email fiókjában csatolmányként.
Következő lépés
Most már van egy eszközöd a kódolás gyorsítására (Toolbox) és a háttérfolyamatok automatizálására (Apps Script).
Ez a "Profi" megoldás, amit az AppSheet Webhook és a Google Apps Script Web App funkciójának összekapcsolásával érünk el.
Ez a módszer azért jobb fejlesztői szemmel, mint az egyszerű "Call a script" task, mert:
Aszinkron/Leválasztott: Az AppSheet "kilövi" a kérést, és nem kell megvárnia, amíg a script végez (nem "fagy le" az app a PDF generálás alatt).
Paraméterezhető: A JSON payloadban bármilyen adatot átküldhetsz (pl. melyik felhasználó kérte, melyik dátumra).
Íme a lépések a megvalósításhoz:
1. Fázis: A Backend (Google Apps Script) felkészítése
A doPost(e) függvény a Google Apps Script belépési pontja a HTTP POST kérések számára. Ezt kell hozzáadnod a meglévő kódodhoz.
1. lépés: Kód kiegészítése Szúrd be ezt a függvényt a script fájlod elejére vagy végére:
function doPost(e) {
// 1. Biztonsági naplózás (Hogy lásd, beérkezett-e a kérés)
Logger.log("Webhook hívás érkezett az AppSheetből");
// 2. Opcionális: Adatok kinyerése a kérésből (JSON Payload)
// Ha később dinamikus paramétereket küldesz (pl. melyik napról kérsz riportot)
// var params = JSON.parse(e.postData.contents);
// var targetDate = params.date;
// 3. A PDF generáló logika meghívása
try {
createDailyReportPDF(); // Ez a korábbi függvényed!
// 4. Válasz küldése (HTTP 200 OK)
return ContentService.createTextOutput(JSON.stringify({
"status": "success",
"message": "PDF generálás elindítva"
})).setMimeType(ContentService.MimeType.JSON);
} catch (error) {
// Hiba kezelés
return ContentService.createTextOutput(JSON.stringify({
"status": "error",
"message": error.toString()
})).setMimeType(ContentService.MimeType.JSON);
}
}
2. lépés: Deploy (Publikálás) Ez a kritikus pont, ahol sokan elakadnak. Hogy az AppSheet lássa a scriptet, ki kell tenned az internetre.
Kattints a Deploy gombra (jobb felül) -> New deployment.
Válaszd a Select type fogaskereket -> Web app.
Description: Pl. "Riport API v1".
Execute as:
Me(A te nevedben fusson - így hozzáfér a te Drive-odhoz).Who has access:
Anyone(Bárki).Megjegyzés: Fejlesztéskor az "Anyone" a legegyszerűbb. Ha "Only myself"-re állítod, az AppSheetnek hitelesítenie kell magát, ami extra setup. Mivel a script URL-je titkos (olyan mint egy jelszó), az "Anyone" elfogadható belső használatra.
Kattints a Deploy gombra.
MÁSOLD KI a "Web App URL"-t! (Így végződik:
/exec). Erre lesz szükség az AppSheetben.
2. Fázis: A Frontend (AppSheet) beállítása
Az AppSheetben szükségünk van egy "triggerre" (ravasz), ami meghúzza ezt az URL-t.
1. lépés: A "Gomb" előkészítése (Adatbázis szint)
Az AppSheetben minden gomb valamilyen adatváltozáshoz kötött. Hozz létre (vagy használj) egy Admin vagy Settings táblát, ami csak 1 sorból áll.
Adj hozzá egy oszlopot:
Last_Report_Generated(Type: DateTime).Tipp: Ha nincs ilyen táblád, létrehozhatsz egy "Virtual Table"-t, de a legegyszerűbb, ha van egy dedikált Admin tábla.
2. lépés: Az Action (Művelet) létrehozása
Menj az Actions menübe.
Hozz létre egy új Actiont: "Generálás Most".
For a record of this table: A fent említett tábla (pl. Admin).
Do this:
Set the values of some columns in this row.Set these columns:
Last_Report_Generated=NOW()
Design: Adj neki egy nyomtató vagy PDF ikont, és tedd ki "Display as: Primary"-ra, hogy nagy gomb legyen.
3. lépés: Az Automation (A Bot) összerakása Most kötjük össze a gombnyomást a Scripttel.
Menj az Automation fülre -> New Bot.
Event (Esemény):
Nevezd el: "Manual Report Trigger".
Event Type:
Data Change->Updates_Only.Table: Az Admin táblád.
Condition:
[_THISROW_BEFORE].[Last_Report_Generated] <> [_THISROW_AFTER].[Last_Report_Generated](Csak akkor fusson, ha változott az időbélyeg).
Process (Folyamat):
Adj hozzá egy lépést (Step).
Step Type:
Call a webhook(Ez a kulcs!).Url: Illeszd be ide a GAS Web App URL-t, amit az 1. fázisban kimásoltál.
Verb:
POST.HTTP Content Type:
JSON.Body: (Opcionális, hagyhatod üresen
{}vagy küldhetsz adatot):{ "user": "<<USEREMAIL()>>", "requestTime": "<<NOW()>>" }
Mentsd el az Appot.
Tesztelés
Nyisd meg az Appot.
Menj az Admin nézetre.
Nyomd meg a "Generálás Most" gombot.
Figyeld a Drive mappádat. Pár másodpercen belül meg kell jelennie a PDF-nek.
Pro Debugging Tipp (Ha nem működne)
Ha megnyomod a gombot és nem történik semmi:
Az AppSheet szerkesztőben menj a Manage -> Monitor -> Audit History menübe. Itt látni fogod, ha a Webhook hívás "Failed" (pl. 404 vagy 500 hiba).
A Google Apps Script szerkesztőben bal oldalt az Executions (három vonal ikon) menüben látod, ha a script lefutott, de hibára futott (Failed) vagy sikeres volt (Completed).
Ezzel sikeresen építettél egy eseményvezérelt (Event-Driven) architektúrát: Gombnyomás -> Adatfrissítés -> Bot -> Webhook -> Apps Script -> PDF -> Drive.
Megjegyzések
Megjegyzés küldése