ย้ายข้อมูลจาก Sheets API v3

เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการเปลี่ยนแปลงนี้

หากคุณมีแอปเดิมที่ใช้ Google Sheets API v3 คุณจะย้ายข้อมูลไปยัง Google Sheets API v4 ได้ เวอร์ชัน v4 เป็นแบบ JSON มีอินเทอร์เฟซที่ใช้งานง่าย และเพิ่มฟังก์ชันมากมายซึ่งทำไม่ได้ในเวอร์ชัน v3

หน้านี้จะระบุการแมประหว่างคำสั่ง Sheets API v3 เวอร์ชันเก่ากับการดำเนินการที่เทียบเท่าใน Sheets API v4 การแมปจะมุ่งเน้นที่คอลเล็กชัน spreadsheets.values ซึ่งมีฟังก์ชันอ่านและเขียนของเซลล์โดยตรง ส่วนด้านอื่นๆ เช่น การเพิ่มชีตหรือการอัปเดตพร็อพเพอร์ตี้ของชีตนั้นได้รับการจัดการโดยคอลเล็กชันสเปรดชีต โปรดทราบว่าโครงสร้าง JSON ของ API เวอร์ชัน 4 จะเข้ากันแบบย้อนหลังกับโครงสร้าง XML ที่ใช้ในเวอร์ชัน 3 ไม่ได้

ดูข้อมูลเพิ่มเติมเกี่ยวกับทรัพยากรที่มีอยู่ใน Sheets v4 API ได้ในเอกสารอ้างอิง API

เครื่องหมายและข้อกำหนด

API v3 จะอ้างอิงชีตในสเปรดชีตหนึ่งๆ ว่า "เวิร์กชีต" ซึ่งเหมือนกับคำว่า "ชีต" ที่ API เวอร์ชัน 4 ใช้

API มักกำหนดให้คุณต้องระบุรหัสสเปรดชีตของสเปรดชีตที่คุณทำงานด้วย และมักจะต้องใช้รหัสของ แผ่นงานที่มีการปรับเปลี่ยน ค่าเหล่านี้ปรากฏเป็นส่วนหนึ่งของ URL ปลายทาง API, เป็นพารามิเตอร์การค้นหา หรือเป็นส่วนหนึ่งของเนื้อหาคำขอ ในหน้านี้ ตัวยึดตำแหน่ง spreadsheetId และ sheetId จะหมายถึงรหัสสเปรดชีตและชีตตามลำดับ เมื่อใช้วิธีการที่อธิบายไว้ในหน้านี้ ให้ใช้รหัสจริงในตำแหน่งเหล่านี้แทน

นอกจากนี้ API v3 ยังกำหนดรหัสให้กับแถวที่ดึงข้อมูลโดยใช้ฟีดข้อมูล ด้วย โดยตัวยึดตำแหน่ง rowId จะแสดงในหน้านี้

ให้สิทธิ์คำขอ

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

API เวอร์ชัน 3

Sheets API v3 ทำงานด้วยขอบเขตการให้สิทธิ์เดียว นั่นคือ

https://spreadsheets.google.com/feeds

ซึ่งเป็นชื่อแทนสำหรับ

https://www.googleapis.com/auth/spreadsheets

ใช้รูปแบบขอบเขตได้ทั้ง 2 แบบ

API เวอร์ชัน 4

Sheets API v4 ใช้ชุดขอบเขตต่อไปนี้อย่างน้อย 1 ชุด

https://www.googleapis.com/auth/spreadsheets.readonly
https://www.googleapis.com/auth/spreadsheets
https://www.googleapis.com/auth/drive.readonly
https://www.googleapis.com/auth/drive

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

ระดับการแชร์

ใน API เวอร์ชันเก่า คำว่าระดับการเข้าถึงจะใช้เพื่ออ้างถึงความพร้อมใช้งานของสเปรดชีต

API เวอร์ชัน 3

Sheets API v3 แสดงระดับการเข้าถึงในปลายทางโดยตรง สเปรดชีต public มีการ "เผยแพร่ไปยังเว็บ" แล้ว จึงสามารถเข้าถึง API ได้โดยไม่ได้รับอนุญาต ในขณะที่สเปรดชีต private ต้องมีการตรวจสอบสิทธิ์ โดยจะระบุระดับการเข้าถึงในปลายทางหลังรหัสสเปรดชีต ดังนี้

https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full

API เวอร์ชัน 4

ใน Sheets API v4 ใหม่ ไม่มีการประกาศระดับการเข้าถึงที่ชัดแจ้ง การเรียก API จะใช้รหัสสเปรดชีต หากแอปพลิเคชันไม่มีสิทธิ์ในการเข้าถึง สเปรดชีตที่ระบุ ระบบจะแสดงข้อผิดพลาด มิเช่นนั้น การโทรจะดำเนินการต่อไป

การฉายภาพ

ชีต API v3 ใช้คำว่าการคาดคะเนเพื่ออ้างถึงชุดข้อมูลที่ส่งกลับมาโดยการเรียก API ซึ่งอาจเป็นข้อมูลทั้งหมดหรือชุดย่อยคงที่ที่กำหนดไว้ภายใน API Sheets API v4 ไม่ใช้การฉายภาพ แต่ช่วยให้คุณควบคุมข้อมูลที่ส่งกลับมาได้มากขึ้น

API เวอร์ชัน 3

