讀取及寫入開發人員中繼資料

開發人員中繼資料功能可讓您將中繼資料與試算表中的各種實體和位置建立關聯。接著,您可以查詢這項中繼資料,並用來尋找與其相關聯的物件。

您可以將中繼資料與列、欄、工作表或試算表建立關聯。

開發人員中繼資料可讓您執行下列作業:

  • 將任意資料與試算表中的各種實體和位置建立關聯:例如,將 totals 與 D 欄建立關聯,或將 responseId = 1234 與第 7 列建立關聯。

  • 找出與特定中繼資料鍵或屬性相關聯的所有位置和資料:舉例來說,假設與 D 欄相關聯的鍵為 totals,或是給定 responseId,則傳回所有含有 responseId 中繼資料和相關聯中繼資料值的資料列。

  • 找出與特定實體或位置相關聯的所有資料:舉例來說,假設有 D 欄,請傳回與該位置相關聯的所有中繼資料。

  • 指定相關聯的中繼資料,即可擷取位置中的值:舉例來說,如果提供 totals,系統會傳回相關聯的欄或列所含值的表示法;如果提供 summary,系統會傳回相關聯的試算表資源表示法。

  • 指定相關聯的中繼資料,即可更新位置中的值:舉例來說,您不必透過 A1 標記更新資料列中的值,而是透過指出中繼資料 ID 來更新值。

讀取及寫入中繼資料

透過 spreadsheets.developerMetadata 資源,您可以存取與試算表中的位置或物件相關聯的開發人員中繼資料。

關於開發人員中繼資料

本節說明使用 Google Sheets API 時,應考量開發人員中繼資料的哪些重要事項。

以標記形式呈現的中繼資料

開發人員中繼資料的用途之一是標記,可僅使用鍵和位置命名試算表中的位置。舉例來說,您可以將 headerRow 與工作表中的特定資料列建立關聯,或將 totals 與特定資料欄建立關聯。標記可用於將試算表的部分內容,以語意方式繫結至第三方工具或資料庫中的欄位,因此試算表的變更不會導致應用程式中斷。

以屬性形式呈現的中繼資料

指定鍵、位置和所建立的中繼資料,會做為與該位置相關聯的鍵值組合。舉例來說,您可以建立下列關聯:

  • formResponseId = resp123 個資料列
  • lastUpdated = 1477369882 搭配資料欄。

這項功能可讓您儲存及存取與試算表特定區域或資料相關聯的自訂命名屬性。

專案與文件可見中繼資料

為避免一個開發人員專案干擾另一個專案的中繼資料,系統提供 2 個中繼資料 visibility 設定:projectdocument。使用 Sheets API 時,專案中繼資料只能從建立該資料的開發人員專案中查看及存取。只要開發人員專案有權存取文件,就能存取文件的中繼資料。

如果查詢未明確指定瀏覽權限,系統會傳回相符的文件中繼資料,以及提出要求的開發人員專案相符專案中繼資料。

唯一性

中繼資料鍵不必是獨一無二,但 metadataId 必須是不同的。如果您建立中繼資料,但未指定 ID 欄位,API 會指派 ID。這個 ID 可用來識別中繼資料,而鍵和其他屬性則可用來識別中繼資料集。

建立中繼資料

如要建立中繼資料,請使用 batchUpdate 方法,並提供含有 metadataKeylocationvisibilitycreateDeveloperMetadataRequest。您可以選擇指定 metadataValue 或明確的 metadataId

如果指定的 ID 已在使用中,要求就會失敗。如果您未提供 ID,API 會指派 ID。

在本範例中,我們會在要求中提供鍵、值和資料列。回應會傳回這些開發人員中繼資料值,以及指派的中繼資料 ID。

要求

{
  "requests": [
    {
      "createDeveloperMetadata": {
        "developerMetadata": {
          "location": {
            "dimensionRange": {
              "sheetId": sheetId,
              "dimension": "ROWS",
              "startIndex": 6,
              "endIndex": 7
            }
          },
          "visibility": "DOCUMENT",
          "metadataKey": "Sales",
          "metadataValue": "2022"
        }
      }
    }
  ]
}

回應

