บริการเนื้อหา

เมื่อเผยแพร่สคริปต์เป็นเว็บแอป ระบบจะเรียกใช้ฟังก์ชันเรียกกลับพิเศษ 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);
}

เช่นเดียวกับก่อนหน้านี้ ให้เผยแพร่แอปนี้เป็นเว็บแอปที่ไม่ระบุตัวตนเพื่อให้ใช้งานได้ ในกรณีนี้ ผู้ใช้บริการใหม่จะใช้บริการนี้ได้โดยเพิ่มพารามิเตอร์ URL ต่อท้าย 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 สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีเปิดใช้ลักษณะการทำงานนี้