การตั้งค่าการฉายภาพที่เป็นไปได้ใน Sheets API v3 มีอยู่เพียง 2 อย่างเท่านั้น การคาดการณ์ full จะแสดงข้อมูลที่มีอยู่ทั้งหมด ขณะที่ basic จะแสดงผลชุดย่อยของข้อมูลขนาดเล็กและคงที่ (สำหรับฟีดเวิร์กชีต รายการ และเซลล์) เช่นเดียวกับระดับการเข้าถึง คุณต้องระบุการฉายภาพในปลายทาง API (หลังจากการตั้งค่าระดับการเข้าถึง) ดังนี้

https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/public/basic

ข้อมูลชุดย่อยที่เล็กลงจากการฉายภาพของ basic จะช่วยทำให้โค้ดมีประสิทธิภาพมากขึ้น แต่ไม่สามารถปรับแต่งได้

API เวอร์ชัน 4

แม้ว่าชีต API v4 จะแสดงผลชุดข้อมูลแบบสมบูรณ์ได้ แต่จะไม่กำหนดเซตย่อยแบบคงที่ซึ่งคล้ายกับการตั้งค่าระดับการเข้าถึงของ basic ใน Sheets API v3 เมธอดในคอลเล็กชันสเปรดชีตจะจำกัดปริมาณข้อมูลที่แสดงผลผ่านการใช้พารามิเตอร์การค้นหาของช่อง

เช่น การค้นหาต่อไปนี้จะแสดงเฉพาะชื่อของชีตทั้งหมดในสเปรดชีตหนึ่งๆ

GET https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId?fields=sheets.properties.title

สร้างสเปรดชีต

API เวอร์ชัน 3

Sheets API v3 ไม่ได้สร้างสเปรดชีตใหม่ แต่คุณจะใช้เมธอด Drive API Files.create เพื่อสร้างไฟล์สเปรดชีตใหม่ได้ การดำเนินการนี้กำหนดให้แอปพลิเคชันต้องประกาศขอบเขต https://www.googleapis.com/auth/drive

API เวอร์ชัน 4

นอกจากนี้เมธอด Drive API Files.create ยังใช้กับ Sheets API v4 ได้ด้วย แต่แอปพลิเคชันต้องมีขอบเขต https://www.googleapis.com/auth/drive

Sheets API v4 มีเมธอด spreadsheets.create ให้เป็นทางเลือก ซึ่งสามารถเพิ่มชีต ตั้งค่าคุณสมบัติของสเปรดชีตและชีต และเพิ่มช่วงที่ตั้งชื่อแล้วได้ด้วย ตัวอย่างเช่น การสร้างสเปรดชีตใหม่ และตั้งชื่อว่า "NewTitle"

POST https://sheets.googleapis.com/v4/spreadsheets
{
 "properties": {"title": "NewTitle"}
}

แสดงรายการสเปรดชีตสำหรับผู้ใช้ที่ตรวจสอบสิทธิ์แล้ว

API เวอร์ชัน 3

ฟีด Sheets API v3 ช่วยให้แอปพลิเคชันเรียกดูรายการสเปรดชีตทั้งหมดที่ผู้ใช้ที่ตรวจสอบสิทธิ์แล้วเข้าถึงได้ ปลายทางฟีดสเปรดชีตคือ

GET https://spreadsheets.google.com/feeds/spreadsheets/private/full

API เวอร์ชัน 4

ชีต API v4 ไม่ได้ระบุการดำเนินการเฉพาะนี้ เราขอแนะนำให้ย้ายข้อมูลแอปเพื่อใช้ขอบเขต drive.file ร่วมกับ Google Picker สำหรับการเลือกสเปรดชีต

ในกรณีที่ต้องใช้สเปรดชีตข้อมูล คุณสามารถจำลองข้อมูลผ่านเมธอด Drive API Files.list โดยใช้คำค้นหา mimeType ดังนี้

GET https://www.googleapis.com/drive/v3/files
             ?q=mimeType='application/vnd.google-apps.spreadsheet'

การใช้เมธอด files.list ของ Drive API เพื่อแสดงสเปรดชีตทั้งหมดของผู้ใช้จะต้องมีขอบเขตที่จำกัด

เรียกข้อมูลข้อมูลเมตาของชีต

Sheets API v3 มีฟีดเพื่อเข้าถึงข้อมูลเมตาของชีตที่อยู่ภายในสเปรดชีตที่ระบุ (ข้อมูลแถวและเซลล์จะเข้าถึงผ่านฟีดที่แยกต่างหาก) ข้อมูลเมตามีข้อมูลต่างๆ เช่น ชื่อแผ่นงานและข้อมูลขนาด

เมธอด spreadsheets.get ของ Sheets API v4 ช่วยให้คุณเข้าถึงข้อมูลนี้และอื่นๆ อีกมากมาย

API เวอร์ชัน 3

ฟีดเวิร์กชีตจะเข้าถึงได้จากปลายทาง API นี้ (โดยใช้ส่วนหัวการให้สิทธิ์ที่เหมาะสม)

GET https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full

การตอบกลับคำขอนี้มีโครงสร้างที่คล้ายกันนี้ โดยข้อมูลของแต่ละชีตอยู่ใน <entry> ที่แยกกัน ดังนี้

