Ugrás a fő tartalomra

AppSheet automatizmusok kombinálása és összekapcsolása

 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:

  1. Ingyenes/Olcsóbb: Nem fogyasztja az AppSheet "Automation" kvótáját (ami Core csomagtól felfelé számít).

  2. Archiválás: Sokkal szabadabban kezelheted a mappastruktúrát (pl. Év/Hónap/Nap mappák dinamikus létrehozása).

  3. 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:

  1. Google Sheet: Az AppSheeted adatbázisa (legyen egy "Orders" munkalap).

  2. Google Doc Sablon: Egy dokumentum, amiben vannak {{Dátum}}, {{Összeg}} típusú helyőrzők.

  3. 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.

  1. Az Apps Script szerkesztőben bal oldalt kattints az óra ikonra (Triggers).

  2. Kattints a "Add Trigger" gombra (jobb alul).

  3. Állítsd be így:

    • Function to run: createDailyReportPDF

    • Event source: Time-driven

    • Type of time based trigger: Day timer

    • Time of day: Midnight to 1am (vagy amikorra biztosan minden adat beért).

  4. 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:

  1. 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).

  2. 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.

  1. Kattints a Deploy gombra (jobb felül) -> New deployment.

  2. Válaszd a Select type fogaskereket -> Web app.

  3. Description: Pl. "Riport API v1".

  4. Execute as: Me (A te nevedben fusson - így hozzáfér a te Drive-odhoz).

  5. 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.

  6. Kattints a Deploy gombra.

  7. 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

  1. Menj az Actions menübe.

  2. Hozz létre egy új Actiont: "Generálás Most".

  3. For a record of this table: A fent említett tábla (pl. Admin).

  4. Do this: Set the values of some columns in this row.

  5. Set these columns:

    • Last_Report_Generated = NOW()

  6. 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.

  1. Menj az Automation fülre -> New Bot.

  2. 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).

  3. 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()>>"
      }
      
  4. Mentsd el az Appot.

Tesztelés

  1. Nyisd meg az Appot.

  2. Menj az Admin nézetre.

  3. Nyomd meg a "Generálás Most" gombot.

  4. 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:

  1. 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).

  2. 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