שירות תוכן

כשסקריפט מפורסם בתור אפליקציית אינטרנט, הפונקציות המיוחדות של הקריאה החוזרת (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 יבקר בו בתור משתמש אנונימי). לאחר מכן, מוסיפים את כתובת ה-URL של השירות (ולא של פיד ה-RSS המקורי) לקורא ה-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);
}

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

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. כלומר, אם אתם משתמשים בשירות Content כדי להחזיר נתונים לאפליקציה אחרת, עליכם לוודא שהלקוח ב-HTTP מוגדר לעקוב אחר הפניות אוטומטיות. לדוגמה, בכלי לשורת הפקודה cURL, מוסיפים את הדגל -L. למידע נוסף על הפעלת ההתנהגות הזו, עיינו בתיעוד של לקוח ה-HTTP.