<feed xmlns="http://www.w3.org/2005/Atom"
    xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/"
    xmlns:gs="http://schemas.google.com/spreadsheets/2006"
    xmlns:gd="http://schemas.google.com/g/2005"
    gd:etag='W/"D0cERnk-eip7ImA9WBBXGEg."'>
  <id>https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full</id>
  <updated>2006-11-17T18:23:45.173Z</updated>
  <title type="text">Groceries R Us</title>
  <link rel="alternate" type="text/html"
      href="https://spreadsheets.google.com/ccc?key=spreadsheetId"/>
  <link rel="http://schemas.google.com/g/2005#feed"
      type="application/atom+xml"
      href="https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full"/>
  <link rel="self" type="application/atom+xml"
      href="https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full"/>
  <link rel="http://schemas.google.com/g/2005#post" type="application/atom+xml"
      href="https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full"/>
  <author>
    <name>Fitzwilliam Darcy</name>
    <email>fitz@example.com</email>
  </author>
  <openSearch:totalResults>1</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>1</openSearch:itemsPerPage>
  <entry gd:etag='"YDwqeyI."'>
    <id>https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full/sheetId</id>
    <updated>2006-11-17T18:23:45.173Z</updated>
    <title type="text">Sheet1</title>
    <content type="text">Sheet1</content>
    <link rel="http://schemas.google.com/spreadsheets/2006#listfeed"
        type="application/atom+xml"
        href="https://spreadsheets.google.com/feeds/list/spreadsheetId/sheetId/private/full"/>
    <link rel="http://schemas.google.com/spreadsheets/2006#cellsfeed"
        type="application/atom+xml"
        href="https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full"/>
    <link rel="self" type="application/atom+xml"
        href="https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full/sheetId"/>
    <link rel="edit" type="application/atom+xml"
        href="https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full/sheetId/version"/>
    <gs:rowCount>100</gs:rowCount>
    <gs:colCount>20</gs:colCount>
  </entry>
</feed>

API เวอร์ชัน 4

คุณสามารถใช้เมธอด spreadsheets.get เพื่อรับพร็อพเพอร์ตี้ชีตและข้อมูลเมตาอื่นๆ ซึ่งมากกว่าที่มีอยู่ใน Sheets API v3 หากต้องการอ่านคุณสมบัติของชีตเท่านั้น ให้ตั้งค่าพารามิเตอร์การค้นหาของ includeGridData เป็น false เพื่อป้องกันไม่ให้รวมข้อมูลเซลล์ในสเปรดชีต ดังนี้

GET https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId?includeGridData=false

การตอบสนองของ Spreadsheet มีอาร์เรย์ของออบเจ็กต์ Sheet คุณจะเห็นชื่อชีตและข้อมูลขนาดโดยเฉพาะได้ในองค์ประกอบ SheetProperties ของออบเจ็กต์เหล่านี้ เช่น

{
  "spreadsheetId": spreadsheetId,
  "sheets": [
      {"properties": {
          "sheetId": sheetId,
          "title": "Sheet1",
          "index": 0,
          "gridProperties": {
              "rowCount": 100,
              "columnCount": 20,
              "frozenRowCount": 1,
              "frozenColumnCount": 0,
              "hideGridlines": false
          },
          ...
       },
       ...
      },
      ...
  ],
  ...
}

เพิ่มชีตในสเปรดชีต

API ทั้ง 2 รายการช่วยให้คุณเพิ่มชีตใหม่ในสเปรดชีตที่มีอยู่ได้

API เวอร์ชัน 3

Sheets API v3 จะเพิ่มเวิร์กชีตใหม่ในสเปรดชีตได้โดยการส่งคำขอ POST ต่อไปนี้ (ตรวจสอบสิทธิ์แล้ว) คุณระบุขนาดของชีตใหม่ได้ ดังนี้

POST https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full
<entry xmlns="http://www.w3.org/2005/Atom"
    xmlns:gs="http://schemas.google.com/spreadsheets/2006">
  <title>Expenses</title>
  <gs:rowCount>50</gs:rowCount>
  <gs:colCount>10</gs:colCount>
</entry>

API เวอร์ชัน 4

คุณเพิ่มชีตใหม่ได้โดยส่งคำขอ AddSheet ในเมธอด spreadsheets.batchUpdate ในส่วนเนื้อหาของคำขอ คุณสามารถระบุพร็อพเพอร์ตี้ของชีตสำหรับชีตใหม่ได้ พร็อพเพอร์ตี้ทั้งหมดเป็นตัวเลือกที่ไม่บังคับ การระบุชื่อที่ใช้สำหรับชีตที่มีอยู่นั้นเป็นข้อผิดพลาด

POST https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId:batchUpdate
{
  "requests": [{
      "addSheet": {
          "properties": {
            "title": "Expenses",
            "sheetType": "GRID",
            "gridProperties": {
              "rowCount": 50,
              "columnCount": 10
            }
          }
      }
  }],
}

เปลี่ยนชื่อและขนาดชีต

Sheets API v3 ให้คุณอัปเดตชื่อและขนาดชีตได้ Sheets API v4 รองรับการอัปเดตนี้เช่นกัน และจะใช้เพื่ออัปเดตพร็อพเพอร์ตี้อื่นๆ ของชีตได้เช่นกัน โปรดทราบว่าการลดขนาดชีตอาจทำให้ข้อมูลในเซลล์ที่ครอบตัดถูกลบโดยไม่มีคำเตือน

API เวอร์ชัน 3

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

PUT https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full/sheetId/version
<entry>
  <id>
    https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full/sheetId
  </id>
  <updated>2007-07-30T18:51:30.666Z</updated>
  <category scheme="http://schemas.google.com/spreadsheets/2006"
    term="http://schemas.google.com/spreadsheets/2006#worksheet"/>
  <title type="text">Expenses</title>
  <content type="text">Expenses</content>
  <link rel="http://schemas.google.com/spreadsheets/2006#listfeed"
    type="application/atom+xml" href="https://spreadsheets.google.com/feeds/list/spreadsheetId/sheetId/private/full"/>
  <link rel="http://schemas.google.com/spreadsheets/2006#cellsfeed"
    type="application/atom+xml" href="https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full"/>
  <link rel="self" type="application/atom+xml"
    href="https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full/sheetId"/>
  <link rel="edit" type="application/atom+xml"
    href="https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full/sheetId/version"/>
  <gs:rowCount>45</gs:rowCount>
  <gs:colCount>15</gs:colCount>