{
  "spreadsheetId": spreadsheetId,
  "replies": [
    {
      "createDeveloperMetadata": {
        "developerMetadata": {
          "metadataId": metadataId,
          "metadataKey": "Sales",
          "metadataValue": "2022",
          "location": {
            "locationType": "ROW",
            "dimensionRange": {
              "sheetId": sheetId,
              "dimension": "ROWS",
              "startIndex": 6,
              "endIndex": 7
            }
          },
          "visibility": "DOCUMENT"
        }
      }
    }
  ]
}

讀取單一中繼資料項目

如要擷取單一不重複的開發人員中繼資料,請使用 spreadsheets.developerMetadata.get 方法,並指定包含中繼資料的 spreadsheetId 和開發人員中繼資料的專屬 metadataId

要求

在本範例中,我們會在要求中提供試算表 ID 和中繼資料 ID。回應會傳回中繼資料 ID 的開發人員中繼資料值。

GET https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId/developerMetadata/metadataId

回應

{
  "metadataId": metadataId,
  "metadataKey": "Sales",
  "metadataValue": "2022",
  "location": {
    "locationType": "ROW",
    "dimensionRange": {
      "sheetId": sheetId,
      "dimension": "ROWS",
      "startIndex": 6,
      "endIndex": 7
    }
  },
  "visibility": "DOCUMENT"
}

讀取多個中繼資料項目

如要擷取多個開發人員中繼資料項目,請使用 spreadsheets.developerMetadata.search 方法。您需要指定DataFilter,與任何屬性組合 (例如鍵、值、位置或可見度) 的現有中繼資料相符。

在本範例中,我們在要求中提供多個中繼資料 ID。回應會傳回每個中繼資料 ID 的開發人員中繼資料值。

要求

{
  "dataFilters": [
    {
      "developerMetadataLookup": {
        "metadataId": metadataId
      }
    },
    {
      "developerMetadataLookup": {
        "metadataId": metadataId
      }
    }
  ]
}

回應

{
  "matchedDeveloperMetadata": [
    {
      "developerMetadata": {
        "metadataId": metadataId,
        "metadataKey": "Revenue",
        "metadataValue": "2022",
        "location": {
          "locationType": "SHEET",
          "sheetId": sheetId
        },
        "visibility": "DOCUMENT"
      },
      "dataFilters": [
        {
          "developerMetadataLookup": {
            "metadataId": metadataId
          }
        }
      ]
    },
    {
      "developerMetadata": {
        "metadataId": metadataId,
        "metadataKey": "Sales",
        "metadataValue": "2022",
        "location": {
          "locationType": "SHEET",
          "sheetId": sheetId
        },
        "visibility": "DOCUMENT"
      },
      "dataFilters": [
        {
          "developerMetadataLookup": {
            "metadataId": metadataId
          }
        }
      ]
    }
  ]
}

更新中繼資料

如要更新開發人員中繼資料,請使用 spreadsheets.batchUpdate 方法,並提供 UpdateDeveloperMetadataRequest。您需要指定DataFilter,以指定要更新的中繼資料、包含新值的DeveloperMetadata物件,以及說明要更新欄位的欄位遮罩

在本範例中,我們會在要求中提供中繼資料 ID、工作表 ID 和新的中繼資料鍵。回應會傳回這些開發人員中繼資料值,以及更新後的中繼資料鍵。

要求

{
  "requests": [
    {
      "updateDeveloperMetadata": {
        "dataFilters": [
          {
            "developerMetadataLookup": {
              "metadataId": metadataId
            }
          }
        ],
        "developerMetadata": {
          "location": {
            "sheetId": sheetId
          },
          "metadataKey": "SalesUpdated"
        },
        "fields": "location,metadataKey"
      }
    }
  ]
}

回應

{
  "spreadsheetId": spreadsheetId,
  "replies": [
    {
      "updateDeveloperMetadata": {
        "developerMetadata": [
          {
            "metadataId": metadataId,
            "metadataKey": "SalesUpdated",
            "metadataValue": "2022",
            "location": {
              "locationType": "SHEET",
              "sheetId": sheetId
            },
            "visibility": "DOCUMENT"
          }
        ]
      }
    }
  ]
}

刪除中繼資料

如要刪除開發人員中繼資料,請使用 batchUpdate 方法,並提供 DeleteDeveloperMetadataRequest。您需要指定 DataFilter,選取要刪除的中繼資料。

在本例中,我們會在要求中提供中繼資料 ID。回應會傳回中繼資料 ID 的開發人員中繼資料值。

