Az SAP Scenes Pack grafikájának használata

A Google Táblázatok és a Google Apps Script felhasználása saját blog CMS készítéséhez

Nemrég bebotlottam a Google Apps Scriptsbe, egy olyan platformon, amely lehetővé teszi a felhasználók számára, hogy a Google G Suite online termékeit kibővítsék a JavaScriptből származó szkriptnyelven keresztül. Hasonló a VBA-hez, amely beépül a legtöbb Microsoft Office termékbe.

A Google Apps Scripts hihetetlenül nagy teljesítményű, és lehetővé teszi a komplex rendszerek felépítését a Google szolgáltatások tetején. Kiváló választás lehet, amikor gyorsan el kell készítenie egy ötlet prototípusát vagy meg kell terveznie egy olyan megoldást, amelyet a nem technikai felhasználók testreszabhatnak. A hozzáférhető megoldás nagyszerű módja az, hogy felépítik azokat a termékeket, amelyeket a felhasználók már ismernek.

Ebben a cikkben áttekintünk egy egyszerű, mégis újszerű példát egy „Tartalomkezelő Rendszer” (CMS) létrehozásáról egy online blog számára a Google Táblázatok, a Google Forms és a Google Apps Script segítségével.

A blogot egyoldalas alkalmazásként fogják kidolgozni, oldalt megjelölve és azzal a képességgel, hogy postai kategóriánként szűrhessen. A blogbejegyzéseket a Google Táblázatok táblázatban tárolják. Az új hozzászólásokat a Google Űrlapok segítségével egészítik ki, mivel felhasználóbarát felületet biztosítanak. A Google Apps Script segítségével felépíthető egy API, amellyel a táblázatkezelő tartalom könnyen használható formátumban elérhetővé válik.

https://danielireson.github.io/google-sheets-blog-cms

lemondás

Nem használom ezt a termelésben, és fogalmam sincs, hogy méretezhető-e. Gondolj rá a koncepció bizonyítékára, hogy megmutasd, mi lehetséges. Saját kutatást kell végeznie, ha termelési környezetben kívánja használni. Gyanítom, hogy a forgalom fojtódik, ha a szolgáltatási kvóták felső határához közelít. Az ingyenes Google-fiókokhoz tartozó szkriptek napi 20 000 URL-letöltését korlátozza, és vannak más korlátozások is.

Az adatok tárolása

A Google Táblázatok lapos fájlként fogják használni a blogbejegyzéseket. A sima állományú adatbázis egyszerű táblában tárolja az adatokat egyetlen táblázatban. Ezzel szemben egy relációs adatbázis rögzíti a táblázatok közötti kapcsolatokat, és érvényesíti ezeknek a kapcsolatoknak a szerkezetét a duplikáció minimalizálása és az adatok integritásának maximalizálása érdekében.

Bár korlátozottabb, a lapos fájlszerkezet egyszerűen elindul, és egy kis blog felhasználására alkalmas.

Táblázat szerkezete

Mindegyik sor egy új blogbejegyzést képvisel, az oszlopok pedig az egyes blogbejegyzési mezők rögzítésére szolgálnak. Lapos fájlszerkezetben nincs olyan primer és idegen kulcs fogalma, mint a relációs modellben. Az oszlopokban rögzített információk, például a kategória és a szerző, a blogbejegyzésekben ismétlődnek, ha általánosak.

Elkezdeni

Hozzon létre egy új Google Sheets táblázatot, és csatlakoztassa a Google Forms-hoz az Eszközök> Űrlap létrehozása menüpont alatt. Miután kiválasztotta ezt az opciót, egy szerkesztővel kap meg az űrlapkérdések meghatározására. Ezek bekerülnek a táblázat oszlopaiba.

Demóm során négy kérdést tettem fel a cím, kategória, szerző és tartalom vonatkozásában.

Minden mezőnek volt egy szövegtípusa, kivéve a Kategóriát, amely egy rádiós típusú volt, négy hipotetikus kategóriával: általános, marketing, pénzügyi, technológiai.

https://docs.google.com/forms/d/1QKthdGK9pznyojcZ4esrU1moky8_Wih4aqa7_uIQ0sw

Az űrlap benyújtásakor egy sort csatolnak a Google Táblázatok táblázatához. Mindegyik sorhoz automatikusan hozzáadódik egy Időbélyegző mező, amelyet a feladás dátumának kiszámításához használunk.

Hozzászólások tervezetének engedélyezéséhez hozzáadtam egy logikai közzétételt is? mező első oszlopként. Az API csak true értéket küldhet vissza. Ez lehetővé teszi a hozzászólások áttekintését és szerkesztését a közzététel előtt.