</entry>

API เวอร์ชัน 4

หากต้องการอัปเดตขนาด ชื่อ และพร็อพเพอร์ตี้อื่นๆ ของชีต ให้ส่งคำขอ updateSheetProperties ในเมธอด spreadsheets.batchUpdate เนื้อหาของคำขอ POST ควรมีพร็อพเพอร์ตี้ที่จะเปลี่ยน และพารามิเตอร์ fields ควรแสดงพร็อพเพอร์ตี้เหล่านั้นอย่างชัดเจน (หากต้องการอัปเดตพร็อพเพอร์ตี้ทั้งหมด ให้ใช้ fields:"*" เป็นชื่อย่อในการระบุรายชื่อทั้งหมด) ตัวอย่างต่อไปนี้ระบุว่าควรอัปเดตคุณสมบัติชื่อและขนาดของชีตสําหรับชีตด้วยรหัสที่กําหนด

POST https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId:batchUpdate
{
  "requests": [
    {
      "updateSheetProperties": {
          "properties": {
            "sheetId": sheetId,
            "title": "Expenses",
            "gridProperties": {
              "rowCount": 45,
              "columnCount": 15,
            }
          },
          "fields": "title,gridProperties(rowCount,columnCount)"
     }
   }
  ],
}

หากต้องการดึงข้อมูล sheetId ของชีต ให้ใช้เมธอด spreadsheets.get ในสเปรดชีต

ลบชีต

API ดังกล่าวจะนำชีตออกจากสเปรดชีตที่ระบุได้

API เวอร์ชัน 3

หากต้องการลบเวิร์กชีต ให้เริ่มด้วยการเรียกข้อมูลฟีดเวิร์กชีต จากนั้นส่งคำขอ DELETE ใน URL edit ของรายการเวิร์กชีตเป้าหมาย

DELETE https://spreadsheets.google.com/feeds/worksheets/spreadsheetId/private/full/sheetId/version

API เวอร์ชัน 4

หากต้องการลบชีต ให้ส่งคำขอ DeleteSheet ในเมธอด spreadsheets.batchUpdate เนื้อหาของคำขอ POST ควรมีเฉพาะ sheetId สำหรับชีตที่จะลบ เช่น

POST https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId:batchUpdate
{
  "requests": [
    {
      "deleteSheet": {
        "sheetId": sheetId
      }
    }
  ],
}

หากต้องการเรียกดู sheetId ของชีตแต่ละรายการ ให้ใช้เมธอด spreadsheets.get สเปรดชีต

ดึงข้อมูลแถว

ฟีดแถวรายการเป็นหนึ่งใน 2 วิธีที่ Sheets API v3 ใช้ในการเข้าถึงข้อมูลภายในเซลล์ของสเปรดชีต (อีกวิธีคือฟีดเซลล์) ฟีดแถวมีไว้เพื่อรองรับการทำงานทั่วไปของสเปรดชีต (การอ่านแถวต่อแถว การเพิ่มแถว การจัดเรียง) แต่ใช้การสันนิษฐานบางอย่างที่ทำให้ไม่เหมาะกับงานบางงาน กล่าวอย่างเจาะจงคือ ฟีดข้อมูลจะถือว่าแถวว่างเป็นส่วนท้ายของฟีด และส่วนหัวที่จำเป็นจะอยู่ในแถวแรกของชีต

ในทางตรงกันข้าม Sheets API v4 ไม่ได้ใช้วิธีการเข้าถึงที่มีการกำหนดแถวเฉพาะ แต่จะเข้าถึงข้อมูลเซลล์ของชีตโดยการอ้างอิงช่วงเฉพาะที่จำเป็นโดยใช้รูปแบบ A1 แทน ซึ่งอาจเป็นบล็อกของเซลล์ ทั้งแถว ทั้งคอลัมน์ หรือทั้งชีตก็ได้ API ยังเข้าถึงชุดเซลล์ที่ไม่ต่อเนื่องได้ด้วย

API เวอร์ชัน 3

หากต้องการระบุ URL ของฟีดรายการสำหรับเวิร์กชีตหนึ่งๆ ให้เรียกฟีดเวิร์กชีต และค้นหา URL ของฟีดข้อมูลในรายการเวิร์กชีตที่สนใจ

หากต้องการเรียกข้อมูลฟีดที่อิงตามรายการ ให้ส่งคำขอ GET ไปยัง URL ของฟีดข้อมูลโดยใช้ส่วนหัวการให้สิทธิ์ที่เหมาะสม เช่น

GET https://spreadsheets.google.com/feeds/list/spreadsheetId/sheetId/private/full

การตอบกลับคำขอนี้ประกอบด้วยรายการที่ตรงกับแถวที่ระบุ แต่ละเซลล์จะอ้างอิงตามชื่อที่ระบุไว้ในแถวส่วนหัวของชีต (บังคับ) ตัวอย่างเช่น นี่คือรายการแถว 1 แถว