如要確認開發人員中繼資料已移除,請使用 spreadsheets.developerMetadata.get 方法,並指定已刪除的中繼資料 ID。您應該會收到 404: Not Found HTTP 狀態碼回應,並顯示「沒有 ID 為 metadataId 的開發人員中繼資料」訊息。

要求

{
  "requests": [
    {
      "deleteDeveloperMetadata": {
        "dataFilter": {
          "developerMetadataLookup": {
            "metadataId": metadataId
          }
        }
      }
    }
  ]
}

回應

{
  "spreadsheetId": spreadsheetId,
  "replies": [
    {
      "deleteDeveloperMetadata": {
        "deletedDeveloperMetadata": [
          {
            "metadataId": metadataId,
            "metadataKey": "SalesUpdated",
            "metadataValue": "2022",
            "location": {
              "locationType": "SHEET",
              "sheetId": sheetId
            },
            "visibility": "DOCUMENT"
          }
        ]
      }
    }
  ]
}

讀取及寫入與中繼資料相關聯的值

您也可以指定相關聯的開發人員中繼資料和要更新的值,擷取及更新資料列和資料欄中的儲存格值。如要這麼做,請使用下列適當的方法和相符的 DataFilter

依中繼資料取得儲存格值

如要依中繼資料取得儲存格值,請使用 spreadsheets.values.batchGetByDataFilter 方法。您需要指定試算表 ID 和一或多個符合中繼資料的資料篩選器。

在本例中,我們會在要求中提供中繼資料 ID。回應會傳回中繼資料 ID 的資料列儲存格值 (型號、每月銷售量)。

要求

{
  "dataFilters": [
    {
      "developerMetadataLookup": {
        "metadataId": metadataId
      }
    }
  ],
  "majorDimension": "ROWS"
}

回應

{
  "spreadsheetId": spreadsheetId,
  "valueRanges": [
    {
      "valueRange": {
        "range": "Sheet7!A7:Z7",
        "majorDimension": "ROWS",
        "values": [
          [
            "W-24",
            "74"
          ]
        ]
      },
      "dataFilters": [
        {
          "developerMetadataLookup": {
            "metadataId": metadataId
          }
        }
      ]
    }
  ]
}

依中繼資料取得試算表

擷取試算表時,您可以使用 spreadsheets.getByDataFilter 方法傳回部分資料。您需要指定試算表 ID 和一或多個符合中繼資料的資料篩選器。

這項要求與一般「試算表 GET」要求的功能相同,但傳回的試算表、格線資料和其他含有中繼資料的物件資源,取決於指定資料篩選器比對的中繼資料清單。如果 includeGridData 設為 true,系統也會傳回與指定格線範圍相交的格線資料。

在本範例中,我們提供中繼資料 ID,並在要求中將 includeGridData 設為 false。回應會傳回試算表和工作表屬性。

要求

{
  "dataFilters": [
    {
      "developerMetadataLookup": {
        "metadataId": metadataId
      }
    }
  ],
  "includeGridData": false
}

回應