https://docs.google.com/spreadsheets/d/1xy6Hz8yagIW7zwdGGC0XICObIoZ_YYhRhnQ1T8GrQnE/edit?usp=sharing

Az API felépítése

A Google Apps Script az ECMAScript 5 (ES5) JavaScript-szabvány tetejére épül. Az API felépítésekor nem használhatunk olyan ES6 szolgáltatásokat, mint a hatókör-változók, a nyílfüggvények vagy az alapértelmezett paraméterek. Ha nem biztos benne, hogy mi érhető el az ES5-ben, azt javaslom, hogy keresse meg az MDN docs kompatibilitási táblázatokat.

Az ES6 hiánya ellenére a Google Apps Scripts továbbra is felhasználható ésszerűen összetett alkalmazások létrehozására a G Suite termékek tetején.

Elkezdeni

A Google Apps Script online szerkesztőjéhez elérheti az Eszközök> Szkriptszerkesztő menüpontot a menüsávon a Google Táblázatok táblázatban. Megnyílik egy szkript-szerkesztő egy üres Code.gs nevű fájllal. Mivel ez egy egyszerű alkalmazás, logikánkat ebbe az egyetlen szkriptbe helyezzük, de az alkalmazást könnyedén külön szkriptekre bonthatjuk.

Válasz visszatérése

Használhatjuk a doGet és a doPost visszahívási funkciókat a HTTP kérések megválaszolására. Ezek csak szokásos funkciók, amelyekre a Google Apps Script hivatkozik, amikor egy GET vagy POST kérést kell benyújtani az API-ra.

Válasz generálásához a ContentService szolgáltatást fogjuk használni. A JavaScript objektum átadható a JSON.stringify webhelynek, majd létrehozható a szolgáltatásTextOutput szolgáltatáson a JSON válasz felépítéséhez. Ha a mime típusa ContentService.MimeType.JSON értékre van állítva, akkor a tartalom típusát megfelelően állítja be az application / json értékre.

A JSON-válasz generálása ugyanolyan egyszerű, mint a következő:

doGet (e) {
  var output = JSON.stringify ({
    státusz: „siker”,
    üzenet: 'működött',
  });
  
  return ContentService.createTextOutput (output)
    .setMimeType (ContentService.MimeType.JSON);
}

A kérelmek elemzése

A doGet visszahívást mindig a kérésből generált esemény hívja meg. Ebből az eseményből hozzáférhetünk a lekérdezési karakterlánc-paraméterekhez, amelyeket különféle API-lehetőségek támogatására használunk. Az egyszerű állapot nélküli hitelesítés kulcsparaméter segítségével valósul meg. Ez egyszerűen ellenőrzi, hogy a kulcsparaméter értéke megegyezik-e a merev kódú kulcsértékkel. Azoknak a kérelmeknek, amelyek nem egyeznek meg, jogosulatlan válasz fog megjelenni.

Egy kategóriaparamétert kell használni, hogy a felhasználók egyetlen kategóriából kérhessenek hozzászólásokat. Ez menti őket attól, hogy kategóriánként kell szűrniük a kezelőfelületen. A lapozás egy oldalparaméter segítségével is megvalósul.

Ezeket a beállításokat az URL-hez kell csatolni, amikor az API-kérelmet benyújtják.

GET https: // apiurl? Kulcs = abcdef & kategória = általános & oldal = 1

Ez a kérés a következő eseményt generálja:

{
  "queryString": "kulcs = abcdef & kategória = általános és oldal = 1",
  "paraméter": {},
  "contextPath": "",
  "paraméterek": {
    "kulcs": [
      "ABCDEF"
    ],
    "kategória": [
      "Tábornok"
    ],
    "oldal": [
      "1"
    ]
  },
  "contentLength": -1
}

Először hitelesítsük az eseményt. Ezt megtesszük annak ellenőrzésével, hogy a kulcs rendelkezésre áll-e, és hogy megegyezik-e a meghatározott API-kulccsal.

var API_KEY = 'abcdef';
doGet (e) {
  if (! is engedélyezett (e)) {
    return buildErrorResponse ('nem engedélyezett');
  }
    
  return buildSuccessResponse ('engedélyezett');
}
funkció isAuthorized (e) {
  visszatér a 'kulcs' az e.paraméterekben && e.parameters.key [0] === API_KEY;
}
function buildSuccessResponse (üzenet) {
  var output = JSON.stringify ({
    státusz: „siker”,
    üzenet: üzenet
  });
  
  return ContentService.createTextOutput (output)
   .setMimeType (ContentService.MimeType.JSON);
}
function buildErrorResponse (üzenet) {
  var output = JSON.stringify ({
    állapot: 'hiba',
    üzenet: üzenet
  });
  
  return ContentService.createTextOutput (output)
   .setMimeType (ContentService.MimeType.JSON);
}

