讀取及寫入中繼資料

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

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

您可以產生中繼資料,執行下列作業:

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

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

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

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

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

讀取及寫入中繼資料

spreadsheets.developerMetadata 資源可存取試算表中與位置或物件相關聯的中繼資料。

關於中繼資料

本節說明使用 Google Sheets API 時應考量的一些重要中繼資料。

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

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

    • formResponseId = resp123 個資料列
    • lastUpdated = 1477369882 加上資料欄

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

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

    如果查詢未明確指定可見度,系統會傳回相符的文件中繼資料,以及發出要求的 Google Cloud 專案的相符專案中繼資料。

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

建立中繼資料

如要建立中繼資料,請對 spreadsheets 資源使用 batchUpdate 方法,並提供 CreateDeveloperMetadataRequest,其中包含來自 spreadsheets.developerMetadata 資源的 metadataKeylocationvisibility 值。您可以選擇指定 metadataValue 或明確的 metadataId

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

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

要求

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

回應

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

讀取單一中繼資料項目

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

要求

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

GET https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID/developerMetadata/METADATA_ID

回應

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

讀取多個中繼資料項目

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

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

要求

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

回應

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

更新中繼資料

如要更新開發人員中繼資料,請使用 spreadsheets.batchUpdate 方法,並提供 UpdateDeveloperMetadataRequest。您必須指定 DataFilter,以指定要更新的中繼資料;指定 spreadsheets.developerMetadata 資源,其中包含新值;並指定欄位遮罩,說明要更新的欄位。

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

要求

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

回應

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

刪除中繼資料

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

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

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

要求

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

回應

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

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

您也可以指定相關聯的開發人員中繼資料和要更新的值,擷取及更新資料列和資料欄中的儲存格值。如要執行這項操作,請使用下列其中一種方法,並搭配相符的 DataFilter

依中繼資料取得儲存格值

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

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

要求

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

回應

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

依中繼資料取得試算表

擷取試算表時,可以使用 spreadsheets.getByDataFilter 方法傳回資料子集。您必須指定試算表 ID 和一或多個與中繼資料相符的資料篩選器。

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

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

要求

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

回應

{
  "spreadsheetId": SPREADSHEET_ID,
  "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": SHEET_ID,
        "title": "Sheet7",
        "index": 7,
        "sheetType": "GRID",
        "gridProperties": {
          "rowCount": 1000,
          "columnCount": 26
        }
      }
    }
  ],
  "spreadsheetUrl": SPREADSHEET_URL
}

依中繼資料更新值

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

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

要求

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

回應

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

依中繼資料清除值

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

要求

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

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

回應

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

中繼資料儲存空間限制

試算表可儲存的中繼資料總量設有限制。 這項限制是以字元為單位,由下列兩部分組成:

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

試算表最多可儲存 30,000 個字元。此外,每個試算表中的每個工作表最多可儲存 30,000 個字元 (例如:第一個工作表 30,000 個字元、第二個工作表 30,000 個字元,依此類推)。因此,如果試算表有三個工作表,中繼資料最多可包含 120,000 個字元。

spreadsheets.developerMetadata 資源的 metadataKeymetadataValue 欄位中,每個字元都會計入這項限制。