ผสานข้อความลงในเอกสาร

การใช้งานที่มีประโยชน์อย่างหนึ่งของ Google เอกสาร API คือการผสานข้อมูลจากแหล่งข้อมูลอย่างน้อย 1 แห่งลงในเอกสาร

หน้านี้จะอธิบายวิธีนำข้อมูลจากแหล่งที่มาภายนอกมาแทรกลงในเอกสารเทมเพลตที่มีอยู่

เทมเพลตคือเอกสารประเภทพิเศษที่มีข้อความแบบคงที่เหมือนกันสําหรับเอกสารทั้งหมดที่สร้างจากเทมเพลต พร้อมกับตัวยึดตําแหน่งที่กำหนดไว้สําหรับวางข้อความแบบไดนามิกอื่นๆ ตัวอย่างเช่น เทมเพลตสัญญาอาจมีเนื้อหาที่ตายตัว รวมถึงช่องสำหรับชื่อ ที่อยู่ และรายละเอียดอื่นๆ ของผู้รับ จากนั้นแอปจะผสานข้อมูลเฉพาะของลูกค้าลงในเทมเพลตเพื่อสร้างเอกสารที่เสร็จสมบูรณ์

แนวทางนี้มีประโยชน์หลายประการ ดังนี้

  • นักออกแบบปรับแต่งการออกแบบเอกสารได้ง่ายๆ โดยใช้เครื่องมือแก้ไขของ Google เอกสาร ซึ่งง่ายกว่าการปรับพารามิเตอร์ในแอปเพื่อกำหนดเลย์เอาต์ที่แสดงผล

  • การแยกเนื้อหาออกจากการนำเสนอเป็นหลักการการออกแบบที่รู้จักกันดีและมีประโยชน์มากมาย

แผนภาพแนวคิดของการผสาน

สูตรพื้นฐาน

ต่อไปนี้คือตัวอย่างวิธีใช้ Docs API เพื่อผสานข้อมูลลงในเอกสาร

  1. สร้างเอกสารโดยใช้เนื้อหาตัวยึดตําแหน่งเพื่อช่วยในการออกแบบและการจัดรูปแบบ ระบบจะเก็บการจัดรูปแบบข้อความที่ต้องการแทนที่ไว้

  2. สำหรับแต่ละองค์ประกอบที่จะแทรก ให้แทนที่เนื้อหาตัวยึดตำแหน่งด้วยแท็ก โปรดใช้สตริงที่ไม่น่าจะเกิดขึ้นตามปกติ ตัวอย่างเช่น {{account-holder-name}} อาจเป็นแท็กที่ดี

  3. ในโค้ด ให้ใช้ Google Drive API เพื่อทำสำเนาเอกสาร

  4. ในโค้ด ให้ใช้เมธอด batchUpdate() ของ Docs API พร้อมชื่อเอกสารและใส่ ReplaceAllTextRequest

รหัสเอกสารจะอ้างอิงถึงเอกสารและสามารถดึงมาจาก URL

https://docs.google.com/document/d/documentId/edit

ตัวอย่าง

พิจารณาตัวอย่างต่อไปนี้ ซึ่งแทนที่ช่อง 2 ช่องในแท็บทั้งหมดของเทมเพลตด้วยค่าจริงเพื่อสร้างเอกสารที่เสร็จสมบูรณ์

คุณใช้โค้ดด้านล่างเพื่อทำการผสานนี้ได้

Java

String customerName = "Alice"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd"); String date = formatter.format(LocalDate.now());  List<Request> requests = new ArrayList<>(); // One option for replacing all text is to specify all tab IDs. requests.add(new Request()         .setReplaceAllText(new ReplaceAllTextRequest()                 .setContainsText(new SubstringMatchCriteria()                         .setText("{{customer-name}}")                         .setMatchCase(true))                 .setReplaceText(customerName)                 .setTabsCriteria(new TabsCriteria()                         .addTabIds(TAB_ID_1)                         .addTabIds(TAB_ID_2)                         .addTabIds(TAB_ID_3)))); // Another option is to omit TabsCriteria if you are replacing across all tabs. requests.add(new Request()         .setReplaceAllText(new ReplaceAllTextRequest()                 .setContainsText(new SubstringMatchCriteria()                         .setText("{{date}}")                         .setMatchCase(true))                 .setReplaceText(date)));  BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest(); service.documents().batchUpdate(documentId, body.setRequests(requests)).execute();