Az API kulcsot a fájl tetején abcdefként definiálják. Az isAuthorizedfunction logikai értéket ad vissza a hitelesítéshez. Ha ez hamis eredményt ad, akkor a nem engedélyezett üzenetet küldi vissza a buildErrorResponse segédprogram. Ha az isAuthorized igaz, akkor a funkció folytathatja, amíg a buildSuccessResponse révén sikeres választ nem kapnak.

Az a hátrány, amelyet az alkalmazások Google Apps Script segítségével történő létrehozása során tapasztaltam, az, hogy nem képes a válaszok állapotkódjait beállítani. Ezek felhasználhatók annak jelzésére, hogy a válasz sikeres volt-e, és ha nem, akkor miért.

Például egy 401 nem hitelesített állapotkód azt sugallja, hogy a felhasználói hitelesítő adatok nem egyeztek meg, és meg kell próbálniuk újból különböző hitelesítő adatokat. A válaszoknak mindig 200 OK állapotkódjuk van a doGet használatakor, még a kezelt sikertelen válaszok esetén is. Megkerülöm ezt az állapotérték hozzáadásával az összes API-válaszhoz. Ebben az egyszerű példában az állapot lehet siker vagy hiba, de könnyű belátni, hogyan lehet ezt a mintát szükség esetén más részletesebb állapotokra is kiterjeszteni.

Hozzunk létre két funkciót a kategória és az oldal paramétereinek elemzéséhez. Ha nem érkezik érvényes numerikus oldal, akkor annak alapértelmezett értékének 1-nek kell lennie. Ugyanígy, ha egy kategóriát sem adnak meg, akkor az alapértelmezett értéket nullára kell állítani, amely esetben az összes kategória üzenetét vissza kell adni.

getPageParam (e) függvény {
  if ('oldal' az e.paraméterekben) {
    var page = parseInt (e.paraméterek ['oldal'] [0]);
    if (! isNaN (oldal) && oldal> 0) {
      visszatérő oldal;
    }
  }
  
  visszatérés 1
}
getCategoryParam (e) függvény {
  if ('kategória' az e.paraméterekben) {
    visszatér e.paraméterek ['kategória'] [0];
  }
  
  visszatérés null
}

Olvasás a táblázatból

A Google Apps Script különféle globális objektumokat tesz elérhetővé, amelyek felhasználhatók a G Suite termékekkel való interakcióra. A SpreadsheetService szolgáltatást használjuk a táblázat feltöltésére azonosító alapján és a blogbejegyzések olvasásához. A táblázat-azonosító lekérdezésének legegyszerűbb módja a Google Táblázatok URL-jének ellenőrzése.

https://docs.google.com/spreadsheets/d/{id}/edit

A munkafüzet betöltése az openById módszer segítségével a globális SpreadsheetService-en keresztül be kell töltenie az aktív adattartományt az első munkalapból. A legfrissebb hozzászólások visszatéréséhez először válasszuk az Időbélyeg oszlopban, amely a második oszlop.

var SPREADSHEET_ID = '12345';
var spreadsheet = SpreadsheetApp.openById (SPREADSHEET_ID);
var munkalap = spreadsheet.getSheets () [0];
var rows = munkalap.getDataRange ()
 .sort ({oszlop: 2, növekvő: hamis})
 .getValues ​​();

A getDataRange sorok tömbje tartalmazza az oszlopok fejléceit első tömbként és a blogbejegyzés sorát következő tömbként. A címsorok blogbejegyzésekhez rendelhetők, így az API a teljes blogbejegyzési objektumokat, nem csak az oszlopértékeket képes visszatérni.

var headings = sorok [0] .map (String.toLowerCase);
var posts = rows.sice (1);
var postsWithHeadings = addHeadings (hozzászólások, címsorok);
addHeadings funkció (hozzászólások, címsorok) {
  return posts.map (function (postAsArray) {
    var postAsObj = {};
    
    headings.forEach (funkció (címsor, i) {
      postAsObj [cím] = postAsArray [i];
    });
    
    visszatérésAsObj;
  });
}

Nem releváns hozzászólások szűrése

A blogbejegyzéseket csak akkor kell visszaküldeni, ha kategóriájuk megegyezik a kért kategóriával, és minden kategória bejegyzését vissza kell küldeni, ha az egyiket nem kérték. A blogbejegyzéseket továbbá csak akkor kell visszaadni, ha közzétett értéke igaz.

Hozzunk létre egy függvényt a tömbszűrők tömegszűrővel történő eltávolításához:

var postsPublic = removeDrafts (postsWithHeadings);
function removeDrafts (hozzászólások, kategória) {
  vissza posts.filter (funkció (post) {
    visszatérés ['közzétett'] === igaz;
  });
}

És egy másik funkció a post kategóriájának szűrésére:

var kategória = getCategoryParam (e);
var postsFiltered = szűrő (postsPublic, kategória);
funkciószűrő (hozzászólások, kategória) {
  vissza posts.filter (funkció (post) {
    if (kategória! == null) {
      var c1 = post ['category']. toLowerCase ()
      var c2 = category.toLowerCase ()
      visszatérés c1 === c2;
    } más {
      visszatér igaz;
    }
  });
}

Paginating válaszok

Teljesítmény okokból korlátozni kell az egyetlen API-válasz által visszaadott bejegyzések maximális számát. Az ügyfélnek képesnek kell lennie arra, hogy az oldal lekérdezési paraméterének megnövelésével kérje a hozzászólások következő oldalát.

Végezzük el ezt egy paginációs függvényen, amely egy szűrt blogbejegyzéseket tartalmazó objektumot ad vissza a hozzászólások alatt, és a pagination linkeket az oldalak alatt. Ha több vagy korábbi eredmény található, az oldalak tartalmazzák a megfelelő oldalszámot a következő, illetve az előző alatt.

var RESULTS_PER_PAGE = 5;
var oldal = getPageParam (e)
var paginated = paginate (postsFiltered, page);
paginate funkció (hozzászólások, oldal) {
  var postsCopy = posts.slice ();
  var postsChunked = [];
  var postsPaginated = {
    hozzászólások: [],
    oldalak: {
      előző: null,
      következő: null
    }
  };
  
  míg (postsCopy.length> 0) {
    postsChunked.push (postsCopy.splice (0, RESULTS_PER_PAGE));
  }
  
  if (1. oldal - 1 hozzászólásban meghúzva) {
    postsPaginated.posts = postsChunked [oldal - 1];
  } más {
    postsPaginated.posts = [];
  }
  if (1. oldal && oldal <= postsChunked.length) {
    postsPaginated.pages.prevable = oldal - 1;
  }
  
  if (oldal> = 1 && oldal 

A korábbi buildSuccessResponse segítőnk frissíthető hozzászólások és oldalak kezelésére. Az API-nak ezután készen áll a telepítésre.

function buildSuccessResponse (hozzászólások, oldalak) {
  var output = JSON.stringify ({
    státusz: „siker”,
    adatok: hozzászólások,
    oldalak: oldalak
  });
  
  return ContentService.createTextOutput (output)
    .setMimeType (ContentService.MimeType.JSON);
}

Az API telepítése

A szkript véglegesítése után az API-t nyilvánosan elérhetővé teheti a szkript-szerkesztő menüsávján a Közzététel> Telepítés webappként menüpont alatt. Győződjön meg arról, hogy az alkalmazást úgy végrehajtják, mint én, és bárki, akár névtelen is, férhet hozzá.

A telepítés után az alábbi URL-t fogja megjeleníteni:

https://script.google.com/macros/s/{id}/exec

Helyezze hozzá az API-kulcsot az URL-hez, majd írja be a böngészőbe, hogy ellenőrizze, hogy az API megfelelően működik-e. Remélhetőleg láthat egy JSON-választ három legfelső szintű billentyűvel: állapot, hozzászólások, oldalak.

https://script.google.com/macros/s/{id}/exec?key=abcdef

összefoglalás

Ha ezt követted, akkor a Google Táblázatokra, a Google Formsra és a Google Apps Scriptre építeniük kell egy funkcionális CMS-t. Nem fejlett, de könnyű volt az induláshoz, és kielégíti a CMS alapvető követelményeit. A felhasználói felülethez történő csatlakoztatás nem tartozik a cikk hatálya alá, de ha meg akarja tudni, hogy ez hogyan történik, akkor nézd meg a demót, amelyet összeállítottam a GitHub-on.

Legközelebb, amikor el akarja érni a nap technológiai ízét, arra szólítom fel, hogy szánjon néhány percet arra, hogy fontolja meg, létezik-e egy meglévő szoftverrel egyszerűbb megoldás. Lehet, hogy ez a megoldás nem szerepel teljes mértékben, de az út 80% -át gyakran megkönnyíti az erőfeszítés 20% -áért, ami sok esetben elég jó. Remélem, hogy ez a blogbejegyzés ezt megmutatta, és hogy mindent megtanult a Google Apps Scriptről az út során.

Tekintse meg a bemutatót

Tekintse meg a projektet a GitHubon