<entry gd:etag='"S0wCTlpIIip7ImA0X0QI"'>
  <id>rowId</id>
  <updated>2006-11-17T18:23:45.173Z</updated>
  <category scheme="http://schemas.google.com/spreadsheets/2006"
      term="http://schemas.google.com/spreadsheets/2006#list"/>
  <title type="text">Bingley</title>
  <content type="text">Hours: 10, Items: 2, IPM: 0.0033</content>
  <link rel="self" type="application/atom+xml"
      href="https://spreadsheets.google.com/feeds/list/spreadsheetId/sheetId/private/full/rowId"/>
  <link rel="edit" type="application/atom+xml"
      href="https://spreadsheets.google.com/feeds/list/spreadsheetId/sheetId/private/full/rowId/version"/>
  <gsx:name>Bingley</gsx:name>
  <gsx:hours>10</gsx:hours>
  <gsx:items>2</gsx:items>
  <gsx:ipm>0.0033</gsx:ipm>
</entry>

โดยค่าเริ่มต้น แถวที่แสดงผลในฟีดข้อมูลจะแสดงตามลำดับแถว Sheets API v3 มีพารามิเตอร์การค้นหาเพื่อเปลี่ยนลำดับ

กลับลำดับ:

GET https://spreadsheets.google.com/feeds/list/spreadsheetId/sheetId/private/full?reverse=true

วิธีจัดลำดับตามคอลัมน์ที่เฉพาะเจาะจง

GET https://spreadsheets.google.com/feeds/list/spreadsheetId/sheetId/private/full
             ?orderby=column:lastname

Sheets API v3 ยังอนุญาตให้กรองแถวที่ระบุผ่านคำค้นหาที่มีโครงสร้าง (ซึ่งอ้างอิงตามส่วนหัวคอลัมน์) ดังนี้

GET https://spreadsheets.google.com/feeds/list/spreadsheetId/sheetId/private/full
             ?sq=age>25%20and%20height<175

API เวอร์ชัน 4

เมื่อใช้ Sheets API v4 คุณจะดึงแถวตามช่วงได้โดยใช้เมธอด spreadsheets.values.get หรือ spreadsheets.values.batchGet ตัวอย่างต่อไปนี้จะแสดงแถวทั้งหมดใน "Sheet1"

GET https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId/values/Sheet1

การตอบกลับคำขอนี้มีโครงสร้างที่คล้ายกับ

{
  "range": "Sheet1",
  "majorDimension": "ROWS",
  "values": [["Name", "Hours", "Items", "IPM"],
             ["Bingley", "10", "2", "0.0033"],
             ["Darcy", "14", "6", "0.0071"]]
}

เซลล์ว่างต่อท้ายจะไม่รวมอยู่ในคำตอบเมื่อเรียกข้อมูลทั้งแถว คอลัมน์ หรือชีต

Sheets API v4 ไม่มีค่าที่เทียบเท่ากับพารามิเตอร์การค้นหาลำดับแถวที่ Sheets API v3 ระบุ การเรียงต่อกันนั้นมีขั้นตอนเพียงเล็กน้อย เพียงประมวลผลอาร์เรย์ values ที่แสดงผลในลำดับกลับกัน ระบบไม่รองรับการเรียงลำดับตามคอลัมน์สำหรับการอ่าน แต่คุณจัดเรียงข้อมูลในชีตได้ (โดยใช้คำขอ SortRange) แล้วอ่าน

ขณะนี้ Sheets API v4 ยังไม่มีคุณลักษณะที่เทียบเท่ากันโดยตรงสำหรับการค้นหาที่มีโครงสร้างของ Sheets API v3 แต่คุณสามารถดึงข้อมูลที่เกี่ยวข้องและจัดเรียงข้อมูลตามความจําเป็นในแอปพลิเคชัน

เพิ่มแถวข้อมูลใหม่

คุณสามารถเพิ่มข้อมูลแถวใหม่ในชีตโดยใช้ API ตัวใดก็ได้

API เวอร์ชัน 3

หากต้องการระบุ URL ของฟีดแบบรายการสำหรับเวิร์กชีตหนึ่งๆ ให้เรียกฟีดเวิร์กชีต และค้นหา URL ของโพสต์ในรายการเวิร์กชีตที่สนใจ

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

POST https://spreadsheets.google.com/feeds/list/spreadsheetId/sheetId/private/full

เนื้อหาของคำขอ POST ควรมีรายการสำหรับข้อมูลแถวที่จะเพิ่ม โดยมีแต่ละเซลล์ที่อ้างอิงตามส่วนหัวคอลัมน์ดังนี้

<entry xmlns="http://www.w3.org/2005/Atom"
       xmlns:gsx="http://schemas.google.com/spreadsheets/2006/extended">
  <gsx:hours>2</gsx:hours>
  <gsx:ipm>0.5</gsx:ipm>
  <gsx:items>60</gsx:items>
  <gsx:name>Elizabeth</gsx:name>
</entry>

ระบบจะเพิ่มแถวใหม่ต่อท้ายชีตที่ระบุ

API เวอร์ชัน 4

เมื่อใช้ Sheets API v4 คุณจะเพิ่มแถวได้โดยใช้เมธอด spreadsheets.values.append ตัวอย่างต่อไปนี้เขียนข้อมูลแถวใหม่ใต้ตารางสุดท้ายใน "Sheet1" ของสเปรดชีต

POST https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId/append/Sheet1

{
   "values": [["Elizabeth", "2", "0.5", "60"]]
}

นอกจากนี้ Sheets API v4 ยังช่วยให้คุณผนวกเซลล์ที่มีคุณสมบัติและการจัดรูปแบบเฉพาะได้โดยใช้คำขอ AppendCells ใน spreadsheets.batchUpdate

แก้ไขแถวที่มีข้อมูลใหม่

API ทั้ง 2 รายการจะอนุญาตให้อัปเดตข้อมูลแถวด้วยค่าใหม่

