Google เอกสารช่วยให้ผู้ทำงานร่วมกันทำงานร่วมกันได้โดยการเขียนความคิดเห็นและให้คำแนะนำ ซึ่งจะทำหน้าที่เป็นการแก้ไขที่รอการอนุมัติ
คุณสามารถใช้ API เพื่อดูการเปลี่ยนแปลงที่แนะนำในข้อความของเอกสาร ใน Developer Preview คุณยังอ่าน สร้าง ตอบกลับ อัปเดต หรือลบชุดความคิดเห็นและคำแนะนำแบบเป็นโปรแกรมได้ด้วย
เมื่อใช้วิธี
documents.get เพื่อ
ดึงเนื้อหาเอกสาร เนื้อหาอาจมีคำแนะนำที่ยังไม่ได้รับการแก้ไข หากต้องการ
ควบคุมวิธีที่ documents.get แสดงคำแนะนำ ให้ใช้พารามิเตอร์
SuggestionsViewMode
ที่ไม่บังคับ เงื่อนไขตัวกรองต่อไปนี้พร้อมใช้งานกับพารามิเตอร์นี้
- รับเนื้อหาด้วย
SUGGESTIONS_INLINEเพื่อให้ข้อความที่รอการลบหรือ การแทรกปรากฏในเอกสาร - ดูตัวอย่างเนื้อหาโดยยอมรับคำแนะนำทั้งหมด
- รับเนื้อหาเป็นตัวอย่างโดยไม่มีคำแนะนำและปฏิเสธคำแนะนำทั้งหมด
หากคุณไม่ระบุ SuggestionsViewMode Google เอกสาร API จะใช้การตั้งค่าเริ่มต้น
ที่เหมาะสมกับสิทธิ์ของผู้ใช้ปัจจุบัน
คำแนะนำและดัชนี
เหตุผลหนึ่งที่ทำให้ SuggestionsViewMode มีความสำคัญคือดัชนีใน
การตอบกลับอาจแตกต่างกันไปตามว่ามีคำแนะนำหรือไม่ ดังที่แสดงด้านล่าง
| เนื้อหาพร้อมคำแนะนำ | เนื้อหาที่ไม่มีคำแนะนำ |
|---|---|
{
"tabs": [
{
"documentTab": {
"body": {
"content": [
{
"startIndex": 1,
"endIndex": 31,
"paragraph": {
"elements": [
{
"startIndex": 1,
"endIndex": 31,
"textRun": {
"content": "Text preceding the suggestion\n",
"textStyle": {}
}
}
],
"paragraphStyle": {
"namedStyleType": "NORMAL_TEXT",
"direction": "LEFT_TO_RIGHT"
}
}
},
{
"startIndex": 31,
"endIndex": 51,
"paragraph": {
"elements": [
{
"startIndex": 31,
"endIndex": 50,
"textRun": {
"content": "Suggested insertion",
"suggestedInsertionIds": [
"suggest.vcti8ewm4mww"
],
"textStyle": {}
}
},
{
"startIndex": 50,
"endIndex": 51,
"textRun": {
"content": "\n",
"textStyle": {}
}
}
],
"paragraphStyle": {
"namedStyleType": "NORMAL_TEXT",
"direction": "LEFT_TO_RIGHT"
}
}
},
{
"startIndex": 51,
"endIndex": 81,
"paragraph": {
"elements": [
{
"startIndex": 51,
"endIndex": 81,
"textRun": {
"content": "Text following the suggestion\n",
"textStyle": {}
}
}
],
"paragraphStyle": {
"namedStyleType": "NORMAL_TEXT",
"direction": "LEFT_TO_RIGHT"
}
}
}
]
}
}
}
]
},
|
{
"tabs": [
{
"documentTab": {
"body": {
"content": [
{
"startIndex": 1,
"endIndex": 31,
"paragraph": {
"elements": [
{
"startIndex": 1,
"endIndex": 31,
"textRun": {
"content": "Text preceding the suggestion\n",
"textStyle": {}
}
}
],
"paragraphStyle": {
"namedStyleType": "NORMAL_TEXT",
"direction": "LEFT_TO_RIGHT"
}
}
},
{
"startIndex": 31,
"endIndex": 32,
"paragraph": {
"elements": [
{
"startIndex": 31,
"endIndex": 32,
"textRun": {
"content": "\n",
"textStyle": {}
}
}
],
"paragraphStyle": {
"namedStyleType": "NORMAL_TEXT",
"direction": "LEFT_TO_RIGHT"
}
}
},
{
"startIndex": 32,
"endIndex": 62,
"paragraph": {
"elements": [
{
"startIndex": 32,
"endIndex": 62,
"textRun": {
"content": "Text following the suggestion\n",
"textStyle": {}
}
}
],
"paragraphStyle": {
"namedStyleType": "NORMAL_TEXT",
"direction": "LEFT_TO_RIGHT"
}
}
}
]
}
}
}
]
},
|
ในคำตอบด้านบน ย่อหน้าที่มีบรรทัด "ข้อความหลังคำแนะนำ" จะแสดงความแตกต่างเมื่อใช้ SuggestionsViewMode เมื่อตั้งค่า
เป็น SUGGESTIONS_INLINE startIndex ของ
ParagraphElement
จะเริ่มต้นที่ 51 และ endIndex จะหยุดที่ 81 หากไม่มีคำแนะนำ startIndex และ endIndex จะมีค่าตั้งแต่ 32–62
รับเนื้อหาโดยไม่มีคำแนะนำ
ตัวอย่างโค้ดบางส่วนต่อไปนี้แสดงวิธีรับเอกสารเป็นตัวอย่างโดยปฏิเสธคำแนะนำทั้งหมด (หากมี) ด้วยการตั้งค่าSuggestionsViewMode
พารามิเตอร์เป็น PREVIEW_WITHOUT_SUGGESTIONS
Java
final string SUGGEST_MODE = "PREVIEW_WITHOUT_SUGGESTIONS"; Document doc = service .documents() .get(DOCUMENT_ID) .setIncludeTabsContent(true) .setSuggestionsViewMode(SUGGEST_MODE) .execute();
Python
SUGGEST_MODE = "PREVIEW_WITHOUT_SUGGESTIONS" result = ( service.documents() .get( documentId=DOCUMENT_ID, includeTabsContent=True, suggestionsViewMode=SUGGEST_MODE, ) .execute() )
การละเว้นพารามิเตอร์ SuggestionsViewMode จะเทียบเท่ากับการระบุ
DEFAULT_FOR_CURRENT_ACCESS เป็นค่าพารามิเตอร์
รูปแบบที่แนะนำ
เอกสารยังมีคำแนะนำด้านสไตล์ได้ด้วย การเปลี่ยนแปลงเหล่านี้เป็นคำแนะนำในการจัดรูปแบบและการนำเสนอ ไม่ใช่การเปลี่ยนแปลงเนื้อหา
การเปลี่ยนแปลงเหล่านี้จะไม่ชดเชยดัชนี ซึ่งแตกต่างจากการแทรกหรือลบข้อความ แม้ว่าการเปลี่ยนแปลงเหล่านี้อาจแบ่งTextRunออกเป็นส่วนย่อยๆ แต่จะเพียงเพิ่มคำอธิบายประกอบเกี่ยวกับการเปลี่ยนแปลงรูปแบบที่แนะนำ
คำอธิบายประกอบดังกล่าวคือ
SuggestedTextStyle
ซึ่งประกอบด้วย 2 ส่วน ได้แก่
textStyleซึ่งอธิบายวิธีจัดรูปแบบข้อความหลังจากมีการเปลี่ยนแปลงที่แนะนำ แต่ไม่ได้ระบุว่ามีการเปลี่ยนแปลงอะไรtextStyleSuggestionStateซึ่งระบุว่าคำแนะนำจะเปลี่ยนแปลงฟิลด์ของtextStyleอย่างไร
คุณจะเห็นการเปลี่ยนแปลงนี้ในข้อมูลที่ดึงมาจากแท็บเอกสารต่อไปนี้ ซึ่งรวมถึง การเปลี่ยนแปลงรูปแบบที่แนะนำ
[01] "paragraph": {
[02] "elements": [
[03] {
[04] "endIndex": 106,
[05] "startIndex": 82,
[06] "textRun": {
[07] "content": "Some text that does not ",
[08] "textStyle": {}
[09] }
[10] },
[11] {
[12] "endIndex": 115,
[13] "startIndex": 106,
[14] "textRun": {
[15] "content": "initially",
[16] "suggestedTextStyleChanges": {
[17] "suggest.xymysbs9zldp": {
[18] "textStyle": {
[19] "backgroundColor": {},
[20] "baselineOffset": "NONE",
[21] "bold": true,
[22] "fontSize": {
[23] "magnitude": 11,
[24] "unit": "PT"
[25] },
[26] "foregroundColor": {
[27] "color": {
[28] "rgbColor": {}
[29] }
[30] },
[31] "italic": false,
[32] "smallCaps": false,
[33] "strikethrough": false,
[34] "underline": false
[35] },
[36] "textStyleSuggestionState": {
[37] "boldSuggested": true,
[38] "weightedFontFamilySuggested": true
[39] }
[40] }
[41] },
[42] "textStyle": {
[43] "italic": true
[44] }
[45] }
[46] },
[47] {
[48] "endIndex": 143,
[49] "startIndex": 115,
[50] "textRun": {
[51] "content": " contain any boldface text.\n",
[52] "textStyle": {}
[53] }
[54] }
[55] ],
[56] "paragraphStyle": {
[57] "direction": "LEFT_TO_RIGHT",
[58] "namedStyleType": "NORMAL_TEXT"
[59] }
[60] }
ในตัวอย่างด้านบน ย่อหน้าประกอบด้วยข้อความ 3 รายการ โดยเริ่มที่บรรทัด 6, 14 และ 50 ตรวจสอบการเรียกใช้ข้อความตรงกลาง
- บรรทัดที่ 16: มีออบเจ็กต์
suggestedTextStyleChanges - บรรทัดที่ 18:
textStyleระบุการจัดรูปแบบต่างๆ - บรรทัดที่ 36:
textStyleSuggestionStateบอกว่าเฉพาะส่วนที่เป็นตัวหนาของ ข้อกำหนดนี้เท่านั้นที่เป็นคำแนะนำ - บรรทัดที่ 42: การจัดรูปแบบตัวเอียงของข้อความนี้เป็นส่วนหนึ่งของเอกสารปัจจุบัน (และไม่ได้รับผลกระทบจากคำแนะนำ)
เฉพาะฟีเจอร์สไตล์ที่ตั้งค่าเป็น true ใน textStyleSuggestionState เท่านั้นที่จะเป็นส่วนหนึ่ง
ของคำแนะนำ
สร้างและจัดการความคิดเห็น
คุณสามารถเพิ่มความคิดเห็นและการตอบกลับ แก้ไขความคิดเห็น และลบความคิดเห็นหรือการตอบกลับโดยใช้เมธอด documents.batchUpdate ได้แบบเป็นโปรแกรม
เมื่อทำการอัปเดตแบบเป็นชุดที่เกี่ยวข้องกับความคิดเห็นหรือคำแนะนำ คุณควรตรวจสอบข้อผิดพลาดบางส่วนที่อาจเกิดขึ้น ดูข้อมูลเพิ่มเติมได้ที่สถานะการอัปเดตความคิดเห็นและคำแนะนำ
แทรกความคิดเห็น
หากต้องการแทรกชุดข้อความความคิดเห็น ให้ใช้InsertCommentRequest
ออบเจ็กต์ คุณต้องระบุเนื้อหาข้อความของความคิดเห็นและตำแหน่ง Anchor (เช่น ช่วง) ที่แนบความคิดเห็น
ตัวอย่าง JSON ต่อไปนี้จะเพิ่มชุดข้อความความคิดเห็นที่ไม่ได้กำหนดให้กับช่วงที่ระบุ
{
"requests": [
{
"insertComment": {
"content": "This is a comment added via the API.",
"range": {
"startIndex": 10,
"endIndex": 25
}
}
}
]
}
คุณมอบหมายความคิดเห็นให้ผู้ใช้ที่เฉพาะเจาะจงได้โดยระบุอีเมลของผู้ใช้ในช่อง assigneeEmailAddress
{
"requests": [
{
"insertComment": {
"content": "Please review this paragraph.",
"assigneeEmailAddress": "user@example.com",
"range": {
"startIndex": 10,
"endIndex": 25
}
}
}
]
}
ตอบกลับหรือดำเนินการ
หากต้องการตอบกลับชุดข้อความความคิดเห็นหรือคำแนะนำ หรือแก้ไขหรือเปิดชุดข้อความอีกครั้ง
ให้ใช้ AddCommentReplyRequest
การตอบกลับจะแสดงด้วยออบเจ็กต์ Post
ออบเจ็กต์ Post มีการตอบกลับ content และอาจระบุ commentAction
(ถึง RESOLVE หรือ REOPEN เธรด) ก็ได้
ตัวอย่างการตอบกลับชุดข้อความความคิดเห็นที่มีอยู่มีดังนี้
{
"requests": [
{
"addCommentReply": {
"commentId": "comment_thread_id",
"post": {
"content": "Replying to the comment thread."
}
}
}
]
}
ตัวอย่างต่อไปนี้จะแก้ปัญหาชุดความคิดเห็นที่ไม่ต้องมีเนื้อหา
{
"requests": [
{
"addCommentReply": {
"commentId": "comment_thread_id",
"post": {
"commentAction": "RESOLVE"
}
}
}
]
}
แก้ไขโพสต์
หากต้องการแก้ไขเนื้อหาข้อความของโพสต์ที่คุณเขียน ให้ใช้ UpdateCommentPostRequest
คุณต้องระบุรหัสเธรด (commentId หรือ suggestionId) postId ของโพสต์ที่ต้องการแก้ไข และcontentข้อความธรรมดาใหม่
โปรดทราบว่าคุณจะแก้ไขโพสต์แรกของเธรดคำแนะนำไม่ได้ (เนื่องจากโพสต์ดังกล่าวสร้างขึ้นจากการแก้ไขในโหมดแนะนำ)
{
"requests": [
{
"updateCommentPost": {
"commentId": "comment_thread_id",
"postId": "post_id",
"content": "This is the updated comment text."
}
}
]
}
ลบความคิดเห็นและการตอบกลับ
- ลบชุดข้อความของความคิดเห็น: หากต้องการนำชุดข้อความของความคิดเห็นออกทั้งหมด ให้ใช้
DeleteCommentRequestคุณจะลบชุดความคิดเห็นได้ก็ต่อเมื่อเป็นผู้เขียนโพสต์แรกของชุดความคิดเห็นนั้น - ลบคำตอบ: หากต้องการลบโพสต์คำตอบที่เฉพาะเจาะจง ให้ใช้
DeleteCommentReplyRequestคุณจะลบได้เฉพาะคำตอบที่คุณเขียนเท่านั้น คุณไม่สามารถลบโพสต์ตอบกลับที่มีการดำเนินการหรือผู้รับมอบหมายได้
ตัวอย่างต่อไปนี้จะลบชุดข้อความของความคิดเห็น
{
"requests": [
{
"deleteComment": {
"commentId": "comment_thread_id"
}
}
]
}
เขียนคำแนะนำและจัดการเธรดคำแนะนำ
คุณสามารถเขียนการแก้ไขเป็นคำแนะนำแทนการแก้ไขโดยตรง และยอมรับ ปฏิเสธ หรือลบเธรดคำแนะนำแบบเป็นโปรแกรมได้
เมื่อทำการอัปเดตแบบเป็นชุดที่เกี่ยวข้องกับคำแนะนำ คุณควรตรวจสอบข้อผิดพลาดบางส่วนที่อาจเกิดขึ้น ดูข้อมูลเพิ่มเติมได้ที่สถานะการอัปเดตความคิดเห็นและคำแนะนำ
สร้างคำแนะนำโดยใช้โหมดแนะนำ
หากต้องการใช้การแก้ไขเป็นคำแนะนำ ให้ตั้งค่าฟิลด์ writeMode ของออบเจ็กต์ WriteControl เป็น SUGGEST ในคำขออัปเดตแบบเป็นกลุ่ม การอัปเดตทั้งหมดในคำขอจะได้รับการประมวลผลเป็นคำแนะนำ
{
"requests": [
{
"insertText": {
"text": "suggested insertion text",
"location": {
"index": 1
}
}
}
],
"writeControl": {
"writeMode": "SUGGEST"
}
}
คำขอที่ไม่รองรับในโหมดแนะนำ
เมื่อใช้ WriteMode.SUGGEST ระบบจะไม่รองรับคำขอประเภทต่อไปนี้และจะแสดงข้อผิดพลาด
AddDocumentTabCreateNamedRangeDeleteFooterDeleteHeaderDeleteNamedRangeDeleteTabUpdateDocumentTabPropertiesUpdateTableColumnProperties
นอกจากนี้ คุณยังแนะนำการเปลี่ยนแปลงรูปแบบเอกสารหรือการตั้งค่าส่วนหัว/ส่วนท้ายไม่ได้ ใน UpdateDocumentStyle ระบบไม่รองรับคำแนะนำสำหรับสไตล์ประเภทต่อไปนี้
documentFormatuseEvenPageHeaderFooteruseFirstPageHeaderFooter
ยอมรับ ปฏิเสธ หรือลบเธรดคำแนะนำ
คุณจัดการเธรดคำแนะนำได้โดยใช้คำขอต่อไปนี้
- ยอมรับคำแนะนำ: ใช้
AcceptSuggestionRequestเพื่อยอมรับคำแนะนำ โดยคุณต้องมีสิทธิ์แก้ไขเอกสาร - ปฏิเสธคำแนะนำ: ใช้
RejectSuggestionRequestเพื่อปฏิเสธคำแนะนำ การดำเนินการนี้ต้องมีสิทธิ์แก้ไขเอกสารหรือเป็นผู้เขียนคำแนะนำ - ลบคำแนะนำ: ใช้
DeleteSuggestionRequestเพื่อลบคำแนะนำ โดยคุณต้องเป็นผู้เขียนคำแนะนำ
ตัวอย่างต่อไปนี้ยอมรับเธรดคำแนะนำ
{
"requests": [
{
"acceptSuggestion": {
"suggestionId": "suggestion_thread_id"
}
}
]
}
สถานะการอัปเดตความคิดเห็นและคำแนะนำ
คำขอที่ต้องบันทึกชุดข้อความความคิดเห็นหรือคำแนะนำ (เช่น การแทรกความคิดเห็น การเพิ่มคำตอบ หรือการให้คำแนะนำ) อาจทำงานล้มเหลวบางส่วน ในกรณีเหล่านี้ การเปลี่ยนแปลงโมเดลเอกสาร (เช่น การแทรกหรือลบข้อความ) อาจได้รับการคอมมิตไปยังโมเดลเอกสารสำเร็จ แต่ความคิดเห็นหรือคำแนะนำที่เกี่ยวข้องอาจบันทึกไม่สำเร็จ
คุณสามารถยืนยันว่าการอัปเดตความคิดเห็นหรือคำแนะนำได้รับการนำไปใช้เรียบร้อยแล้วหรือไม่โดยดูช่อง commentUpdateState ใน BatchUpdateDocumentResponse
ระบบจะแสดงสถานะต่อไปนี้ใน CommentUpdateState
NO_UPDATES_REQUESTED: ไม่มีการขออัปเดตความคิดเห็นหรือคำแนะนำในการดำเนินการเป็นกลุ่มALL_SAVED: เราได้อัปเดตความคิดเห็นหรือคำแนะนำทั้งหมดที่คุณขอแล้วALL_FAILED_UNKNOWN_REASON: การอัปเดตความคิดเห็นหรือคำแนะนำที่ขอทั้งหมดบันทึกไม่สำเร็จ แม้ว่าอาจมีการเปลี่ยนแปลงโมเดลเอกสารแล้วก็ตาม