שירות תוכן

כשסקריפט מתפרסם כאפליקציית אינטרנט, המערכת מבצעת את הפונקציות המיוחדות של הקריאה החוזרת (callback) doGet() וגם doPost() מופעלים בכל פעם שמתקבלת בקשה אל כתובת URL. במקום להחזיר אובייקט של ממשק משתמש שנוצר עם שירות HTML, אפשר להשתמש בשירות התוכן כדי להחזיר נתונים גולמיים תוכן טקסטואלי. כך אפשר לכתוב סקריפטים שפועלים כ"שירותים", תגובה לבקשות GET ו-POST והצגת נתונים מסוגי MIME שונים.

העקרונות הבסיסיים

דוגמה פשוטה לשירות התוכן:

function doGet() {
  return ContentService.createTextOutput('Hello, world!');
}

לפרוס את הסקריפט כאפליקציית אינטרנט, באמצעות אותם שלבים שהיו פועלים על ידי הצגת ממשק משתמש. מתי נשלחת בקשת GET לכתובת ה-URL של הסקריפט, הטקסט Hello, world! יהיה הוחזרו. בנוסף לטקסט פשוט, השירות תומך גם בהחזרת ATOM, תוכן בפורמט CSV, iCal, JavaScript, JSON, RSS, vCard ו-XML.

הצגת פידים של RSS

ננסה משהו קצת יותר מורכב, כמו סינון פיד RSS. קומיקס של XKCD תמיד מצחיק, אבל אי אפשר לשמוע את כולו בדיחה, אלא אם מעבירים את העכבר מעל רצועת הקומיקס כדי לראות את הטקסט החלופי הנוסף. לצערנו, לא ניתן להעביר את העכבר מעל דפדפן בנייד, כך שזה לא עובד.

נניח שרצינו לערוך את הפיד כך שהדילוג הנוסף יופיע בפיד. ישירות, ובמקום להעביר את העכבר פשוט גללתם למטה כדי לראות אותו. ש פועל כמו שצריך במכשיר נייד. הנה הקוד:

function doGet() {
  var feed =  UrlFetchApp.fetch('http://xkcd.com/rss.xml').getContentText();
  feed = feed.replace(
    /(<img.*?alt="(.*?)".*?>)/g,
    '$1' + new Array(10).join('<br />') + '$2');
  return ContentService.createTextOutput(feed)
    .setMimeType(ContentService.MimeType.RSS);
}

זה אולי נראה מסובך, אבל הוא מתחלק לחלקים פשוטים. אנחנו משתמשים שירות לאחזור כתובות URL לצורך אחזור הגרסה המקורית פיד RSS של XKCD. לאחר מכן אנחנו משתמשים בביטוי רגולרי של JavaScript כדי ליצור את החלפות שאנחנו צריכים. בשלב האחרון, אנחנו כוללים את הפיד הערוך האובייקט TextOutput וגם הגדרת ה-MIME מסוג RSS.

כדי שנוכל לראות את זה בפעולה, צריך לפרסם את הסקריפט כאפליקציית אינטרנט ולהקפיד לאשר גישה אנונימית (מכיוון שקורא ה-RSS שלך יבקר בו באופן אנונימי משתמש). לאחר מכן צריך להוסיף ל-RSS את כתובת ה-URL של השירות (ולא את פיד ה-RSS המקורי) או פשוט לבקר בו ישירות בדפדפן אינטרנט. זהו!

הצגת JSON מסקריפטים

מה עוד נוכל לעשות עם שירות התוכן? מה קורה כשיש אפשרות להציג JSON סקריפטים או אתרים ושירותים אחרים! סקריפט פשוט שמיישם שירות שכל אחד יכול להשתמש בו כדי לראות אם משבצת ביומן פתוחה בשעה מסוימת בזמן האימון.

function doGet(request) {
  var events = CalendarApp.getEvents(
    new Date(Number(request.parameters.start) * 1000),
    new Date(Number(request.parameters.end) * 1000));
  var result = {
    available: events.length == 0
  };
  return ContentService.createTextOutput(JSON.stringify(result))
    .setMimeType(ContentService.MimeType.JSON);
}

כמו קודם, כדאי לפרסם את האפליקציה כאפליקציית אינטרנט אנונימית כדי שהיא תפעל. במקרה הזה, המשתמשים בשירות החדש שלכם יכולים להשתמש בו על ידי הוספת פרמטרים של כתובות אתרים בסוף כתובת ה-URL של השירות. הפרמטרים start ו-end נותנים טווח זמן לבדיקה, שצוינו בתקופת יוניקס (Unix epoch) הרגילה.

curl -L URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000

השירות יחזיר JSON שמדווח אם יש משהו בטווח הזה.

{"available":true}

הצגת JSONP בדפי אינטרנט

באמצעות שינוי קל, שירות ה-JSON שלכם יכול להפוך JSONP, כלומר אפשר לקרוא לו מ-JavaScript בדפדפן. הנה הסקריפט החדש:

function doGet(request) {
  var events = CalendarApp.getEvents(
    new Date(Number(request.parameters.start) * 1000),
    new Date(Number(request.parameters.end) * 1000));
  var result = {
    available: events.length == 0
  };
  return ContentService.createTextOutput(
    request.parameters.prefix + '(' + JSON.stringify(result) + ')')
    .setMimeType(ContentService.MimeType.JAVASCRIPT);
}

כדי לקרוא לשירות הזה מדפדפן, צריך ליצור תג סקריפט שיש לו את המאפיין src הוא כתובת ה-URL של השירות, עם פרמטר נוסף שנקרא prefix. הזה הוא שם הפונקציה ב-JavaScript בצד הלקוח, שתיקרא בערך שהוחזר על ידי השירות.

<script src="URL_OF_YOUR_SCRIPT?start=1325437200&end=1325439000&prefix=alert"></script>

בדוגמה הזו תופיע תיבת הודעות בדפדפן עם פלט השירות, מכיוון שנציין את פונקציית alert() המובנית בדפדפן כקידומת שלנו. קוד ה-JavaScript שיוחזר ייראה כך:

alert({"available":true})

כתובות אתרים להפניה מחדש

מטעמי אבטחה, התוכן שהוחזר על ידי שירות התוכן לא מוצג מתוך script.google.com, אך במקום זאת הופנה לכתובת URL חד-פעמית ב- script.googleusercontent.com. משמעות הדבר היא שאם תשתמש בשירות התוכן כדי להחזיר נתונים לאפליקציה אחרת, צריך לוודא שלקוח ה-HTTP מוגדר כך שיעקוב אחר הפניות אוטומטיות. לדוגמה, בכלי שורת הפקודה cURL, מוסיפים את הדגל -L. מידע נוסף זמין במסמכי התיעוד של לקוח ה-HTTP מידע על האופן שבו אפשר לבצע את ההתנהגות הזו.