API เวอร์ชัน 3

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

เมื่ออัปเดตรายการแล้ว ให้ส่งคำขอ PUT ที่มีรายการซึ่งเป็นเนื้อหาคำขอไปยัง URL edit ที่ให้ไว้ในรายการแถวนั้น โดยใช้ส่วนหัวการให้สิทธิ์ที่เหมาะสม เช่น

PUT https://spreadsheets.google.com/feeds/list/spreadsheetId/sheetId/private/full/rowId/version
<entry gd:etag='"S0wCTlpIIip7ImA0X0QI"'>
  <id>rowId</id>
  <updated>2006-11-17T18:23:45.173Z</updated>
  <category scheme="http://schemas.google.com/spreadsheets/2006"
    term="http://schemas.google.com/spreadsheets/2006#list"/>
  <title type="text">Bingley</title>
  <content type="text">Hours: 10, Items: 2, IPM: 0.0033</content>
  <link rel="self" type="application/atom+xml"
    href="https://spreadsheets.google.com/feeds/list/spreadsheetId/sheetId/private/full/rowId"/>
  <link rel="edit" type="application/atom+xml"
    href="https://spreadsheets.google.com/feeds/list/spreadsheetId/sheetId/private/full/rowId/version"/>
  <gsx:name>Bingley</gsx:name>
  <gsx:hours>20</gsx:hours>
  <gsx:items>4</gsx:items>
  <gsx:ipm>0.0033</gsx:ipm>
</entry>

API เวอร์ชัน 4

เมื่อใช้ Sheets API v4 คุณจะแก้ไขแถวได้โดยใช้สัญลักษณ์ A1 ของแถวที่ต้องการแก้ไข และออกคำขอ spreadsheets.values.update เพื่อเขียนทับแถวนั้น โดยช่วงที่ระบุจะอ้างอิงเฉพาะเซลล์แรกในแถว โดย API จะอนุมานเซลล์ที่จะอัปเดตโดยอิงตามค่าที่ระบุไว้ในคำขอ หากคุณระบุช่วงหลายเซลล์แทน ค่าที่คุณระบุต้องตรงกับช่วงนั้น หากไม่ใช่ API จะแสดงข้อผิดพลาด

ตัวอย่างคำขอและเนื้อหาคำขอต่อไปนี้เพิ่มข้อมูลไปยังแถวที่ 4 ของ "Sheet1"

PUT https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId/values/Sheet1!A4
{
   "values": [["Elizabeth", "2", "0.5", "60"]]
}

คุณสามารถอัปเดตข้อมูลแถวจากเมธอด spreadsheet.values.batchUpdate ได้ เพราะวิธีนี้จะมีประสิทธิภาพมากกว่าถ้าคุณอัปเดตแถวหรือเซลล์หลายรายการ

นอกจากนี้ Sheets API v4 ยังช่วยให้คุณแก้ไขคุณสมบัติของเซลล์และการจัดรูปแบบเซลล์โดยใช้คำขอ UpdateCells หรือ RepeatCell ใน spreadsheets.batchUpdate ด้วย

ลบแถว

API ทั้ง 2 รายการรองรับการลบแถว แถวที่ลบจะถูกลบออกจากสเปรดชีต และแถวที่อยู่ใต้สเปรดชีตจะถูกพุชขึ้นมาอีกแถวหนึ่ง

API เวอร์ชัน 3

หากต้องการลบแถว ให้เรียกข้อมูลแถวที่จะลบออกจากฟีดข้อมูลก่อน แล้วส่งคำขอ DELETE ไปยัง URL edit ที่ระบุในรายการของแถว ซึ่งเป็น URL เดียวกับที่ใช้อัปเดตแถว

DELETE https://spreadsheets.google.com/feeds/list/spreadsheetId/sheetId/private/full/rowId/version

หากคุณต้องการตรวจสอบว่าคุณไม่ได้ลบแถวที่มีการเปลี่ยนแปลงโดยไคลเอ็นต์อื่นหลังจากที่ดึงข้อมูลมา ให้ใส่ส่วนหัว HTTP If-Match ที่มีค่า ETag ของแถวเดิม คุณระบุค่า ETag ของแถวต้นฉบับได้โดยการตรวจสอบแอตทริบิวต์ gd:etag ขององค์ประกอบรายการ

หากต้องการลบแถวโดยไม่คำนึงว่ามีคนอื่นอัปเดตแถวหรือไม่นับตั้งแต่ที่คุณดึงข้อมูลมา ให้ใช้ If-Match: * และไม่รวม ETag (ในกรณีนี้ คุณไม่จำเป็นต้องเรียกข้อมูลแถวก่อนที่จะลบ)

API เวอร์ชัน 4

การลบแถวด้วย Sheets API v4 จะจัดการโดยการเรียกใช้เมธอด spreadsheet.batchUpdate โดยใช้คำขอ DeleteDimension คำขอนี้ยังใช้เพื่อนำคอลัมน์ออก ส่วนนักพัฒนาซอฟต์แวร์ รวมถึงเลือกนำเฉพาะบางส่วนของแถวหรือคอลัมน์ออกได้ด้วย ตัวอย่างเช่น คำสั่งต่อไปนี้จะนำแถวที่ 6 ของชีตที่มีรหัสที่ระบุออก (ดัชนีแถวมีฐาน 0 โดยไม่รวม StartIndex และไม่รวม endIndex)

POST https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId:batchUpdate
{
  "requests": [
    {
      "deleteDimension": {
        "range": {
          "sheetId": sheetId,
          "dimension": "ROWS",
          "startIndex": 5,
          "endIndex": 6
        }
      }
    }
  ],
}