{
  "spreadsheetId": spreadsheetId,
  "properties": {
    "title": "Sales Sheet",
    "locale": "en_US",
    "autoRecalc": "ON_CHANGE",
    "timeZone": "America/Los_Angeles",
    "defaultFormat": {
      "backgroundColor": {
        "red": 1,
        "green": 1,
        "blue": 1
      },
      "padding": {
        "top": 2,
        "right": 3,
        "bottom": 2,
        "left": 3
      },
      "verticalAlignment": "BOTTOM",
      "wrapStrategy": "OVERFLOW_CELL",
      "textFormat": {
        "foregroundColor": {},
        "fontFamily": "arial,sans,sans-serif",
        "fontSize": 10,
        "bold": false,
        "italic": false,
        "strikethrough": false,
        "underline": false,
        "foregroundColorStyle": {
          "rgbColor": {}
        }
      },
      "backgroundColorStyle": {
        "rgbColor": {
          "red": 1,
          "green": 1,
          "blue": 1
        }
      }
    },
    "spreadsheetTheme": {
      "primaryFontFamily": "Arial",
      "themeColors": [
        {
          "colorType": "TEXT",
          "color": {
            "rgbColor": {}
          }
        },
        {
          "colorType": "BACKGROUND",
          "color": {
            "rgbColor": {
              "red": 1,
              "green": 1,
              "blue": 1
            }
          }
        },
        {
          "colorType": "ACCENT1",
          "color": {
            "rgbColor": {
              "red": 0.25882354,
              "green": 0.52156866,
              "blue": 0.95686275
            }
          }
        },
        {
          "colorType": "ACCENT2",
          "color": {
            "rgbColor": {
              "red": 0.91764706,
              "green": 0.2627451,
              "blue": 0.20784314
            }
          }
        },
        {
          "colorType": "ACCENT3",
          "color": {
            "rgbColor": {
              "red": 0.9843137,
              "green": 0.7372549,
              "blue": 0.015686275
            }
          }
        },
        {
          "colorType": "ACCENT4",
          "color": {
            "rgbColor": {
              "red": 0.20392157,
              "green": 0.65882355,
              "blue": 0.3254902
            }
          }
        },
        {
          "colorType": "ACCENT5",
          "color": {
            "rgbColor": {
              "red": 1,
              "green": 0.42745098,
              "blue": 0.003921569
            }
          }
        },
        {
          "colorType": "ACCENT6",
          "color": {
            "rgbColor": {
              "red": 0.27450982,
              "green": 0.7411765,
              "blue": 0.7764706
            }
          }
        },
        {
          "colorType": "LINK",
          "color": {
            "rgbColor": {
              "red": 0.06666667,
              "green": 0.33333334,
              "blue": 0.8
            }
          }
        }
      ]
    }
  },
  "sheets": [
    {
      "properties": {
        "sheetId": sheetId,
        "title": "Sheet7",
        "index": 7,
        "sheetType": "GRID",
        "gridProperties": {
          "rowCount": 1000,
          "columnCount": 26
        }
      }
    }
  ],
  "spreadsheetUrl": spreadsheetUrl
}

依中繼資料更新值

如要更新符合特定中繼資料的儲存格值,請使用 spreadsheets.values.batchUpdateByDataFilter 方法。您需要指定試算表 ID、valueInputOption,以及一或多個與中繼資料相符的 DataFilterValueRange

在本範例中,我們會在要求中提供中繼資料 ID 和更新的資料列值。回應會傳回中繼資料 ID 的更新屬性和資料。

要求

{
  "data": [
    {
      "dataFilter": {
        "developerMetadataLookup": {
          "metadataId": metadataId
        }
      },
      "majorDimension": "ROWS",
      "values": [
        [
          "W-24",
          "84"
        ]
      ]
    }
  ],
  "includeValuesInResponse": true,
  "valueInputOption": "USER_ENTERED"
}

回應

{
  "spreadsheetId": spreadsheetId,
  "totalUpdatedRows": 1,
  "totalUpdatedColumns": 2,
  "totalUpdatedCells": 2,
  "totalUpdatedSheets": 1,
  "responses": [
    {
      "updatedRange": "Sheet7!A7:B7",
      "updatedRows": 1,
      "updatedColumns": 2,
      "updatedCells": 2,
      "dataFilter": {
        "developerMetadataLookup": {
          "metadataId": metadataId
        }
      },
      "updatedData": {
        "range": "Sheet7!A7:Z7",
        "majorDimension": "ROWS",
        "values": [
          [
            "W-24",
            "84"
          ]
        ]
      }
    }
  ]
}

依中繼資料清除值

如要清除符合特定中繼資料的儲存格值,請使用 spreadsheets.values.batchClearByDataFilter 方法。您必須指定資料篩選器,才能選取要清除的中繼資料。

要求

在本例中,我們會在要求中提供中繼資料 ID。回應會傳回試算表 ID 和已清除的範圍。

{
  "dataFilters": [
    {
      "developerMetadataLookup": {
        "metadataId": metadataId
      }
    }
  ]
}

回應

{
  "spreadsheetId": spreadsheetId,
  "clearedRanges": [
    "Sheet7!A7:Z7"
  ]
}

中繼資料儲存空間限制

試算表可儲存的中繼資料總量設有限制。這項限制是以字元計算,由 2 個部分組成:

項目 分配儲存空間上限
試算表 30,000 個字元
試算表中的每個工作表 30,000 個字元

試算表最多可儲存 30,000 個字元。此外,每個試算表工作表最多可儲存 30,000 個字元 (工作表 1 為 30,000 個字元,工作表 2 為 30,000 個字元,依此類推)。因此,如果試算表有 3 個頁面,最多可包含 120,000 個字元的開發人員中繼資料。

每個字元都會計入限制,包括 developerMetadata 物件的鍵和值屬性。