Node.js

  let customerName = 'Alice';   let date = yyyymmdd()   let requests = [     // One option for replacing all text is to specify all tab IDs.     {       replaceAllText: {         containsText: {           text: '{{customer-name}}',           matchCase: true,         },         replaceText: customerName,         tabsCriteria: {           tabIds: [TAB_ID_1, TAB_ID_2, TAB_ID_3],         },       },     },     // Another option is to omit TabsCriteria if you are replacing across all tabs.     {       replaceAllText: {         containsText: {           text: '{{date}}',           matchCase: true,         },         replaceText: date,       },     },   ];    google.options({auth: auth});   google       .discoverAPI(           'https://docs.googleapis.com/$discovery/rest?version=v1&key={YOUR_API_KEY}')       .then(function(docs) {         docs.documents.batchUpdate(             {               documentId: '1yBx6HSnu_gbV2sk1nChJOFo_g3AizBhr-PpkyKAwcTg',               resource: {                 requests,               },             },             (err, {data}) => {               if (err) return console.log('The API returned an error: ' + err);               console.log(data);             });       });

Python

customer_name = 'Alice' date = datetime.datetime.now().strftime("%y/%m/%d")  requests = [         # One option for replacing all text is to specify all tab IDs.         {         'replaceAllText': {             'containsText': {                 'text': '{{customer-name}}',                 'matchCase':  'true'             },             'replaceText': customer_name,             'tabsCriteria': {                 'tabIds': [TAB_ID_1, TAB_ID_2, TAB_ID_3],             },         }},         # Another option is to omit TabsCriteria if you are replacing across all tabs.         {         'replaceAllText': {             'containsText': {                 'text': '{{date}}',                 'matchCase':  'true'             },             'replaceText': str(date),         }     } ]  result = service.documents().batchUpdate(     documentId=document_id, body={'requests': requests}).execute()

จัดการเทมเพลต

สำหรับเอกสารเทมเพลตที่แอปพลิเคชันกำหนดและเป็นเจ้าของ ให้สร้างเทมเพลตโดยใช้บัญชีเฉพาะที่แสดงถึงแอปพลิเคชัน บัญชีบริการเป็นตัวเลือกที่ดีและหลีกเลี่ยงความซับซ้อนเกี่ยวกับนโยบายของ Google Workspace ที่จำกัดการแชร์

เมื่อสร้างอินสแตนซ์ของเอกสารจากเทมเพลต ให้ใช้ข้อมูลเข้าสู่ระบบของผู้ใช้ปลายทางเสมอ ซึ่งจะช่วยให้ผู้ใช้ควบคุมเอกสารที่ได้อย่างเต็มที่และป้องกันปัญหาการปรับขนาดที่เกี่ยวข้องกับขีดจำกัดต่อผู้ใช้ในไดรฟ์

หากต้องการสร้างเทมเพลตโดยใช้บัญชีบริการ ให้ทำตามขั้นตอนต่อไปนี้ด้วยข้อมูลเข้าสู่ระบบของแอปพลิเคชัน

  1. สร้างเอกสารโดยใช้ documents.create ใน Docs API
  2. อัปเดตสิทธิ์เพื่ออนุญาตให้ผู้รับเอกสารอ่านเอกสารได้โดยใช้ permissions.create ใน Drive API
  3. อัปเดตสิทธิ์เพื่ออนุญาตให้ผู้เขียนเทมเพลตเขียนข้อมูลโดยใช้ permissions.create ใน Drive API
  4. แก้ไขเทมเพลตตามต้องการ

หากต้องการสร้างอินสแตนซ์ของเอกสาร ให้ทำตามขั้นตอนต่อไปนี้ด้วยข้อมูลเข้าสู่ระบบของผู้ใช้

  1. สร้างสําเนาของเทมเพลตโดยใช้ files.copy ใน Drive API
  2. แทนที่ค่าโดยใช้ documents.batchUpdate ใน Docs API