คุณจะดึงข้อมูล sheetId ของชีตได้โดยใช้เมธอด spreadsheet.get

เรียกดูข้อมูลเซลล์

Sheets API v3 มีฟีดเซลล์สำหรับการเข้าถึงขั้นพื้นฐานไปยังข้อมูลทั้งหมดที่จัดเก็บไว้ในสเปรดชีต สำหรับสิทธิ์การอ่าน ฟีดเซลล์สามารถให้เนื้อหาชีตทั้งหมดหรือช่วงของเซลล์ของชีตที่กำหนดโดยชุดพารามิเตอร์การค้นหา แต่ต้องเรียกข้อมูลช่วงที่ไม่มีความสัมพันธ์แบบบล็อกเดียวแยกกันโดยใช้คำขอ GET เพิ่มเติม

Sheets API v4 เรียกชุดข้อมูลเซลล์ชุดใดก็ได้จากชีต (รวมถึงช่วงข้อมูลหลายช่วงที่ไม่ต่อเนื่อง) Sheets API v3 สามารถแสดงเนื้อหาของเซลล์เป็นค่าอินพุต (ตามที่ผู้ใช้ป้อนด้วยแป้นพิมพ์) และ/หรือเอาต์พุตของสูตร (หากเป็นตัวเลข) ชีต API v4 จะให้สิทธิ์เข้าถึงค่า สูตร การจัดรูปแบบ ไฮเปอร์ลิงก์ การตรวจสอบข้อมูล และพร็อพเพอร์ตี้อื่นๆ โดยสมบูรณ์เท่านั้น

API เวอร์ชัน 3

หากต้องการระบุ URL ของฟีดเซลล์สำหรับเวิร์กชีตหนึ่งๆ ให้ตรวจสอบฟีดเวิร์กชีตและค้นหา URL ของฟีดเซลล์ในรายการเวิร์กชีตที่สนใจ

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

GET https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full

มีการอ้างอิงเซลล์โดยใช้หมายเลขแถวและคอลัมน์ การดึงช่วงที่เฉพาะเจาะจงช่วงเดียวสามารถทำได้โดยใช้พารามิเตอร์การค้นหา max-row, min-row, max-col และ min-col ตัวอย่างเช่น คำสั่งต่อไปนี้จะเรียกข้อมูลเซลล์ทั้งหมดในคอลัมน์ 4 (D) โดยขึ้นต้นด้วยแถว 2

GET https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full
             ?min-row=2&min-col=4&max-col=4

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

<entry gd:etag='"ImB5CBYSRCp7"'>
  <id>https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full/R9C4</id>
  <updated>2006-11-17T18:27:32.543Z</updated>
  <category scheme="http://schemas.google.com/spreadsheets/2006"
    term="http://schemas.google.com/spreadsheets/2006#cell"/>
  <title type="text">D4</title>
  <content type="text">5</content>
  <link rel="self" type="application/atom+xml"
    href="https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full/R9C4"/>
  <link rel="edit" type="application/atom+xml"
    href="https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full/R9C4/srevc"/>
  <gs:cell row="4" col="4" inputValue="=FLOOR(C4/(B4*60),.0001)"
    numericValue="5.0">5</gs:cell>
</entry>

API เวอร์ชัน 4

เรียกดูข้อมูลเซลล์โดยเรียกใช้เมธอด spreadsheets.values.get หรือ spreadsheets.values.batchGet สำหรับช่วงหรือช่วงที่สนใจตามลำดับ ตัวอย่างเช่น คำสั่งต่อไปนี้แสดงผลเซลล์ในคอลัมน์ D ของ "Sheet2" ซึ่งเริ่มต้นด้วยแถว 2 ในลำดับหลักของคอลัมน์และแสดงผลสูตรตามที่ป้อน (ละเว้นเซลล์ว่างที่อยู่ต่อท้าย)

GET https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId/values/Sheet2!D2:D?majorDimension=COLUMNS&valueRenderOption=FORMULA

การตอบกลับคำขอนี้มีโครงสร้างคล้ายกับรายการต่อไปนี้

{
  "spreadsheetId": spreadsheetId,
  "valueRanges": [
      {"range": "Sheet2!D2:D",
       "majorDimension": "COLUMNS",
       "values": [["Widget", 234, "=FLOOR(C4/(B4*60),.0001)", "=D4\*1000"]]
      }]
}

การใช้ spreadsheet.values.batchGet จะมีประสิทธิภาพมากกว่าหากคุณต้องการเรียกดูข้อมูลเซลล์หลายช่วง หากต้องการเข้าถึงพร็อพเพอร์ตี้ของเซลล์ เช่น การจัดรูปแบบ คุณต้องใช้เมธอด spreadsheet.get

แก้ไขเซลล์

Sheets API v3 ช่วยให้คุณแก้ไขเนื้อหาของเซลล์ได้โดยการออกคำสั่ง PUT ไปยังฟีดเซลล์โดยมีรายการเซลล์ที่แก้ไขแล้วเป็นเนื้อหาของคำขอ

ในทางตรงกันข้าม Sheets API v4 จะมีเมธอด spreadsheets.values.update และ spreadsheets.values.batchUpdate สำหรับการเปลี่ยนเนื้อหาของเซลล์

API เวอร์ชัน 3

หากต้องการแก้ไขเนื้อหาของเซลล์เดียว ให้หารายการเซลล์ในฟีดเซลล์ก่อน รายการมี URL การแก้ไข อัปเดตรายการให้สอดคล้องกับเนื้อหาที่คุณต้องการให้เซลล์มี แล้วส่งคำขอ PUT ไปยัง URL แก้ไข โดยมีรายการเซลล์ที่อัปเดตเป็นเนื้อหาของคำขอ เช่น เซลล์ D2 (R2C4) ที่อัปเดตต่อไปนี้เพื่อให้มีสูตร SUM

PUT https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full//R2C4/srevc

<entry xmlns="http://www.w3.org/2005/Atom"
    xmlns:gs="http://schemas.google.com/spreadsheets/2006">
  <id>https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full/R2C4</id>
  <link rel="edit" type="application/atom+xml"
    href="https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full/R2C4"/>
  <gs:cell row="2" col="4" inputValue="=SUM(A1:B6)"/>
</entry>

API เวอร์ชัน 4

คุณสามารถแก้ไขเซลล์เดียวใน Sheets API v4 ได้โดยใช้เมธอด spreadsheets.values.update วิธีนี้ต้องใช้พารามิเตอร์การค้นหา ValueInputOption ซึ่งระบุว่าระบบจะปฏิบัติต่อข้อมูลอินพุตเหมือนที่ป้อนไว้ใน UI ของชีต (USER_ENTERED) หรือไม่ได้แยกวิเคราะห์และใช้ตามเดิม (RAW) ตัวอย่างเช่น เซลล์ D2 ที่อัปเดตต่อไปนี้ซึ่งมีสูตร

PUT https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId/values/D2?valueInputOption=USER_ENTERED
{"values": [["=SUM(A1:B6)"]]}

หากทำการแก้ไขเซลล์หลายรายการ ให้ใช้เมธอด spreadsheets.values.batchUpdate เพื่อส่งคำขอในคำขอเดียว

แก้ไขหลายเซลล์ผ่านคำขอแบบกลุ่ม

API ทั้ง 2 แบบช่วยให้เปลี่ยนแปลงเนื้อหาของหลายเซลล์ได้ด้วยคำขอ (เป็นกลุ่ม) เดียว เซลล์ที่คำขอแบบกลุ่มอ้างอิงถึงไม่จำเป็นต้องอยู่ในช่วงที่ผูกมัด

ในกรณีที่การแก้ไขเซลล์อย่างน้อย 1 รายการในกลุ่มดำเนินการไม่สำเร็จ Sheets API v3 จะช่วยให้ผู้ใช้รายอื่นทำงานสำเร็จ แต่ Sheets API v4 จะแสดงผลข้อผิดพลาดหากการอัปเดตเป็นกลุ่มล้มเหลว และไม่ได้นำไปใช้ในกรณีดังกล่าว

API เวอร์ชัน 3

หากต้องการแก้ไขหลายเซลล์ ให้เรียกฟีดเซลล์ของเวิร์กชีตก่อน รายการมี URL แบบกลุ่ม ส่งคำขอ POST ไปยัง URL นี้ พร้อมกับเนื้อหาของคำขอที่อธิบายถึงเซลล์ที่คุณต้องการอัปเดตและเนื้อหาเซลล์ใหม่ คำขอ POST และเนื้อหาคำขอมีโครงสร้างคล้ายกับรายการต่อไปนี้

POST https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full/batch
<feed xmlns="http://www.w3.org/2005/Atom"
      xmlns:batch="http://schemas.google.com/gdata/batch"
      xmlns:gs="http://schemas.google.com/spreadsheets/2006">
  <id>https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full</id>
  <entry>
    <batch:id>request1</batch:id>
    <batch:operation type="update"/>
    <id>https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full/R2C4</id>
    <link rel="edit" type="application/atom+xml"
      href="https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full/R2C4/version"/>
    <gs:cell row="2" col="4" inputValue="newData"/>
  </entry>
  ...
  <entry>
    <batch:id>request2</batch:id>
    <batch:operation type="update"/>
    <id>https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full/R2C5</id>
    <link rel="edit" type="application/atom+xml"
      href="https://spreadsheets.google.com/feeds/cells/spreadsheetId/sheetId/private/full/R2C5/version"/>
    <gs:cell row="5" col="2" inputValue="moreInfo"/>
  </entry>
</feed>

ฟิลด์ batch:id ควรระบุคำขอภายในกลุ่มโดยไม่ซ้ำกัน ช่อง batch:operation ควรเป็น update สำหรับการแก้ไขเซลล์ gs:cell ระบุเซลล์ตามหมายเลขแถวและคอลัมน์และระบุข้อมูลใหม่เพื่อแทรกลงในเซลล์ id มี URL แบบเต็มไปยังเซลล์ที่จะอัปเดต link ต้องมีแอตทริบิวต์ href ที่มีเส้นทางแบบเต็มไปยังรหัสของเซลล์ ต้องระบุข้อมูลในช่องเหล่านี้ทั้งหมดสำหรับแต่ละรายการ

API เวอร์ชัน 4

Sheets API v4 มีการแก้ไขค่าเซลล์เป็นกลุ่มผ่านเมธอด spreadsheets.values.batchUpdate

การแก้ไขหลายเซลล์ทำได้โดยส่งคำขอ POST ที่มีการเปลี่ยนแปลงข้อมูลที่ระบุไว้ในเนื้อหาคำขอ เช่น

POST https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId/values:batchUpdate
{
  "valueInputOption": "USER_ENTERED"
  "data": [
       {"range": "D4",
        "majorDimension": "ROWS",
        "values": [["newData"]]
       },
       {"range": "B5",
        "majorDimension": "ROWS",
        "values": [["moreInfo"]]
       }
  ]
}

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