From f69747077ecf7f6a2c89009fbac426233f869201 Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Fri, 15 Nov 2019 10:18:56 -0800 Subject: [PATCH 01/28] Add sheets_create() --- NAMESPACE | 5 +- R/schema_GridRange.R | 40 ++++++++ R/schema_NamedRange.R | 30 ++++++ R/schema_Sheet.R | 27 +++++ R/schema_SheetProperties.R | 43 ++++++++ R/schema_Spreadsheet.R | 164 +++++++++++++++++++++++++++++++ R/schema_SpreadsheetProperties.R | 38 +++++++ R/sheets_create.R | 43 ++++++++ R/sheets_get.R | 116 +--------------------- man/sheets_create.Rd | 48 +++++++++ man/sheets_get.Rd | 2 +- 11 files changed, 439 insertions(+), 117 deletions(-) create mode 100644 R/schema_GridRange.R create mode 100644 R/schema_NamedRange.R create mode 100644 R/schema_Sheet.R create mode 100644 R/schema_SheetProperties.R create mode 100644 R/schema_Spreadsheet.R create mode 100644 R/schema_SpreadsheetProperties.R create mode 100644 R/sheets_create.R create mode 100644 man/sheets_create.Rd diff --git a/NAMESPACE b/NAMESPACE index 54fea664a..871ffd827 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -11,8 +11,8 @@ S3method(ctype,SHEETS_CELL) S3method(ctype,character) S3method(ctype,default) S3method(ctype,list) -S3method(format,sheets_meta) -S3method(print,sheets_meta) +S3method(format,sheets_Spreadsheet) +S3method(print,sheets_Spreadsheet) export("%>%") export(anchored) export(as_sheets_id) @@ -27,6 +27,7 @@ export(sheets_auth) export(sheets_auth_configure) export(sheets_browse) export(sheets_cells) +export(sheets_create) export(sheets_deauth) export(sheets_endpoints) export(sheets_example) diff --git a/R/schema_GridRange.R b/R/schema_GridRange.R new file mode 100644 index 000000000..156690c72 --- /dev/null +++ b/R/schema_GridRange.R @@ -0,0 +1,40 @@ +# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#GridRange +new_GridRange <- function(sheetId, + startRowIndex, + endRowIndex, + startColumnIndex, + endColumnIndex) { + + x <- list( + sheetId = sheetId, + startRowIndex = startRowIndex, + endRowIndex = endRowIndex, + startColumnIndex = startColumnIndex, + endColumnIndex = endColumnIndex + ) + structure(x, class = "GridRange") +} + +validate_GridRange <- function(x) { + check_non_negative_integer(x$sheetId) + check_non_negative_integer(x$startRowIndex) + check_non_negative_integer(x$endRowIndex) + check_non_negative_integer(x$startColumnIndex) + check_non_negative_integer(x$endColumnIndex) + x +} + +GridRange <- function(sheetId, + startRowIndex, + endRowIndex, + startColumnIndex, + endColumnIndex) { + x <- new_GridRange( + sheetId = sheetId, + startRowIndex = startRowIndex, + endRowIndex = endRowIndex, + startColumnIndex = startColumnIndex, + endColumnIndex = endColumnIndex + ) + validate_GridRange(x) +} diff --git a/R/schema_NamedRange.R b/R/schema_NamedRange.R new file mode 100644 index 000000000..0a609ad17 --- /dev/null +++ b/R/schema_NamedRange.R @@ -0,0 +1,30 @@ +# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#NamedRange +new_NamedRange <- function(namedRangeId, + name, + range) { + x <- list( + namedRangeId = namedRangeId, + name = name, + range = range + ) + structure( + validate_NamedRange(x), + class = "NamedRange" + ) +} + +validate_NamedRange <- function(x) { + # I think read-only vs. required vs. optional status of these elements + # depends on what you're trying to do + maybe_string(x$namedRangeId, "namedRangeId") + maybe_string(x$name, "name") + + # range is an instance of GridRange + + x +} + +NamedRange <- function(...) { + x <- new_NamedRange(...) + compact(x) +} diff --git a/R/schema_Sheet.R b/R/schema_Sheet.R new file mode 100644 index 000000000..b02c573f8 --- /dev/null +++ b/R/schema_Sheet.R @@ -0,0 +1,27 @@ +# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#Sheet +new_Sheet <- function(properties = NULL, + data = NULL) { + # a Sheet object has MANY more elements, so I'm just starting with the ones + # I plan to use soon + x <- list( + properties = properties, + data = data + ) + structure(validate_Sheet(x), class = "Sheet") +} + +validate_Sheet <- function(x) { + if (!is.null(x$properties)) { + validate_SheetProperties(x) + } + + # data is an instance of GridData + + x +} + +Sheet <- function(...) { + x <- new_Sheet(...) + compact(x) +} + diff --git a/R/schema_SheetProperties.R b/R/schema_SheetProperties.R new file mode 100644 index 000000000..e408ae484 --- /dev/null +++ b/R/schema_SheetProperties.R @@ -0,0 +1,43 @@ +# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#SheetProperties +new_SheetProperties <- function(sheetId = NULL, + title = NULL, + index = NULL, + sheetType = NULL, + gridProperties = NULL, + hidden = NULL, + tabColor = NULL, + rightToLeft = NULL) { + x <- list( + sheetId = sheetId, + title = title, + index = index, + sheetType = sheetType, + gridProperties = gridProperties, + hidden = hidden, + tabColor = tabColor, + rightToLeft = rightToLeft + ) + structure(validate_SheetProperties(x), class = "SheetProperties") +} + +validate_SheetProperties <- function(x) { + maybe_non_negative_integer(x$sheetId, "sheetId") + maybe_string(x$title, "title") + maybe_non_negative_integer(x$index, "index") + maybe_string(x$sheetType, "sheetType") # enum + + # gridProperties is an instance of GridProperties + + maybe_bool(x$hidden, "hidden") + + # tabColor is an instance of Color + + maybe_bool(x$rightToLeft, "rightToLeft") + + x +} + +SheetProperties <- function(...) { + x <- new_SheetProperties(...) + compact(x) +} diff --git a/R/schema_Spreadsheet.R b/R/schema_Spreadsheet.R new file mode 100644 index 000000000..41a3a54ee --- /dev/null +++ b/R/schema_Spreadsheet.R @@ -0,0 +1,164 @@ +# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#Spreadsheet +new_Spreadsheet <- function(spreadsheetId = NULL, + properties = NULL, + sheets = NULL, + namedRanges = NULL, + spreadsheetUrl = NULL, + developerMetadata = NULL) { + x <- list( + spreadsheetId = spreadsheetId, + properties = properties, + sheets = sheets, + namedRanges = namedRanges, + spreadsheetUrl = spreadsheetUrl, + developerMetadata = developerMetadata + ) + structure( + validate_Spreadsheet(x), + class = "Spreadsheet" + ) +} + +validate_Spreadsheet <- function(x) { + maybe_string(x$spreadsheetId, "spreadsheetId") + + if (!is.null(x$properties)) { + validate_SpreadsheetProperties(x$properties) + } + + if (!is.null(x$sheets)) { + walk(x$sheets, validate_Sheet) + } + + if (!is.null(x$namedRanges)) { + walk(x$namedRanges, validate_NamedRange) + } + + maybe_string(x$spreadsheetUrl, "spreadsheetUrl") + + # developerMetadata is an instance of DeveloperMetadata + + x +} + +Spreadsheet <- function(...) { + x <- new_Spreadsheet(...) + compact(x) +} + +# input: instance of Spreadsheet, in the Sheets API sense, as a named list +# output: instance of sheets_Spreadsheet, which is how I want to hold this info +sheets_Spreadsheet <- function(x = list()) { + ours_theirs <- list( + spreadsheet_id = "spreadsheetId", + spreadsheet_url = "spreadsheetUrl", + name = list("properties", "title"), + locale = list("properties", "locale"), + time_zone = list("properties", "timeZone") + ) + out <- map(ours_theirs, ~ pluck(x, !!!.x)) + + if (!is.null(x$sheets)) { + # TODO: refactor in terms of a to-be-created sheets_Sheet()? changes the + # angle of attack to Sheet-wise, whereas here I work property-wise + p <- map(x$sheets, "properties") + out$sheets <- tibble::tibble( + # TODO: open question whether I should explicitly unescape here + name = map_chr(p, "title"), + index = map_int(p, "index"), + id = map_chr(p, "sheetId"), + type = map_chr(p, "sheetType"), + visible = !map_lgl(p, "hidden", .default = FALSE), + # TODO: refactor in terms of methods created around GridData? + grid_rows = map_int(p, c("gridProperties", "rowCount"), .default = NA), + grid_columns = map_int(p, c("gridProperties", "columnCount"), .default = NA) + ) + } + + if (!is.null(x$namedRanges)) { + # TODO: refactor in terms of a to-be-created sheets_NamedRange()? changes + # the angle of attack to NamedRange-wise, whereas here I work column-wise + nr <- x$namedRanges + out$named_ranges <- tibble::tibble( + name = map_chr(nr, "name"), + range = NA_character_, + id = map_chr(nr, "namedRangeId"), + # if there is only 1 sheet, sheetId might not be sent! + # https://github.com/tidyverse/googlesheets4/issues/29 + sheet_id = map_chr(nr, c("range", "sheetId"), .default = NA), + sheet_name = NA_character_, + # TODO: extract into functions re: GridRange? + ## API sends zero-based row and column + ## => we add one + ## API indices are half-open, i.e. [start, end) + ## => we substract one from end_[row|column] + ## net effect + ## => we add one to start_[row|column] but not to end_[row|column] + start_row = map_int(nr, c("range", "startRowIndex"), .default = NA) + 1L, + end_row = map_int(nr, c("range", "endRowIndex"), .default = NA), + start_column = map_int(nr, c("range", "startColumnIndex"), .default = NA) + 1L, + end_column = map_int(nr, c("range", "endColumnIndex"), .default = NA) + ) + no_sheet <- is.na(out$named_ranges$sheet_id) + if (any(no_sheet)) { + # if no associated sheetId, assume it's the first (only?) sheet + # https://github.com/tidyverse/googlesheets4/issues/29 + out$named_ranges$sheet_id[no_sheet] <- out$sheets$id[[1]] + } + out$named_ranges$sheet_name <- vlookup( + out$named_ranges$sheet_id, + data = out$sheets, + key = "id", + value = "name" + ) + out$named_ranges$range <- pmap_chr(out$named_ranges, make_range) + } + + structure(out, class = c("sheets_Spreadsheet", "list")) +} + +#' @export +format.sheets_Spreadsheet <- function(x, ...) { + + meta <- glue_data( + x, + " + Spreadsheet name: {name} + ID: {spreadsheet_id} + Locale: {locale} + Time zone: {time_zone} + # of sheets: {nrow(x$sheets)} + ", + .sep = "\n" + ) + meta <- strsplit(meta, split = "\n")[[1]] + + col1 <- fr(c("(Sheet name)", x$sheets$name)) + col2 <- c( + "(Nominal extent in rows x columns)", + glue_data(x$sheets, "{grid_rows} x {grid_columns}") + ) + meta <- c( + meta, + "", + glue_data(list(col1 = col1, col2 = col2), "{col1}: {col2}") + ) + + if (!is.null(x$named_ranges)) { + col1 <- fr(c("(Named range)", x$named_ranges$name)) + col2 <- fl(c("(A1 range)", x$named_ranges$range)) + meta <- c( + meta, + "", + glue_data(list(col1 = col1, col2 = col2), "{col1}: {col2}") + ) + } + + meta +} + +#' @export +print.sheets_Spreadsheet <- function(x, ...) { + cat(format(x), sep = "\n") + invisible(x) +} diff --git a/R/schema_SpreadsheetProperties.R b/R/schema_SpreadsheetProperties.R new file mode 100644 index 000000000..bb83c778b --- /dev/null +++ b/R/schema_SpreadsheetProperties.R @@ -0,0 +1,38 @@ +# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#SpreadsheetProperties +new_SpreadsheetProperties <- function(title, + locale = NULL, + autoRecalc = NULL, + timeZone = NULL, + defaultFormat = NULL, + iterativeCalculationSettings = NULL) { + x <- list( + title = title, + locale = locale, + autoRecalc = autoRecalc, + timeZone = timeZone, + defaultFormat = defaultFormat, + iterativeCalculationSettings = iterativeCalculationSettings + ) + structure( + validate_SpreadsheetProperties(x), + class = "SpreadsheetProperties" + ) +} + +validate_SpreadsheetProperties <- function(x) { + check_string(x$title, "title") + + maybe_string(x$locale, "locale") + maybe_string(x$locale, "autoRecalc") # enum + maybe_string(x$timeZone, "timeZone") + + # defaultFormat is an instance of CellFormat + # iterativeCalculationSettings is an instance of IterativeCalculationSettings + + x +} + +SpreadsheetProperties <- function(title, ...) { + x <- new_SpreadsheetProperties(title = title, ...) + compact(x) +} diff --git a/R/sheets_create.R b/R/sheets_create.R new file mode 100644 index 000000000..670d9b2c2 --- /dev/null +++ b/R/sheets_create.R @@ -0,0 +1,43 @@ +#' Create a new Sheet +#' +#' Creates an entirely new Sheet (spreadsheet or workbook). Offers some control +#' over the initial set of sheets (worksheets or tabs). +#' +#' @seealso Wraps the `spreadsheets.create` endpoint: +#' * +#' +#' @param title The title of the spreadsheet. +#' @param ... Optional spreadsheet properties that can be set through this API +#' endpoint, such as locale and time zone. +#' @param sheets Optional something something about the sheets. Will this just +#' offer control over names? Alternatively there could be an interface that +#' supports specifying data here. +#' +#' @inherit sheets_get return +#' @export +#' +#' @examples +#' if (sheets_has_token()) { +#' sheets_create("sheets-create-demo-1") +#' +#' sheets_create("sheets-create-demo-2", locale = "en_CA") +#' +#' sheets_create( +#' "sheets-create-demo-3", +#' locale = "fr_FR", +#' timeZone = "Europe/Paris" +#' ) +#' } +sheets_create <- function(title, ..., sheets = NULL) { + req <- request_generate( + "sheets.spreadsheets.create", + params = Spreadsheet( + properties = SpreadsheetProperties( + title = title, + ...) + ) + ) + raw_resp <- request_make(req) + resp <- gargle::response_process(raw_resp) + sheets_Spreadsheet(resp) +} diff --git a/R/sheets_get.R b/R/sheets_get.R index 29018cbd9..113c70c8c 100644 --- a/R/sheets_get.R +++ b/R/sheets_get.R @@ -10,7 +10,7 @@ #' @inheritParams read_sheet #' #' @return -#' * `sheets_get()`: A list with S3 class `sheets_meta`, for printing +#' * `sheets_get()`: A list with S3 class `sheets_Spreadsheet`, for printing #' purposes. #' * `sheets_sheets()`: A character vector. #' @export @@ -21,7 +21,7 @@ #' } sheets_get <- function(ss) { resp <- sheets_get_impl_(as_sheets_id(ss)) - sheets_spreadsheet(resp) + sheets_Spreadsheet(resp) } #' @export @@ -50,115 +50,3 @@ sheets_get_impl_ <- function(ssid, raw_resp <- request_make(req) gargle::response_process(raw_resp) } - -## input: an instance of Spreadsheet -## https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#Spreadsheet -## output: a list with S3 class `sheets_meta` -sheets_spreadsheet <- function(x = list()) { - ours_theirs <- list( - spreadsheet_id = "spreadsheetId", - spreadsheet_url = "spreadsheetUrl", - name = list("properties", "title"), - locale = list("properties", "locale"), - time_zone = list("properties", "timeZone") - ) - out <- map(ours_theirs, ~ pluck(x, !!!.x)) - - if (!is.null(x$sheets)) { - p <- map(x$sheets, "properties") - out$sheets <- tibble::tibble( - # TODO: open question whether I should explicitly unescape here - name = map_chr(p, "title"), - index = map_int(p, "index"), - id = map_chr(p, "sheetId"), - type = map_chr(p, "sheetType"), - visible = !map_lgl(p, "hidden", .default = FALSE), - grid_rows = map_int(p, c("gridProperties", "rowCount"), .default = NA), - grid_columns = map_int(p, c("gridProperties", "columnCount"), .default = NA) - ) - } - - if (!is.null(x$namedRanges)) { - nr <- x$namedRanges - out$named_ranges <- tibble::tibble( - name = map_chr(nr, "name"), - range = NA_character_, - id = map_chr(nr, "namedRangeId"), - # if there is only 1 sheet, sheetId might not be sent! - # https://github.com/tidyverse/googlesheets4/issues/29 - sheet_id = map_chr(nr, c("range", "sheetId"), .default = NA), - sheet_name = NA_character_, - ## API sends zero-based row and column - ## => we add one - ## API indices are half-open, i.e. [start, end) - ## => we substract one from end_[row|column] - ## net effect - ## => we add one to start_[row|column] but not to end_[row|column] - start_row = map_int(nr, c("range", "startRowIndex"), .default = NA) + 1L, - end_row = map_int(nr, c("range", "endRowIndex"), .default = NA), - start_column = map_int(nr, c("range", "startColumnIndex"), .default = NA) + 1L, - end_column = map_int(nr, c("range", "endColumnIndex"), .default = NA) - ) - no_sheet <- is.na(out$named_ranges$sheet_id) - if (any(no_sheet)) { - # if no associated sheetId, assume it's the first (only?) sheet - # https://github.com/tidyverse/googlesheets4/issues/29 - out$named_ranges$sheet_id[no_sheet] <- out$sheets$id[[1]] - } - out$named_ranges$sheet_name <- vlookup( - out$named_ranges$sheet_id, - data = out$sheets, - key = "id", - value = "name" - ) - out$named_ranges$range <- purrr::pmap_chr(out$named_ranges, make_range) - } - - structure(out, class = c("sheets_meta", "list")) -} - -#' @export -format.sheets_meta <- function(x, ...) { - - meta <- glue_data( - x, - " - Spreadsheet name: {name} - ID: {spreadsheet_id} - Locale: {locale} - Time zone: {time_zone} - # of sheets: {nrow(x$sheets)} - ", - .sep = "\n" - ) - meta <- strsplit(meta, split = "\n")[[1]] - - col1 <- fr(c("(Sheet name)", x$sheets$name)) - col2 <- c( - "(Nominal extent in rows x columns)", - glue_data(x$sheets, "{grid_rows} x {grid_columns}") - ) - meta <- c( - meta, - "", - glue_data(list(col1 = col1, col2 = col2), "{col1}: {col2}") - ) - - if (!is.null(x$named_ranges)) { - col1 <- fr(c("(Named range)", x$named_ranges$name)) - col2 <- fl(c("(A1 range)", x$named_ranges$range)) - meta <- c( - meta, - "", - glue_data(list(col1 = col1, col2 = col2), "{col1}: {col2}") - ) - } - - meta -} - -#' @export -print.sheets_meta <- function(x, ...) { - cat(format(x), sep = "\n") - invisible(x) -} diff --git a/man/sheets_create.Rd b/man/sheets_create.Rd new file mode 100644 index 000000000..597eef160 --- /dev/null +++ b/man/sheets_create.Rd @@ -0,0 +1,48 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/sheets_create.R +\name{sheets_create} +\alias{sheets_create} +\title{Create a new Sheet} +\usage{ +sheets_create(title, ..., sheets = NULL) +} +\arguments{ +\item{title}{The title of the spreadsheet.} + +\item{...}{Optional spreadsheet properties that can be set through this API +endpoint, such as locale and time zone.} + +\item{sheets}{Optional something something about the sheets. Will this just +offer control over names? Alternatively there could be an interface that +supports specifying data here.} +} +\value{ +\itemize{ +\item \code{sheets_get()}: A list with S3 class \code{sheets_Spreadsheet}, for printing +purposes. +\item \code{sheets_sheets()}: A character vector. +} +} +\description{ +Creates an entirely new Sheet (spreadsheet or workbook). Offers some control +over the initial set of sheets (worksheets or tabs). +} +\examples{ +if (sheets_has_token()) { + sheets_create("sheets-create-demo-1") + + sheets_create("sheets-create-demo-2", locale = "en_CA") + + sheets_create( + "sheets-create-demo-3", + locale = "fr_FR", + timeZone = "Europe/Paris" + ) +} +} +\seealso{ +Wraps the \code{spreadsheets.create} endpoint: +\itemize{ +\item \url{https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/create} +} +} diff --git a/man/sheets_get.Rd b/man/sheets_get.Rd index 62989a3eb..b83a93248 100644 --- a/man/sheets_get.Rd +++ b/man/sheets_get.Rd @@ -17,7 +17,7 @@ is how googledrive represents Drive files. Processed through } \value{ \itemize{ -\item \code{sheets_get()}: A list with S3 class \code{sheets_meta}, for printing +\item \code{sheets_get()}: A list with S3 class \code{sheets_Spreadsheet}, for printing purposes. \item \code{sheets_sheets()}: A character vector. } From 8028dfbcb66f017f76cfa60edeca4cf4505ffcc2 Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Fri, 15 Nov 2019 11:12:56 -0800 Subject: [PATCH 02/28] GridRange has been implemented --- R/schema_NamedRange.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/schema_NamedRange.R b/R/schema_NamedRange.R index 0a609ad17..f4db82670 100644 --- a/R/schema_NamedRange.R +++ b/R/schema_NamedRange.R @@ -19,7 +19,7 @@ validate_NamedRange <- function(x) { maybe_string(x$namedRangeId, "namedRangeId") maybe_string(x$name, "name") - # range is an instance of GridRange + validate_GridRange(x$range) x } From 4cf25b44c8a50f45903ae4f139357d2d1afd0204 Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Fri, 15 Nov 2019 16:55:27 -0800 Subject: [PATCH 03/28] More minimalist S3 treatment of the schemas --- R/schema_GridRange.R | 29 ++------------------- R/schema_NamedRange.R | 27 +++----------------- R/schema_Sheet.R | 26 ++++--------------- R/schema_SheetProperties.R | 40 +++++++---------------------- R/schema_Spreadsheet.R | 44 +++++--------------------------- R/schema_SpreadsheetProperties.R | 35 +++++-------------------- 6 files changed, 34 insertions(+), 167 deletions(-) diff --git a/R/schema_GridRange.R b/R/schema_GridRange.R index 156690c72..c2590c683 100644 --- a/R/schema_GridRange.R +++ b/R/schema_GridRange.R @@ -1,40 +1,15 @@ # https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#GridRange -new_GridRange <- function(sheetId, - startRowIndex, - endRowIndex, - startColumnIndex, - endColumnIndex) { - - x <- list( - sheetId = sheetId, - startRowIndex = startRowIndex, - endRowIndex = endRowIndex, - startColumnIndex = startColumnIndex, - endColumnIndex = endColumnIndex - ) - structure(x, class = "GridRange") -} - -validate_GridRange <- function(x) { - check_non_negative_integer(x$sheetId) - check_non_negative_integer(x$startRowIndex) - check_non_negative_integer(x$endRowIndex) - check_non_negative_integer(x$startColumnIndex) - check_non_negative_integer(x$endColumnIndex) - x -} - GridRange <- function(sheetId, startRowIndex, endRowIndex, startColumnIndex, endColumnIndex) { - x <- new_GridRange( + x <- list( sheetId = sheetId, startRowIndex = startRowIndex, endRowIndex = endRowIndex, startColumnIndex = startColumnIndex, endColumnIndex = endColumnIndex ) - validate_GridRange(x) + structure(x, class = "GridRange") } diff --git a/R/schema_NamedRange.R b/R/schema_NamedRange.R index f4db82670..fe2f3b996 100644 --- a/R/schema_NamedRange.R +++ b/R/schema_NamedRange.R @@ -1,30 +1,11 @@ # https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#NamedRange -new_NamedRange <- function(namedRangeId, - name, - range) { +NamedRange <- function(namedRangeId, + name, + range) { x <- list( namedRangeId = namedRangeId, name = name, range = range ) - structure( - validate_NamedRange(x), - class = "NamedRange" - ) -} - -validate_NamedRange <- function(x) { - # I think read-only vs. required vs. optional status of these elements - # depends on what you're trying to do - maybe_string(x$namedRangeId, "namedRangeId") - maybe_string(x$name, "name") - - validate_GridRange(x$range) - - x -} - -NamedRange <- function(...) { - x <- new_NamedRange(...) - compact(x) + structure(x, class = "NamedRange") } diff --git a/R/schema_Sheet.R b/R/schema_Sheet.R index b02c573f8..844313dae 100644 --- a/R/schema_Sheet.R +++ b/R/schema_Sheet.R @@ -1,27 +1,11 @@ # https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#Sheet -new_Sheet <- function(properties = NULL, - data = NULL) { - # a Sheet object has MANY more elements, so I'm just starting with the ones - # I plan to use soon +Sheet <- function(properties = NULL, + data = NULL) { + # an instance of Sheet potentially has MANY more fields + # I'm just starting with the ones I plan to use soon x <- list( properties = properties, data = data ) - structure(validate_Sheet(x), class = "Sheet") + structure(x, class = "Sheet") } - -validate_Sheet <- function(x) { - if (!is.null(x$properties)) { - validate_SheetProperties(x) - } - - # data is an instance of GridData - - x -} - -Sheet <- function(...) { - x <- new_Sheet(...) - compact(x) -} - diff --git a/R/schema_SheetProperties.R b/R/schema_SheetProperties.R index e408ae484..85f0f686b 100644 --- a/R/schema_SheetProperties.R +++ b/R/schema_SheetProperties.R @@ -1,12 +1,12 @@ # https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#SheetProperties -new_SheetProperties <- function(sheetId = NULL, - title = NULL, - index = NULL, - sheetType = NULL, - gridProperties = NULL, - hidden = NULL, - tabColor = NULL, - rightToLeft = NULL) { +SheetProperties <- function(sheetId = NULL, + title = NULL, + index = NULL, + sheetType = NULL, + gridProperties = NULL, + hidden = NULL, + tabColor = NULL, + rightToLeft = NULL) { x <- list( sheetId = sheetId, title = title, @@ -17,27 +17,5 @@ new_SheetProperties <- function(sheetId = NULL, tabColor = tabColor, rightToLeft = rightToLeft ) - structure(validate_SheetProperties(x), class = "SheetProperties") -} - -validate_SheetProperties <- function(x) { - maybe_non_negative_integer(x$sheetId, "sheetId") - maybe_string(x$title, "title") - maybe_non_negative_integer(x$index, "index") - maybe_string(x$sheetType, "sheetType") # enum - - # gridProperties is an instance of GridProperties - - maybe_bool(x$hidden, "hidden") - - # tabColor is an instance of Color - - maybe_bool(x$rightToLeft, "rightToLeft") - - x -} - -SheetProperties <- function(...) { - x <- new_SheetProperties(...) - compact(x) + structure(x, class = "SheetProperties") } diff --git a/R/schema_Spreadsheet.R b/R/schema_Spreadsheet.R index 41a3a54ee..168697979 100644 --- a/R/schema_Spreadsheet.R +++ b/R/schema_Spreadsheet.R @@ -1,10 +1,10 @@ # https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#Spreadsheet -new_Spreadsheet <- function(spreadsheetId = NULL, - properties = NULL, - sheets = NULL, - namedRanges = NULL, - spreadsheetUrl = NULL, - developerMetadata = NULL) { +Spreadsheet <- function(spreadsheetId = NULL, + properties = NULL, + sheets = NULL, + namedRanges = NULL, + spreadsheetUrl = NULL, + developerMetadata = NULL) { x <- list( spreadsheetId = spreadsheetId, properties = properties, @@ -13,37 +13,7 @@ new_Spreadsheet <- function(spreadsheetId = NULL, spreadsheetUrl = spreadsheetUrl, developerMetadata = developerMetadata ) - structure( - validate_Spreadsheet(x), - class = "Spreadsheet" - ) -} - -validate_Spreadsheet <- function(x) { - maybe_string(x$spreadsheetId, "spreadsheetId") - - if (!is.null(x$properties)) { - validate_SpreadsheetProperties(x$properties) - } - - if (!is.null(x$sheets)) { - walk(x$sheets, validate_Sheet) - } - - if (!is.null(x$namedRanges)) { - walk(x$namedRanges, validate_NamedRange) - } - - maybe_string(x$spreadsheetUrl, "spreadsheetUrl") - - # developerMetadata is an instance of DeveloperMetadata - - x -} - -Spreadsheet <- function(...) { - x <- new_Spreadsheet(...) - compact(x) + structure(x, class = "Spreadsheet") } # input: instance of Spreadsheet, in the Sheets API sense, as a named list diff --git a/R/schema_SpreadsheetProperties.R b/R/schema_SpreadsheetProperties.R index bb83c778b..5ac124f17 100644 --- a/R/schema_SpreadsheetProperties.R +++ b/R/schema_SpreadsheetProperties.R @@ -1,10 +1,10 @@ # https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#SpreadsheetProperties -new_SpreadsheetProperties <- function(title, - locale = NULL, - autoRecalc = NULL, - timeZone = NULL, - defaultFormat = NULL, - iterativeCalculationSettings = NULL) { +SpreadsheetProperties <- function(title, + locale = NULL, + autoRecalc = NULL, + timeZone = NULL, + defaultFormat = NULL, + iterativeCalculationSettings = NULL) { x <- list( title = title, locale = locale, @@ -13,26 +13,5 @@ new_SpreadsheetProperties <- function(title, defaultFormat = defaultFormat, iterativeCalculationSettings = iterativeCalculationSettings ) - structure( - validate_SpreadsheetProperties(x), - class = "SpreadsheetProperties" - ) -} - -validate_SpreadsheetProperties <- function(x) { - check_string(x$title, "title") - - maybe_string(x$locale, "locale") - maybe_string(x$locale, "autoRecalc") # enum - maybe_string(x$timeZone, "timeZone") - - # defaultFormat is an instance of CellFormat - # iterativeCalculationSettings is an instance of IterativeCalculationSettings - - x -} - -SpreadsheetProperties <- function(title, ...) { - x <- new_SpreadsheetProperties(title = title, ...) - compact(x) + structure(x, class = "SpreadsheetProperties") } From 7ee9e43d8ba98b3f59d62cc3a4018ccf932bc5fd Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Mon, 18 Nov 2019 21:22:41 -0800 Subject: [PATCH 04/28] Mostly I need to turn some of these into tibbles --- R/rectangle.R | 12 ++++++++++++ R/schema_Sheet.R | 8 +++++++- R/schema_SheetProperties.R | 22 +++++++++++++++++++--- R/schema_Spreadsheet.R | 19 ++++--------------- R/schema_SpreadsheetProperties.R | 8 ++++---- R/sheets_create.R | 10 +++++----- R/utils.R | 3 +++ man/sheets_create.Rd | 4 ++-- 8 files changed, 56 insertions(+), 30 deletions(-) create mode 100644 R/rectangle.R diff --git a/R/rectangle.R b/R/rectangle.R new file mode 100644 index 000000000..17402b463 --- /dev/null +++ b/R/rectangle.R @@ -0,0 +1,12 @@ +# low-tech typed version of tidyr::hoist() that is "list in, vector out" +hoist_lgl <- function(.x, ..., .default = NA) { + map_lgl(.x, ..., .default = .default) +} + +hoist_chr <- function(.x, ..., .default = NA) { + map_chr(.x, ..., .default = .default) +} + +hoist_int <- function(.x, ..., .default = NA) { + map_int(.x, ..., .default = .default) +} diff --git a/R/schema_Sheet.R b/R/schema_Sheet.R index 844313dae..12f750c42 100644 --- a/R/schema_Sheet.R +++ b/R/schema_Sheet.R @@ -1,5 +1,5 @@ # https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#Sheet -Sheet <- function(properties = NULL, +Sheet <- function(properties = SheetProperties(), data = NULL) { # an instance of Sheet potentially has MANY more fields # I'm just starting with the ones I plan to use soon @@ -9,3 +9,9 @@ Sheet <- function(properties = NULL, ) structure(x, class = "Sheet") } + +tibblify_Sheet <- function(x) { + out <- tibblify_SheetProperties(do.call(SheetProperties, x$properties)) + # TODO: come back to deal with `data` + tibble::add_column(out, data = list(NULL)) +} diff --git a/R/schema_SheetProperties.R b/R/schema_SheetProperties.R index 85f0f686b..2a0ad7a73 100644 --- a/R/schema_SheetProperties.R +++ b/R/schema_SheetProperties.R @@ -11,11 +11,27 @@ SheetProperties <- function(sheetId = NULL, sheetId = sheetId, title = title, index = index, - sheetType = sheetType, - gridProperties = gridProperties, + sheetType = sheetType, # enum + gridProperties = gridProperties, # unimplemented schema hidden = hidden, - tabColor = tabColor, + tabColor = tabColor, # schema rightToLeft = rightToLeft ) structure(x, class = "SheetProperties") } + +tibblify_SheetProperties <- function(x) { + # weird-looking workaround for the (current) lack of typed pluck() + # revisit this when I depend on vctrs directly + x <- list(x) + tibble::tibble( + # TODO: open question whether I should explicitly unescape title here + name = hoist_chr(x, "title"), + index = hoist_int(x, "index"), + id = hoist_int(x, "sheetId"), + type = hoist_chr(x, "sheetType"), + visible = !hoist_lgl(x, "hidden", .default = FALSE), + grid_rows = hoist_int(x, c("gridProperties", "rowCount")), + grid_columns = hoist_int(x, c("gridProperties", "columnCount")) + ) +} diff --git a/R/schema_Spreadsheet.R b/R/schema_Spreadsheet.R index 168697979..fef6fe03e 100644 --- a/R/schema_Spreadsheet.R +++ b/R/schema_Spreadsheet.R @@ -1,6 +1,6 @@ # https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#Spreadsheet Spreadsheet <- function(spreadsheetId = NULL, - properties = NULL, + properties = SpreadsheetProperties(), sheets = NULL, namedRanges = NULL, spreadsheetUrl = NULL, @@ -29,20 +29,9 @@ sheets_Spreadsheet <- function(x = list()) { out <- map(ours_theirs, ~ pluck(x, !!!.x)) if (!is.null(x$sheets)) { - # TODO: refactor in terms of a to-be-created sheets_Sheet()? changes the - # angle of attack to Sheet-wise, whereas here I work property-wise - p <- map(x$sheets, "properties") - out$sheets <- tibble::tibble( - # TODO: open question whether I should explicitly unescape here - name = map_chr(p, "title"), - index = map_int(p, "index"), - id = map_chr(p, "sheetId"), - type = map_chr(p, "sheetType"), - visible = !map_lgl(p, "hidden", .default = FALSE), - # TODO: refactor in terms of methods created around GridData? - grid_rows = map_int(p, c("gridProperties", "rowCount"), .default = NA), - grid_columns = map_int(p, c("gridProperties", "columnCount"), .default = NA) - ) + sheets <- map(x$sheets, ~ do.call(Sheet, .x)) + sheets <- map(sheets, tibblify_Sheet) + out$sheets <- do.call(rbind, sheets) } if (!is.null(x$namedRanges)) { diff --git a/R/schema_SpreadsheetProperties.R b/R/schema_SpreadsheetProperties.R index 5ac124f17..9d8174e91 100644 --- a/R/schema_SpreadsheetProperties.R +++ b/R/schema_SpreadsheetProperties.R @@ -8,10 +8,10 @@ SpreadsheetProperties <- function(title, x <- list( title = title, locale = locale, - autoRecalc = autoRecalc, + autoRecalc = autoRecalc, # enum timeZone = timeZone, - defaultFormat = defaultFormat, - iterativeCalculationSettings = iterativeCalculationSettings + defaultFormat = defaultFormat, # unimplemented schema + iterativeCalculationSettings = iterativeCalculationSettings # unimplemented schema ) - structure(x, class = "SpreadsheetProperties") + structure(x, class = c("SpreadsheetProperties", "list")) } diff --git a/R/sheets_create.R b/R/sheets_create.R index 670d9b2c2..8d4da40f0 100644 --- a/R/sheets_create.R +++ b/R/sheets_create.R @@ -6,7 +6,7 @@ #' @seealso Wraps the `spreadsheets.create` endpoint: #' * #' -#' @param title The title of the spreadsheet. +#' @param name The name of the spreadsheet. #' @param ... Optional spreadsheet properties that can be set through this API #' endpoint, such as locale and time zone. #' @param sheets Optional something something about the sheets. Will this just @@ -28,13 +28,13 @@ #' timeZone = "Europe/Paris" #' ) #' } -sheets_create <- function(title, ..., sheets = NULL) { +sheets_create <- function(name, ..., sheets = NULL) { + # TODO: do I care that this loses the SpreadsheetProperties class? + ss_props <- compact(SpreadsheetProperties(title = name, ...)) req <- request_generate( "sheets.spreadsheets.create", params = Spreadsheet( - properties = SpreadsheetProperties( - title = title, - ...) + properties = ss_props ) ) raw_resp <- request_make(req) diff --git a/R/utils.R b/R/utils.R index 0a1edd385..ec06bcd31 100644 --- a/R/utils.R +++ b/R/utils.R @@ -1,5 +1,8 @@ `%NA%` <- function(x, y) if (is.na(x)) y else x +# for development only +str1 <- function(x, ...) utils::str(x, ..., max.level = 1) + noNA <- Negate(anyNA) allNA <- function(x) all(is.na(x)) notNA <- Negate(is.na) diff --git a/man/sheets_create.Rd b/man/sheets_create.Rd index 597eef160..04fef0db3 100644 --- a/man/sheets_create.Rd +++ b/man/sheets_create.Rd @@ -4,10 +4,10 @@ \alias{sheets_create} \title{Create a new Sheet} \usage{ -sheets_create(title, ..., sheets = NULL) +sheets_create(name, ..., sheets = NULL) } \arguments{ -\item{title}{The title of the spreadsheet.} +\item{name}{The name of the spreadsheet.} \item{...}{Optional spreadsheet properties that can be set through this API endpoint, such as locale and time zone.} From 05b1f2c6c288c56ba953289263e36159062a6b4a Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Tue, 19 Nov 2019 14:09:54 -0800 Subject: [PATCH 05/28] Import transpose --- NAMESPACE | 1 + R/googlesheets4-package.R | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/NAMESPACE b/NAMESPACE index 871ffd827..31805e397 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -64,4 +64,5 @@ importFrom(purrr,modify_if) importFrom(purrr,pluck) importFrom(purrr,pmap_chr) importFrom(purrr,set_names) +importFrom(purrr,transpose) importFrom(purrr,walk) diff --git a/R/googlesheets4-package.R b/R/googlesheets4-package.R index 9b9b6994b..e101fc157 100644 --- a/R/googlesheets4-package.R +++ b/R/googlesheets4-package.R @@ -1,4 +1,4 @@ #' @keywords internal #' @importFrom purrr %||% map_lgl map_int map_dbl map_chr map map2 pluck walk -#' pmap_chr set_names discard keep flatten modify_if compact +#' pmap_chr set_names discard keep flatten modify_if compact transpose "_PACKAGE" From 11041717c69af3d25f2343b165b66657436c19cb Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Tue, 19 Nov 2019 14:10:17 -0800 Subject: [PATCH 06/28] It's ugly but it works --- R/schema_Sheet.R | 62 ++++++++++++++++++++++++++++++++++++++ R/schema_SheetProperties.R | 2 +- R/sheets_create.R | 20 ++++++++++-- 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/R/schema_Sheet.R b/R/schema_Sheet.R index 12f750c42..0412f89c6 100644 --- a/R/schema_Sheet.R +++ b/R/schema_Sheet.R @@ -15,3 +15,65 @@ tibblify_Sheet <- function(x) { # TODO: come back to deal with `data` tibble::add_column(out, data = list(NULL)) } + +#' @export +as_Sheet <- function(df, name) { + UseMethod("as_Sheet") +} + +as_Sheet.default <- function(df, name) { + stop_glue( + "Don't know how to make an instance of {bt('Sheet')} from something of ", + "class {class_collapse(x)}." + ) +} + +as_Sheet.tibble <- function(df, name) { + NextMethod() +} + +as_Sheet.data.frame <- function(df, name) { + check_string(name) + compact(Sheet( + properties = compact(SheetProperties( + title = name, + # TODO: not making room for col_names here yet + gridProperties = list(rowCount = nrow(df), columnCount = ncol(df)) + )), + data = list( # an array of instances of GridData + list( + rowData = as_RowData(df) # an array of instances of RowData + ) + ) + )) +} + +as_RowData <- function(df) { + df_rows <- transpose(df) + make_row <- function(x) { + map(x, ~ list(userEnteredValue = list(stringValue = as.character(.x)))) + } + map(df_rows, ~ list(values = make_row(unname(.x)))) + # list( + # list( # row 1 + # values = list( + # list( # row 1 cell 1 + # userEnteredValue = list(stringValue = "A1") + # ), + # list( # row 1 cell 2 + # userEnteredValue = list(stringValue = "B1") + # ) + # ) + # ), + # list( # row 2 + # values = list( + # list( # row 2 cell 1 + # userEnteredValue = list(stringValue = "A2") + # ), + # list( # row 2 cell 2 + # userEnteredValue = list(stringValue = "B2") + # ) + # ) + # ) + # ) +} diff --git a/R/schema_SheetProperties.R b/R/schema_SheetProperties.R index 2a0ad7a73..687d59340 100644 --- a/R/schema_SheetProperties.R +++ b/R/schema_SheetProperties.R @@ -17,7 +17,7 @@ SheetProperties <- function(sheetId = NULL, tabColor = tabColor, # schema rightToLeft = rightToLeft ) - structure(x, class = "SheetProperties") + structure(x, class = c("SheetProperties", "list")) } tibblify_SheetProperties <- function(x) { diff --git a/R/sheets_create.R b/R/sheets_create.R index 8d4da40f0..f8ec97b67 100644 --- a/R/sheets_create.R +++ b/R/sheets_create.R @@ -31,11 +31,25 @@ sheets_create <- function(name, ..., sheets = NULL) { # TODO: do I care that this loses the SpreadsheetProperties class? ss_props <- compact(SpreadsheetProperties(title = name, ...)) + # ss_sheets <- list( + # new_Sheet(iris, "yo"), + # compact(Sheet( + # properties = compact(SheetProperties( + # title = "foofy", + # gridProperties = list(rowCount = 3, columnCount = 5) + # )) + # )) + # ) + ss_sheets <- NULL + if (!is.null(sheets)) { + ss_sheets <- unname(purrr::imap(sheets, as_Sheet)) + } req <- request_generate( "sheets.spreadsheets.create", - params = Spreadsheet( - properties = ss_props - ) + params = compact(Spreadsheet( + properties = ss_props, + sheets = ss_sheets + )) ) raw_resp <- request_make(req) resp <- gargle::response_process(raw_resp) From 7aa6856054fed4216f22fcdee8f34fd4dc228bd6 Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Wed, 20 Nov 2019 17:01:48 -0800 Subject: [PATCH 07/28] Re-download discovery document Only change was correcting an instance of camelCase to snake_case in a description. --- ...9-11-05.json => sheets-v4_2019-11-15.json} | 12342 ++++++++-------- 1 file changed, 6171 insertions(+), 6171 deletions(-) rename data-raw/{sheets-v4_2019-11-05.json => sheets-v4_2019-11-15.json} (92%) diff --git a/data-raw/sheets-v4_2019-11-05.json b/data-raw/sheets-v4_2019-11-15.json similarity index 92% rename from data-raw/sheets-v4_2019-11-05.json rename to data-raw/sheets-v4_2019-11-15.json index 50e1f2b80..7bc15fe57 100644 --- a/data-raw/sheets-v4_2019-11-05.json +++ b/data-raw/sheets-v4_2019-11-15.json @@ -1,6061 +1,457 @@ { - "version_module": true, - "schemas": { - "UpdateDimensionGroupRequest": { - "type": "object", - "properties": { - "dimensionGroup": { - "$ref": "DimensionGroup", - "description": "The group whose state should be updated. The range and depth of the group\nshould specify a valid group on the sheet, and all other fields updated." - }, - "fields": { - "type": "string", - "description": "The fields that should be updated. At least one field must be specified.\nThe root `dimensionGroup` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask" - } - }, - "id": "UpdateDimensionGroupRequest", - "description": "Updates the state of the specified group." - }, - "DeleteDeveloperMetadataResponse": { - "description": "The response from deleting developer metadata.", - "type": "object", - "properties": { - "deletedDeveloperMetadata": { - "description": "The metadata that was deleted.", - "type": "array", - "items": { - "$ref": "DeveloperMetadata" - } - } - }, - "id": "DeleteDeveloperMetadataResponse" - }, - "SortRangeRequest": { - "description": "Sorts data in rows based on a sort order per column.", - "type": "object", - "properties": { - "range": { - "description": "The range to sort.", - "$ref": "GridRange" - }, - "sortSpecs": { - "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications.", - "type": "array", - "items": { - "$ref": "SortSpec" - } - } - }, - "id": "SortRangeRequest" - }, - "MatchedDeveloperMetadata": { - "id": "MatchedDeveloperMetadata", - "description": "A developer metadata entry and the data filters specified in the original\nrequest that matched it.", - "type": "object", - "properties": { - "dataFilters": { - "description": "All filters matching the returned developer metadata.", - "type": "array", - "items": { - "$ref": "DataFilter" - } - }, - "developerMetadata": { - "$ref": "DeveloperMetadata", - "description": "The developer metadata matching the specified filters." - } - } - }, - "MergeCellsRequest": { - "type": "object", - "properties": { - "range": { - "description": "The range of cells to merge.", - "$ref": "GridRange" - }, - "mergeType": { - "enumDescriptions": [ - "Create a single merge from the range", - "Create a merge for each column in the range", - "Create a merge for each row in the range" + "ownerDomain": "google.com", + "name": "sheets", + "batchPath": "batch", + "fullyEncodeReservedExpansion": true, + "title": "Google Sheets API", + "ownerName": "Google", + "resources": { + "spreadsheets": { + "methods": { + "get": { + "response": { + "$ref": "Spreadsheet" + }, + "parameterOrder": [ + "spreadsheetId" ], - "enum": [ - "MERGE_ALL", - "MERGE_COLUMNS", - "MERGE_ROWS" + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/drive.readonly", + "https://www.googleapis.com/auth/spreadsheets", + "https://www.googleapis.com/auth/spreadsheets.readonly" ], - "description": "How the cells should be merged.", - "type": "string" - } - }, - "id": "MergeCellsRequest", - "description": "Merges all cells in the range." - }, - "AddProtectedRangeRequest": { - "description": "Adds a new protected range.", - "type": "object", - "properties": { - "protectedRange": { - "$ref": "ProtectedRange", - "description": "The protected range to be added. The\nprotectedRangeId field is optional; if\none is not set, an id will be randomly generated. (It is an error to\nspecify the ID of a range that already exists.)" - } - }, - "id": "AddProtectedRangeRequest" - }, - "DuplicateFilterViewResponse": { - "description": "The result of a filter view being duplicated.", - "type": "object", - "properties": { - "filter": { - "description": "The newly created filter.", - "$ref": "FilterView" - } - }, - "id": "DuplicateFilterViewResponse" - }, - "DuplicateSheetResponse": { - "description": "The result of duplicating a sheet.", - "type": "object", - "properties": { - "properties": { - "$ref": "SheetProperties", - "description": "The properties of the duplicate sheet." - } - }, - "id": "DuplicateSheetResponse" - }, - "BatchUpdateSpreadsheetResponse": { - "description": "The reply for batch updating a spreadsheet.", - "type": "object", - "properties": { - "replies": { - "type": "array", - "items": { - "$ref": "Response" + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The spreadsheet to request.", + "required": true, + "type": "string" + }, + "ranges": { + "description": "The ranges to retrieve from the spreadsheet.", + "type": "string", + "repeated": true, + "location": "query" + }, + "includeGridData": { + "location": "query", + "description": "True if grid data should be returned.\nThis parameter is ignored if a field mask was set in the request.", + "type": "boolean" + } }, - "description": "The reply of the updates. This maps 1:1 with the updates, although\nreplies to some requests may be empty." - }, - "updatedSpreadsheet": { - "description": "The spreadsheet after updates were applied. This is only set if\n[BatchUpdateSpreadsheetRequest.include_spreadsheet_in_response] is `true`.", - "$ref": "Spreadsheet" + "flatPath": "v4/spreadsheets/{spreadsheetId}", + "path": "v4/spreadsheets/{spreadsheetId}", + "id": "sheets.spreadsheets.get", + "description": "Returns the spreadsheet at the given ID.\nThe caller must specify the spreadsheet ID.\n\nBy default, data within grids will not be returned.\nYou can include grid data one of two ways:\n\n* Specify a field mask listing your desired fields using the `fields` URL\nparameter in HTTP\n\n* Set the includeGridData\nURL parameter to true. If a field mask is set, the `includeGridData`\nparameter is ignored\n\nFor large spreadsheets, it is recommended to retrieve only the specific\nfields of the spreadsheet that you want.\n\nTo retrieve only subsets of the spreadsheet, use the\nranges URL parameter.\nMultiple ranges can be specified. Limiting the range will\nreturn only the portions of the spreadsheet that intersect the requested\nranges. Ranges are specified using A1 notation." }, - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", - "type": "string" - } - }, - "id": "BatchUpdateSpreadsheetResponse" - }, - "AddFilterViewRequest": { - "type": "object", - "properties": { - "filter": { - "$ref": "FilterView", - "description": "The filter to add. The filterViewId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a filter that already exists.)" - } - }, - "id": "AddFilterViewRequest", - "description": "Adds a filter view." - }, - "DataFilterValueRange": { - "type": "object", - "properties": { - "majorDimension": { - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" + "getByDataFilter": { + "httpMethod": "POST", + "parameterOrder": [ + "spreadsheetId" ], - "description": "The major dimension of the values." - }, - "values": { - "description": "The data to be written. If the provided values exceed any of the ranges\nmatched by the data filter then the request will fail. If the provided\nvalues are less than the matched ranges only the specified values will be\nwritten, existing values in the matched ranges will remain unaffected.", - "type": "array", - "items": { - "type": "array", - "items": { - "type": "any" + "response": { + "$ref": "Spreadsheet" + }, + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The spreadsheet to request.", + "required": true, + "type": "string" } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}:getByDataFilter", + "id": "sheets.spreadsheets.getByDataFilter", + "path": "v4/spreadsheets/{spreadsheetId}:getByDataFilter", + "description": "Returns the spreadsheet at the given ID.\nThe caller must specify the spreadsheet ID.\n\nThis method differs from GetSpreadsheet in that it allows selecting\nwhich subsets of spreadsheet data to return by specifying a\ndataFilters parameter.\nMultiple DataFilters can be specified. Specifying one or\nmore data filters will return the portions of the spreadsheet that\nintersect ranges matched by any of the filters.\n\nBy default, data within grids will not be returned.\nYou can include grid data one of two ways:\n\n* Specify a field mask listing your desired fields using the `fields` URL\nparameter in HTTP\n\n* Set the includeGridData\nparameter to true. If a field mask is set, the `includeGridData`\nparameter is ignored\n\nFor large spreadsheets, it is recommended to retrieve only the specific\nfields of the spreadsheet that you want.", + "request": { + "$ref": "GetSpreadsheetByDataFilterRequest" } }, - "dataFilter": { - "$ref": "DataFilter", - "description": "The data filter describing the location of the values in the spreadsheet." - } - }, - "id": "DataFilterValueRange", - "description": "A range of values whose location is specified by a DataFilter." - }, - "NumberFormat": { - "description": "The number format of a cell.", - "type": "object", - "properties": { - "type": { - "type": "string", - "enumDescriptions": [ - "The number format is not specified\nand is based on the contents of the cell.\nDo not explicitly use this.", - "Text formatting, e.g `1000.12`", - "Number formatting, e.g, `1,000.12`", - "Percent formatting, e.g `10.12%`", - "Currency formatting, e.g `$1,000.12`", - "Date formatting, e.g `9/26/2008`", - "Time formatting, e.g `3:59:00 PM`", - "Date+Time formatting, e.g `9/26/08 15:59:00`", - "Scientific number formatting, e.g `1.01E+03`" + "create": { + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" ], - "enum": [ - "NUMBER_FORMAT_TYPE_UNSPECIFIED", - "TEXT", - "NUMBER", - "PERCENT", - "CURRENCY", - "DATE", - "TIME", - "DATE_TIME", - "SCIENTIFIC" - ], - "description": "The type of the number format.\nWhen writing, this field must be set." - }, - "pattern": { - "description": "Pattern string used for formatting. If not set, a default pattern based on\nthe user's locale will be used if necessary for the given type.\nSee the [Date and Number Formats guide](/sheets/api/guides/formats) for\nmore information about the supported patterns.", - "type": "string" - } - }, - "id": "NumberFormat" - }, - "OrgChartSpec": { - "type": "object", - "properties": { - "tooltips": { - "description": "The data containing the tooltip for the corresponding node. A blank value\nresults in no tooltip being displayed for the node.\nThis field is optional.", - "$ref": "ChartData" - }, - "selectedNodeColor": { - "$ref": "Color", - "description": "The color of the selected org chart nodes." - }, - "parentLabels": { - "$ref": "ChartData", - "description": "The data containing the label of the parent for the corresponding node.\nA blank value indicates that the node has no parent and is a top-level\nnode.\nThis field is optional." + "parameters": {}, + "flatPath": "v4/spreadsheets", + "path": "v4/spreadsheets", + "id": "sheets.spreadsheets.create", + "request": { + "$ref": "Spreadsheet" + }, + "description": "Creates a spreadsheet, returning the newly created spreadsheet.", + "response": { + "$ref": "Spreadsheet" + }, + "parameterOrder": [], + "httpMethod": "POST" }, - "nodeSize": { - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "The small org chart node size.", - "The medium org chart node size.", - "The large org chart node size." + "batchUpdate": { + "flatPath": "v4/spreadsheets/{spreadsheetId}:batchUpdate", + "path": "v4/spreadsheets/{spreadsheetId}:batchUpdate", + "id": "sheets.spreadsheets.batchUpdate", + "request": { + "$ref": "BatchUpdateSpreadsheetRequest" + }, + "description": "Applies one or more updates to the spreadsheet.\n\nEach request is validated before\nbeing applied. If any request is not valid then the entire request will\nfail and nothing will be applied.\n\nSome requests have replies to\ngive you some information about how\nthey are applied. The replies will mirror the requests. For example,\nif you applied 4 updates and the 3rd one had a reply, then the\nresponse will have 2 empty replies, the actual reply, and another empty\nreply, in that order.\n\nDue to the collaborative nature of spreadsheets, it is not guaranteed that\nthe spreadsheet will reflect exactly your changes after this completes,\nhowever it is guaranteed that the updates in the request will be\napplied together atomically. Your changes may be altered with respect to\ncollaborator changes. If there are no collaborators, the spreadsheet\nshould reflect your changes.", + "response": { + "$ref": "BatchUpdateSpreadsheetResponse" + }, + "parameterOrder": [ + "spreadsheetId" ], - "enum": [ - "ORG_CHART_LABEL_SIZE_UNSPECIFIED", - "SMALL", - "MEDIUM", - "LARGE" + "httpMethod": "POST", + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" ], - "description": "The size of the org chart nodes." - }, - "labels": { - "$ref": "ChartData", - "description": "The data containing the labels for all the nodes in the chart. Labels\nmust be unique." - }, - "nodeColor": { - "$ref": "Color", - "description": "The color of the org chart nodes." - } - }, - "id": "OrgChartSpec", - "description": "An \u003ca href=\"/chart/interactive/docs/gallery/orgchart\"\u003eorg chart\u003c/a\u003e.\nOrg charts require a unique set of labels in labels and may\noptionally include parent_labels and tooltips.\nparent_labels contain, for each node, the label identifying the parent\nnode. tooltips contain, for each node, an optional tooltip.\n\nFor example, to describe an OrgChart with Alice as the CEO, Bob as the\nPresident (reporting to Alice) and Cathy as VP of Sales (also reporting to\nAlice), have labels contain \"Alice\", \"Bob\", \"Cathy\",\nparent_labels contain \"\", \"Alice\", \"Alice\" and tooltips contain\n\"CEO\", \"President\", \"VP Sales\"." - }, - "FilterView": { - "description": "A filter view.", - "type": "object", - "properties": { - "criteria": { - "description": "The criteria for showing/hiding values per column.\nThe map's key is the column index, and the value is the criteria for\nthat column.", - "type": "object", - "additionalProperties": { - "$ref": "FilterCriteria" + "parameters": { + "spreadsheetId": { + "description": "The spreadsheet to apply the updates to.", + "required": true, + "type": "string", + "location": "path" + } } - }, - "title": { - "type": "string", - "description": "The name of the filter view." - }, - "range": { - "description": "The range this filter view covers.\n\nWhen writing, only one of range or named_range_id\nmay be set.", - "$ref": "GridRange" - }, - "sortSpecs": { - "type": "array", - "items": { - "$ref": "SortSpec" - }, - "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications." - }, - "namedRangeId": { - "description": "The named range this filter view is backed by, if any.\n\nWhen writing, only one of range or named_range_id\nmay be set.", - "type": "string" - }, - "filterViewId": { - "type": "integer", - "description": "The ID of the filter view.", - "format": "int32" - } - }, - "id": "FilterView" - }, - "Slicer": { - "type": "object", - "properties": { - "position": { - "description": "The position of the slicer. Note that slicer can be positioned only on\nexisting sheet. Also, width and height of slicer can be automatically\nadjusted to keep it within permitted limits.", - "$ref": "EmbeddedObjectPosition" - }, - "spec": { - "$ref": "SlicerSpec", - "description": "The specification of the slicer." - }, - "slicerId": { - "description": "The ID of the slicer.", - "format": "int32", - "type": "integer" } }, - "id": "Slicer", - "description": "A slicer in a sheet." - }, - "SearchDeveloperMetadataRequest": { - "description": "A request to retrieve all developer metadata matching the set of specified\ncriteria.", - "type": "object", - "properties": { - "dataFilters": { - "description": "The data filters describing the criteria used to determine which\nDeveloperMetadata entries to return. DeveloperMetadata matching any of the\nspecified filters will be included in the response.", - "type": "array", - "items": { - "$ref": "DataFilter" + "resources": { + "developerMetadata": { + "methods": { + "search": { + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "spreadsheetId": { + "required": true, + "type": "string", + "location": "path", + "description": "The ID of the spreadsheet to retrieve metadata from." + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}/developerMetadata:search", + "path": "v4/spreadsheets/{spreadsheetId}/developerMetadata:search", + "id": "sheets.spreadsheets.developerMetadata.search", + "request": { + "$ref": "SearchDeveloperMetadataRequest" + }, + "description": "Returns all developer metadata matching the specified DataFilter.\nIf the provided DataFilter represents a DeveloperMetadataLookup object,\nthis will return all DeveloperMetadata entries selected by it. If the\nDataFilter represents a location in a spreadsheet, this will return all\ndeveloper metadata associated with locations intersecting that region.", + "response": { + "$ref": "SearchDeveloperMetadataResponse" + }, + "parameterOrder": [ + "spreadsheetId" + ], + "httpMethod": "POST" + }, + "get": { + "path": "v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}", + "id": "sheets.spreadsheets.developerMetadata.get", + "description": "Returns the developer metadata with the specified ID.\nThe caller must specify the spreadsheet ID and the developer metadata's\nunique metadataId.", + "response": { + "$ref": "DeveloperMetadata" + }, + "parameterOrder": [ + "spreadsheetId", + "metadataId" + ], + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "metadataId": { + "description": "The ID of the developer metadata to retrieve.", + "format": "int32", + "required": true, + "type": "integer", + "location": "path" + }, + "spreadsheetId": { + "required": true, + "type": "string", + "location": "path", + "description": "The ID of the spreadsheet to retrieve metadata from." + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}" + } } - } - }, - "id": "SearchDeveloperMetadataRequest" - }, - "BandingProperties": { - "id": "BandingProperties", - "description": "Properties referring a single dimension (either row or column). If both\nBandedRange.row_properties and BandedRange.column_properties are\nset, the fill colors are applied to cells according to the following rules:\n\n* header_color and footer_color take priority over band colors.\n* first_band_color takes priority over second_band_color.\n* row_properties takes priority over column_properties.\n\nFor example, the first row color takes priority over the first column\ncolor, but the first column color takes priority over the second row color.\nSimilarly, the row header takes priority over the column header in the\ntop left cell, but the column header takes priority over the first row\ncolor if the row header is not set.", - "type": "object", - "properties": { - "secondBandColor": { - "$ref": "Color", - "description": "The second color that is alternating. (Required)" - }, - "footerColor": { - "description": "The color of the last row or column. If this field is not set, the last\nrow or column will be filled with either first_band_color or\nsecond_band_color, depending on the color of the previous row or\ncolumn.", - "$ref": "Color" - }, - "headerColor": { - "$ref": "Color", - "description": "The color of the first row or column. If this field is set, the first\nrow or column will be filled with this color and the colors will\nalternate between first_band_color and second_band_color starting\nfrom the second row or column. Otherwise, the first row or column will be\nfilled with first_band_color and the colors will proceed to alternate\nas they normally would." - }, - "firstBandColor": { - "$ref": "Color", - "description": "The first color that is alternating. (Required)" - } - } - }, - "BasicFilter": { - "id": "BasicFilter", - "description": "The default filter associated with a sheet.", - "type": "object", - "properties": { - "range": { - "$ref": "GridRange", - "description": "The range the filter covers." - }, - "criteria": { - "additionalProperties": { - "$ref": "FilterCriteria" - }, - "description": "The criteria for showing/hiding values per column.\nThe map's key is the column index, and the value is the criteria for\nthat column.", - "type": "object" }, - "sortSpecs": { - "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications.", - "type": "array", - "items": { - "$ref": "SortSpec" - } - } - } - }, - "AddProtectedRangeResponse": { - "id": "AddProtectedRangeResponse", - "description": "The result of adding a new protected range.", - "type": "object", - "properties": { - "protectedRange": { - "$ref": "ProtectedRange", - "description": "The newly added protected range." - } - } - }, - "PivotValue": { - "description": "The definition of how a value in a pivot table should be calculated.", - "type": "object", - "properties": { - "name": { - "description": "A name to use for the value.", - "type": "string" - }, - "formula": { - "type": "string", - "description": "A custom formula to calculate the value. The formula must start\nwith an `=` character." - }, - "calculatedDisplayType": { - "enumDescriptions": [ - "Default value, do not use.", - "Shows the pivot values as percentage of the row total values.", - "Shows the pivot values as percentage of the column total values.", - "Shows the pivot values as percentage of the grand total values." - ], - "enum": [ - "PIVOT_VALUE_CALCULATED_DISPLAY_TYPE_UNSPECIFIED", - "PERCENT_OF_ROW_TOTAL", - "PERCENT_OF_COLUMN_TOTAL", - "PERCENT_OF_GRAND_TOTAL" - ], - "description": "If specified, indicates that pivot values should be displayed as\nthe result of a calculation with another pivot value. For example, if\ncalculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the\npivot values are displayed as the percentage of the grand total. In\nthe Sheets UI, this is referred to as \"Show As\" in the value section of a\npivot table.", - "type": "string" - }, - "summarizeFunction": { - "enumDescriptions": [ - "The default, do not use.", - "Corresponds to the `SUM` function.", - "Corresponds to the `COUNTA` function.", - "Corresponds to the `COUNT` function.", - "Corresponds to the `COUNTUNIQUE` function.", - "Corresponds to the `AVERAGE` function.", - "Corresponds to the `MAX` function.", - "Corresponds to the `MIN` function.", - "Corresponds to the `MEDIAN` function.", - "Corresponds to the `PRODUCT` function.", - "Corresponds to the `STDEV` function.", - "Corresponds to the `STDEVP` function.", - "Corresponds to the `VAR` function.", - "Corresponds to the `VARP` function.", - "Indicates the formula should be used as-is.\nOnly valid if PivotValue.formula was set." - ], - "enum": [ - "PIVOT_STANDARD_VALUE_FUNCTION_UNSPECIFIED", - "SUM", - "COUNTA", - "COUNT", - "COUNTUNIQUE", - "AVERAGE", - "MAX", - "MIN", - "MEDIAN", - "PRODUCT", - "STDEV", - "STDEVP", - "VAR", - "VARP", - "CUSTOM" - ], - "description": "A function to summarize the value.\nIf formula is set, the only supported values are\nSUM and\nCUSTOM.\nIf sourceColumnOffset is set, then `CUSTOM`\nis not supported.", - "type": "string" - }, - "sourceColumnOffset": { - "type": "integer", - "description": "The column offset of the source range that this value reads from.\n\nFor example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`\nmeans this value refers to column `C`, whereas the offset `1` would\nrefer to column `D`.", - "format": "int32" - } - }, - "id": "PivotValue" - }, - "ErrorValue": { - "id": "ErrorValue", - "description": "An error in a cell.", - "type": "object", - "properties": { - "type": { - "enum": [ - "ERROR_TYPE_UNSPECIFIED", - "ERROR", - "NULL_VALUE", - "DIVIDE_BY_ZERO", - "VALUE", - "REF", - "NAME", - "NUM", - "N_A", - "LOADING" - ], - "description": "The type of error.", - "type": "string", - "enumDescriptions": [ - "The default error type, do not use this.", - "Corresponds to the `#ERROR!` error.", - "Corresponds to the `#NULL!` error.", - "Corresponds to the `#DIV/0` error.", - "Corresponds to the `#VALUE!` error.", - "Corresponds to the `#REF!` error.", - "Corresponds to the `#NAME?` error.", - "Corresponds to the `#NUM`! error.", - "Corresponds to the `#N/A` error.", - "Corresponds to the `Loading...` state." - ] - }, - "message": { - "description": "A message with more information about the error\n(in the spreadsheet's locale).", - "type": "string" - } - } - }, - "CopySheetToAnotherSpreadsheetRequest": { - "description": "The request to copy a sheet across spreadsheets.", - "type": "object", - "properties": { - "destinationSpreadsheetId": { - "type": "string", - "description": "The ID of the spreadsheet to copy the sheet to." - } - }, - "id": "CopySheetToAnotherSpreadsheetRequest" - }, - "CandlestickChartSpec": { - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/candlestickchart\"\u003ecandlestick\nchart\u003c/a\u003e.", - "type": "object", - "properties": { - "domain": { - "$ref": "CandlestickDomain", - "description": "The domain data (horizontal axis) for the candlestick chart. String data\nwill be treated as discrete labels, other data will be treated as\ncontinuous values." - }, - "data": { - "type": "array", - "items": { - "$ref": "CandlestickData" - }, - "description": "The Candlestick chart data.\nOnly one CandlestickData is supported." - } - }, - "id": "CandlestickChartSpec" - }, - "BatchClearValuesByDataFilterResponse": { - "id": "BatchClearValuesByDataFilterResponse", - "description": "The response when clearing a range of values selected with\nDataFilters in a spreadsheet.", - "type": "object", - "properties": { - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", - "type": "string" - }, - "clearedRanges": { - "type": "array", - "items": { - "type": "string" - }, - "description": "The ranges that were cleared, in A1 notation.\n(If the requests were for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual ranges\n that were cleared, bounded to the sheet's limits.)" - } - } - }, - "TreemapChartColorScale": { - "description": "A color scale for a treemap chart.", - "type": "object", - "properties": { - "midValueColor": { - "description": "The background color for cells with a color value at the midpoint between\nminValue and\nmaxValue. Defaults to #efe6dc if not\nspecified.", - "$ref": "Color" - }, - "maxValueColor": { - "$ref": "Color", - "description": "The background color for cells with a color value greater than or equal\nto maxValue. Defaults to #109618 if not\nspecified." - }, - "minValueColor": { - "$ref": "Color", - "description": "The background color for cells with a color value less than or equal to\nminValue. Defaults to #dc3912 if not\nspecified." - }, - "noDataColor": { - "$ref": "Color", - "description": "The background color for cells that have no color data associated with\nthem. Defaults to #000000 if not specified." - } - }, - "id": "TreemapChartColorScale" - }, - "EmbeddedObjectPosition": { - "description": "The position of an embedded object such as a chart.", - "type": "object", - "properties": { - "sheetId": { - "description": "The sheet this is on. Set only if the embedded object\nis on its own sheet. Must be non-negative.", - "format": "int32", - "type": "integer" - }, - "overlayPosition": { - "$ref": "OverlayPosition", - "description": "The position at which the object is overlaid on top of a grid." - }, - "newSheet": { - "type": "boolean", - "description": "If true, the embedded object is put on a new sheet whose ID\nis chosen for you. Used only when writing." - } - }, - "id": "EmbeddedObjectPosition" - }, - "DeveloperMetadataLookup": { - "description": "Selects DeveloperMetadata that matches all of the specified fields. For\nexample, if only a metadata ID is specified this considers the\nDeveloperMetadata with that particular unique ID. If a metadata key is\nspecified, this considers all developer metadata with that key. If a\nkey, visibility, and location type are all specified, this considers all\ndeveloper metadata with that key and visibility that are associated with a\nlocation of that type. In general, this\nselects all DeveloperMetadata that matches the intersection of all the\nspecified fields; any field or combination of fields may be specified.", - "type": "object", - "properties": { - "locationType": { - "enumDescriptions": [ - "Default value.", - "Developer metadata associated on an entire row dimension.", - "Developer metadata associated on an entire column dimension.", - "Developer metadata associated on an entire sheet.", - "Developer metadata associated on the entire spreadsheet." - ], - "enum": [ - "DEVELOPER_METADATA_LOCATION_TYPE_UNSPECIFIED", - "ROW", - "COLUMN", - "SHEET", - "SPREADSHEET" - ], - "description": "Limits the selected developer metadata to those entries which are\nassociated with locations of the specified type. For example, when this\nfield is specified as ROW this lookup\nonly considers developer metadata associated on rows. If the field is left\nunspecified, all location types are considered. This field cannot be\nspecified as SPREADSHEET when\nthe locationMatchingStrategy\nis specified as INTERSECTING or when the\nmetadataLocation is specified as a\nnon-spreadsheet location: spreadsheet metadata cannot intersect any other\ndeveloper metadata location. This field also must be left unspecified when\nthe locationMatchingStrategy\nis specified as EXACT.", - "type": "string" - }, - "metadataKey": { - "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_key.", - "type": "string" - }, - "metadataId": { - "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_id.", - "format": "int32", - "type": "integer" - }, - "visibility": { - "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.visibility. If left unspecified, all developer\nmetadata visibile to the requesting project is considered.", - "type": "string", - "enumDescriptions": [ - "Default value.", - "Document-visible metadata is accessible from any developer project with\naccess to the document.", - "Project-visible metadata is only visible to and accessible by the developer\nproject that created the metadata." - ], - "enum": [ - "DEVELOPER_METADATA_VISIBILITY_UNSPECIFIED", - "DOCUMENT", - "PROJECT" - ] - }, - "metadataValue": { - "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_value.", - "type": "string" - }, - "metadataLocation": { - "description": "Limits the selected developer metadata to those entries associated with\nthe specified location. This field either matches exact locations or all\nintersecting locations according the specified\nlocationMatchingStrategy.", - "$ref": "DeveloperMetadataLocation" - }, - "locationMatchingStrategy": { - "enum": [ - "DEVELOPER_METADATA_LOCATION_MATCHING_STRATEGY_UNSPECIFIED", - "EXACT_LOCATION", - "INTERSECTING_LOCATION" - ], - "description": "Determines how this lookup matches the location. If this field is\nspecified as EXACT, only developer metadata associated on the exact\nlocation specified is matched. If this field is specified to INTERSECTING,\ndeveloper metadata associated on intersecting locations is also\nmatched. If left unspecified, this field assumes a default value of\nINTERSECTING.\nIf this field is specified, a metadataLocation\nmust also be specified.", - "type": "string", - "enumDescriptions": [ - "Default value. This value must not be used.", - "Indicates that a specified location should be matched exactly. For\nexample, if row three were specified as a location this matching strategy\nwould only match developer metadata also associated on row three. Metadata\nassociated on other locations would not be considered.", - "Indicates that a specified location should match that exact location as\nwell as any intersecting locations. For example, if row three were\nspecified as a location this matching strategy would match developer\nmetadata associated on row three as well as metadata associated on\nlocations that intersect row three. If, for instance, there was developer\nmetadata associated on column B, this matching strategy would also match\nthat location because column B intersects row three." - ] - } - }, - "id": "DeveloperMetadataLookup" - }, - "AutoFillRequest": { - "description": "Fills in more data based on existing data.", - "type": "object", - "properties": { - "useAlternateSeries": { - "description": "True if we should generate data with the \"alternate\" series.\nThis differs based on the type and amount of source data.", - "type": "boolean" - }, - "sourceAndDestination": { - "description": "The source and destination areas to autofill.\nThis explicitly lists the source of the autofill and where to\nextend that data.", - "$ref": "SourceAndDestination" - }, - "range": { - "$ref": "GridRange", - "description": "The range to autofill. This will examine the range and detect\nthe location that has data and automatically fill that data\nin to the rest of the range." - } - }, - "id": "AutoFillRequest" - }, - "GradientRule": { - "id": "GradientRule", - "description": "A rule that applies a gradient color scale format, based on\nthe interpolation points listed. The format of a cell will vary\nbased on its contents as compared to the values of the interpolation\npoints.", - "type": "object", - "properties": { - "midpoint": { - "$ref": "InterpolationPoint", - "description": "An optional midway interpolation point." - }, - "minpoint": { - "$ref": "InterpolationPoint", - "description": "The starting interpolation point." - }, - "maxpoint": { - "$ref": "InterpolationPoint", - "description": "The final interpolation point." - } - } - }, - "ClearValuesRequest": { - "type": "object", - "properties": {}, - "id": "ClearValuesRequest", - "description": "The request for clearing a range of values in a spreadsheet." - }, - "SetBasicFilterRequest": { - "type": "object", - "properties": { - "filter": { - "$ref": "BasicFilter", - "description": "The filter to set." - } - }, - "id": "SetBasicFilterRequest", - "description": "Sets the basic filter associated with a sheet." - }, - "BatchClearValuesByDataFilterRequest": { - "description": "The request for clearing more than one range selected by a\nDataFilter in a spreadsheet.", - "type": "object", - "properties": { - "dataFilters": { - "description": "The DataFilters used to determine which ranges to clear.", - "type": "array", - "items": { - "$ref": "DataFilter" - } - } - }, - "id": "BatchClearValuesByDataFilterRequest" - }, - "GetSpreadsheetByDataFilterRequest": { - "type": "object", - "properties": { - "includeGridData": { - "description": "True if grid data should be returned.\nThis parameter is ignored if a field mask was set in the request.", - "type": "boolean" - }, - "dataFilters": { - "description": "The DataFilters used to select which ranges to retrieve from\nthe spreadsheet.", - "type": "array", - "items": { - "$ref": "DataFilter" - } - } - }, - "id": "GetSpreadsheetByDataFilterRequest", - "description": "The request for retrieving a Spreadsheet." - }, - "DeleteEmbeddedObjectRequest": { - "id": "DeleteEmbeddedObjectRequest", - "description": "Deletes the embedded object with the given ID.", - "type": "object", - "properties": { - "objectId": { - "description": "The ID of the embedded object to delete.", - "format": "int32", - "type": "integer" - } - } - }, - "UpdateValuesByDataFilterResponse": { - "description": "The response when updating a range of values by a data filter in a\nspreadsheet.", - "type": "object", - "properties": { - "updatedCells": { - "type": "integer", - "description": "The number of cells updated.", - "format": "int32" - }, - "dataFilter": { - "$ref": "DataFilter", - "description": "The data filter that selected the range that was updated." - }, - "updatedRows": { - "description": "The number of rows where at least one cell in the row was updated.", - "format": "int32", - "type": "integer" - }, - "updatedData": { - "$ref": "ValueRange", - "description": "The values of the cells in the range matched by the dataFilter after all\nupdates were applied. This is only included if the request's\n`includeValuesInResponse` field was `true`." - }, - "updatedColumns": { - "type": "integer", - "description": "The number of columns where at least one cell in the column was updated.", - "format": "int32" - }, - "updatedRange": { - "description": "The range (in A1 notation) that updates were applied to.", - "type": "string" - } - }, - "id": "UpdateValuesByDataFilterResponse" - }, - "DeleteSheetRequest": { - "type": "object", - "properties": { - "sheetId": { - "description": "The ID of the sheet to delete.", - "format": "int32", - "type": "integer" - } - }, - "id": "DeleteSheetRequest", - "description": "Deletes the requested sheet." - }, - "MatchedValueRange": { - "type": "object", - "properties": { - "valueRange": { - "description": "The values matched by the DataFilter.", - "$ref": "ValueRange" - }, - "dataFilters": { - "description": "The DataFilters from the request that matched the range of\nvalues.", - "type": "array", - "items": { - "$ref": "DataFilter" - } - } - }, - "id": "MatchedValueRange", - "description": "A value range that was matched by one or more data filers." - }, - "DeveloperMetadataLocation": { - "id": "DeveloperMetadataLocation", - "description": "A location where metadata may be associated in a spreadsheet.", - "type": "object", - "properties": { - "dimensionRange": { - "description": "Represents the row or column when metadata is associated with\na dimension. The specified DimensionRange must represent a single row\nor column; it cannot be unbounded or span multiple rows or columns.", - "$ref": "DimensionRange" - }, - "spreadsheet": { - "type": "boolean", - "description": "True when metadata is associated with an entire spreadsheet." - }, - "sheetId": { - "description": "The ID of the sheet when metadata is associated with an entire sheet.", - "format": "int32", - "type": "integer" - }, - "locationType": { - "enumDescriptions": [ - "Default value.", - "Developer metadata associated on an entire row dimension.", - "Developer metadata associated on an entire column dimension.", - "Developer metadata associated on an entire sheet.", - "Developer metadata associated on the entire spreadsheet." - ], - "enum": [ - "DEVELOPER_METADATA_LOCATION_TYPE_UNSPECIFIED", - "ROW", - "COLUMN", - "SHEET", - "SPREADSHEET" - ], - "description": "The type of location this object represents. This field is read-only.", - "type": "string" - } - } - }, - "DuplicateSheetRequest": { - "description": "Duplicates the contents of a sheet.", - "type": "object", - "properties": { - "insertSheetIndex": { - "description": "The zero-based index where the new sheet should be inserted.\nThe index of all sheets after this are incremented.", - "format": "int32", - "type": "integer" - }, - "newSheetName": { - "description": "The name of the new sheet. If empty, a new name is chosen for you.", - "type": "string" - }, - "sourceSheetId": { - "description": "The sheet to duplicate.", - "format": "int32", - "type": "integer" - }, - "newSheetId": { - "description": "If set, the ID of the new sheet. If not set, an ID is chosen.\nIf set, the ID must not conflict with any existing sheet ID.\nIf set, it must be non-negative.", - "format": "int32", - "type": "integer" - } - }, - "id": "DuplicateSheetRequest" - }, - "TreemapChartSpec": { - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/treemap\"\u003eTreemap chart\u003c/a\u003e.", - "type": "object", - "properties": { - "sizeData": { - "$ref": "ChartData", - "description": "The data that determines the size of each treemap data cell. This data is\nexpected to be numeric. The cells corresponding to non-numeric or missing\ndata will not be rendered. If color_data is not specified, this data\nis used to determine data cell background colors as well." - }, - "textFormat": { - "$ref": "TextFormat", - "description": "The text format for all labels on the chart." - }, - "parentLabels": { - "$ref": "ChartData", - "description": "The data the contains the treemap cells' parent labels." - }, - "headerColor": { - "$ref": "Color", - "description": "The background color for header cells." - }, - "labels": { - "$ref": "ChartData", - "description": "The data that contains the treemap cell labels." - }, - "colorData": { - "$ref": "ChartData", - "description": "The data that determines the background color of each treemap data cell.\nThis field is optional. If not specified, size_data is used to\ndetermine background colors. If specified, the data is expected to be\nnumeric. color_scale will determine how the values in this data map to\ndata cell background colors." - }, - "colorScale": { - "$ref": "TreemapChartColorScale", - "description": "The color scale for data cells in the treemap chart. Data cells are\nassigned colors based on their color values. These color values come from\ncolor_data, or from size_data if color_data is not specified.\nCells with color values less than or equal to min_value will\nhave minValueColor as their\nbackground color. Cells with color values greater than or equal to\nmax_value will have\nmaxValueColor as their background\ncolor. Cells with color values between min_value and max_value will\nhave background colors on a gradient between\nminValueColor and\nmaxValueColor, the midpoint of\nthe gradient being midValueColor.\nCells with missing or non-numeric color values will have\nnoDataColor as their background\ncolor." - }, - "maxValue": { - "description": "The maximum possible data value. Cells with values greater than this will\nhave the same color as cells with this value. If not specified, defaults\nto the actual maximum value from color_data, or the maximum value from\nsize_data if color_data is not specified.", - "format": "double", - "type": "number" - }, - "hideTooltips": { - "type": "boolean", - "description": "True to hide tooltips." - }, - "hintedLevels": { - "type": "integer", - "description": "The number of additional data levels beyond the labeled levels to be shown\non the treemap chart. These levels are not interactive and are shown\nwithout their labels. Defaults to 0 if not specified.", - "format": "int32" - }, - "minValue": { - "description": "The minimum possible data value. Cells with values less than this will\nhave the same color as cells with this value. If not specified, defaults\nto the actual minimum value from color_data, or the minimum value from\nsize_data if color_data is not specified.", - "format": "double", - "type": "number" - }, - "levels": { - "description": "The number of data levels to show on the treemap chart. These levels are\ninteractive and are shown with their labels. Defaults to 2 if not\nspecified.", - "format": "int32", - "type": "integer" - } - }, - "id": "TreemapChartSpec" - }, - "ExtendedValue": { - "id": "ExtendedValue", - "description": "The kinds of value that a cell in a spreadsheet can have.", - "type": "object", - "properties": { - "numberValue": { - "description": "Represents a double value.\nNote: Dates, Times and DateTimes are represented as doubles in\n\"serial number\" format.", - "format": "double", - "type": "number" - }, - "errorValue": { - "$ref": "ErrorValue", - "description": "Represents an error.\nThis field is read-only." - }, - "stringValue": { - "description": "Represents a string value.\nLeading single quotes are not included. For example, if the user typed\n`'123` into the UI, this would be represented as a `stringValue` of\n`\"123\"`.", - "type": "string" - }, - "boolValue": { - "description": "Represents a boolean value.", - "type": "boolean" - }, - "formulaValue": { - "description": "Represents a formula.", - "type": "string" - } - } - }, - "BatchClearValuesResponse": { - "type": "object", - "properties": { - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", - "type": "string" - }, - "clearedRanges": { - "type": "array", - "items": { - "type": "string" - }, - "description": "The ranges that were cleared, in A1 notation.\n(If the requests were for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual ranges\n that were cleared, bounded to the sheet's limits.)" - } - }, - "id": "BatchClearValuesResponse", - "description": "The response when clearing a range of values in a spreadsheet." - }, - "DataFilter": { - "type": "object", - "properties": { - "gridRange": { - "description": "Selects data that matches the range described by the GridRange.", - "$ref": "GridRange" - }, - "developerMetadataLookup": { - "$ref": "DeveloperMetadataLookup", - "description": "Selects data associated with the developer metadata matching the criteria\ndescribed by this DeveloperMetadataLookup." - }, - "a1Range": { - "description": "Selects data that matches the specified A1 range.", - "type": "string" - } - }, - "id": "DataFilter", - "description": "Filter that describes what data should be selected or returned from a\nrequest." - }, - "TextFormat": { - "type": "object", - "properties": { - "fontFamily": { - "type": "string", - "description": "The font family." - }, - "strikethrough": { - "description": "True if the text has a strikethrough.", - "type": "boolean" - }, - "italic": { - "description": "True if the text is italicized.", - "type": "boolean" - }, - "fontSize": { - "type": "integer", - "description": "The size of the font.", - "format": "int32" - }, - "underline": { - "type": "boolean", - "description": "True if the text is underlined." - }, - "bold": { - "description": "True if the text is bold.", - "type": "boolean" - }, - "foregroundColor": { - "$ref": "Color", - "description": "The foreground color of the text." - } - }, - "id": "TextFormat", - "description": "The format of a run of text in a cell.\nAbsent values indicate that the field isn't specified." - }, - "DeleteDuplicatesRequest": { - "description": "Removes rows within this range that contain values in the specified columns\nthat are duplicates of values in any previous row. Rows with identical values\nbut different letter cases, formatting, or formulas are considered to be\nduplicates.\n\nThis request also removes duplicate rows hidden from view (for example, due\nto a filter). When removing duplicates, the first instance of each duplicate\nrow scanning from the top downwards is kept in the resulting range. Content\noutside of the specified range isn't removed, and rows considered duplicates\ndo not have to be adjacent to each other in the range.", - "type": "object", - "properties": { - "range": { - "description": "The range to remove duplicates rows from.", - "$ref": "GridRange" - }, - "comparisonColumns": { - "description": "The columns in the range to analyze for duplicate values. If no columns are\nselected then all columns are analyzed for duplicates.", - "type": "array", - "items": { - "$ref": "DimensionRange" - } - } - }, - "id": "DeleteDuplicatesRequest" - }, - "RepeatCellRequest": { - "description": "Updates all cells in the range to the values in the given Cell object.\nOnly the fields listed in the fields field are updated; others are\nunchanged.\n\nIf writing a cell with a formula, the formula's ranges will automatically\nincrement for each field in the range.\nFor example, if writing a cell with formula `=A1` into range B2:C4,\nB2 would be `=A1`, B3 would be `=A2`, B4 would be `=A3`,\nC2 would be `=B1`, C3 would be `=B2`, C4 would be `=B3`.\n\nTo keep the formula's ranges static, use the `$` indicator.\nFor example, use the formula `=$A$1` to prevent both the row and the\ncolumn from incrementing.", - "type": "object", - "properties": { - "range": { - "description": "The range to repeat the cell in.", - "$ref": "GridRange" - }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `cell` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" - }, - "cell": { - "$ref": "CellData", - "description": "The data to write." - } - }, - "id": "RepeatCellRequest" - }, - "UpdateSpreadsheetPropertiesRequest": { - "id": "UpdateSpreadsheetPropertiesRequest", - "description": "Updates properties of a spreadsheet.", - "type": "object", - "properties": { - "properties": { - "$ref": "SpreadsheetProperties", - "description": "The properties to update." - }, - "fields": { - "type": "string", - "description": "The fields that should be updated. At least one field must be specified.\nThe root 'properties' is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask" - } - } - }, - "ProtectedRange": { - "type": "object", - "properties": { - "requestingUserCanEdit": { - "description": "True if the user who requested this protected range can edit the\nprotected area.\nThis field is read-only.", - "type": "boolean" - }, - "range": { - "$ref": "GridRange", - "description": "The range that is being protected.\nThe range may be fully unbounded, in which case this is considered\na protected sheet.\n\nWhen writing, only one of range or named_range_id\nmay be set." - }, - "editors": { - "$ref": "Editors", - "description": "The users and groups with edit access to the protected range.\nThis field is only visible to users with edit access to the protected\nrange and the document.\nEditors are not supported with warning_only protection." - }, - "description": { - "description": "The description of this protected range.", - "type": "string" - }, - "unprotectedRanges": { - "description": "The list of unprotected ranges within a protected sheet.\nUnprotected ranges are only supported on protected sheets.", - "type": "array", - "items": { - "$ref": "GridRange" - } - }, - "namedRangeId": { - "description": "The named range this protected range is backed by, if any.\n\nWhen writing, only one of range or named_range_id\nmay be set.", - "type": "string" - }, - "protectedRangeId": { - "description": "The ID of the protected range.\nThis field is read-only.", - "format": "int32", - "type": "integer" - }, - "warningOnly": { - "type": "boolean", - "description": "True if this protected range will show a warning when editing.\nWarning-based protection means that every user can edit data in the\nprotected range, except editing will prompt a warning asking the user\nto confirm the edit.\n\nWhen writing: if this field is true, then editors is ignored.\nAdditionally, if this field is changed from true to false and the\n`editors` field is not set (nor included in the field mask), then\nthe editors will be set to all the editors in the document." - } - }, - "id": "ProtectedRange", - "description": "A protected range." - }, - "DimensionProperties": { - "id": "DimensionProperties", - "description": "Properties about a dimension.", - "type": "object", - "properties": { - "pixelSize": { - "description": "The height (if a row) or width (if a column) of the dimension in pixels.", - "format": "int32", - "type": "integer" - }, - "hiddenByFilter": { - "description": "True if this dimension is being filtered.\nThis field is read-only.", - "type": "boolean" - }, - "hiddenByUser": { - "description": "True if this dimension is explicitly hidden.", - "type": "boolean" - }, - "developerMetadata": { - "description": "The developer metadata associated with a single row or column.", - "type": "array", - "items": { - "$ref": "DeveloperMetadata" - } - } - } - }, - "DimensionRange": { - "id": "DimensionRange", - "description": "A range along a single dimension on a sheet.\nAll indexes are zero-based.\nIndexes are half open: the start index is inclusive\nand the end index is exclusive.\nMissing indexes indicate the range is unbounded on that side.", - "type": "object", - "properties": { - "sheetId": { - "description": "The sheet this span is on.", - "format": "int32", - "type": "integer" - }, - "dimension": { - "description": "The dimension of the span.", - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ] - }, - "startIndex": { - "description": "The start (inclusive) of the span, or not set if unbounded.", - "format": "int32", - "type": "integer" - }, - "endIndex": { - "description": "The end (exclusive) of the span, or not set if unbounded.", - "format": "int32", - "type": "integer" - } - } - }, - "NamedRange": { - "type": "object", - "properties": { - "namedRangeId": { - "type": "string", - "description": "The ID of the named range." - }, - "range": { - "$ref": "GridRange", - "description": "The range this represents." - }, - "name": { - "type": "string", - "description": "The name of the named range." - } - }, - "id": "NamedRange", - "description": "A named range." - }, - "ChartCustomNumberFormatOptions": { - "id": "ChartCustomNumberFormatOptions", - "description": "Custom number formatting options for chart attributes.", - "type": "object", - "properties": { - "prefix": { - "description": "Custom prefix to be prepended to the chart attribute.\nThis field is optional.", - "type": "string" - }, - "suffix": { - "description": "Custom suffix to be appended to the chart attribute.\nThis field is optional.", - "type": "string" - } - } - }, - "Borders": { - "id": "Borders", - "description": "The borders of the cell.", - "type": "object", - "properties": { - "left": { - "$ref": "Border", - "description": "The left border of the cell." - }, - "right": { - "$ref": "Border", - "description": "The right border of the cell." - }, - "bottom": { - "$ref": "Border", - "description": "The bottom border of the cell." - }, - "top": { - "$ref": "Border", - "description": "The top border of the cell." - } - } - }, - "ManualRule": { - "type": "object", - "properties": { - "groups": { - "description": "The list of group names and the corresponding items from the source data\nthat map to each group name.", - "type": "array", - "items": { - "$ref": "ManualRuleGroup" - } - } - }, - "id": "ManualRule", - "description": "Allows you to manually organize the values in a source data column into\nbuckets with names of your choosing. For example, a pivot table that\naggregates population by state:\n\n +-------+-------------------+\n | State | SUM of Population |\n +-------+-------------------+\n | AK | 0.7 |\n | AL | 4.8 |\n | AR | 2.9 |\n ...\n +-------+-------------------+\ncould be turned into a pivot table that aggregates population by time zone\nby providing a list of groups (for example, groupName = 'Central',\nitems = ['AL', 'AR', 'IA', ...]) to a manual group rule.\nNote that a similar effect could be achieved by adding a time zone column\nto the source data and adjusting the pivot table.\n\n +-----------+-------------------+\n | Time Zone | SUM of Population |\n +-----------+-------------------+\n | Central | 106.3 |\n | Eastern | 151.9 |\n | Mountain | 17.4 |\n ...\n +-----------+-------------------+" - }, - "DeleteConditionalFormatRuleRequest": { - "id": "DeleteConditionalFormatRuleRequest", - "description": "Deletes a conditional format rule at the given index.\nAll subsequent rules' indexes are decremented.", - "type": "object", - "properties": { - "sheetId": { - "description": "The sheet the rule is being deleted from.", - "format": "int32", - "type": "integer" - }, - "index": { - "type": "integer", - "description": "The zero-based index of the rule to be deleted.", - "format": "int32" - } - } - }, - "DeleteNamedRangeRequest": { - "id": "DeleteNamedRangeRequest", - "description": "Removes the named range with the given ID from the spreadsheet.", - "type": "object", - "properties": { - "namedRangeId": { - "type": "string", - "description": "The ID of the named range to delete." - } - } - }, - "AddBandingResponse": { - "description": "The result of adding a banded range.", - "type": "object", - "properties": { - "bandedRange": { - "$ref": "BandedRange", - "description": "The banded range that was added." - } - }, - "id": "AddBandingResponse" - }, - "AddDimensionGroupResponse": { - "type": "object", - "properties": { - "dimensionGroups": { - "type": "array", - "items": { - "$ref": "DimensionGroup" - }, - "description": "All groups of a dimension after adding a group to that dimension." - } - }, - "id": "AddDimensionGroupResponse", - "description": "The result of adding a group." - }, - "ManualRuleGroup": { - "description": "A group name and a list of items from the source data that should be placed\nin the group with this name.", - "type": "object", - "properties": { - "items": { - "description": "The items in the source data that should be placed into this group. Each\nitem may be a string, number, or boolean. Items may appear in at most one\ngroup within a given ManualRule. Items that do not appear in any\ngroup will appear on their own.", - "type": "array", - "items": { - "$ref": "ExtendedValue" - } - }, - "groupName": { - "description": "The group name, which must be a string. Each group in a given\nManualRule must have a unique group name.", - "$ref": "ExtendedValue" - } - }, - "id": "ManualRuleGroup" - }, - "PivotGroup": { - "description": "A single grouping (either row or column) in a pivot table.", - "type": "object", - "properties": { - "groupRule": { - "$ref": "PivotGroupRule", - "description": "The group rule to apply to this row/column group." - }, - "label": { - "type": "string", - "description": "The labels to use for the row/column groups which can be customized. For\nexample, in the following pivot table, the row label is `Region` (which\ncould be renamed to `State`) and the column label is `Product` (which\ncould be renamed `Item`). Pivot tables created before December 2017 do\nnot have header labels. If you'd like to add header labels to an existing\npivot table, please delete the existing pivot table and then create a new\npivot table with same parameters.\n\n +--------------+---------+-------+\n | SUM of Units | Product | |\n | Region | Pen | Paper |\n +--------------+---------+-------+\n | New York | 345 | 98 |\n | Oregon | 234 | 123 |\n | Tennessee | 531 | 415 |\n +--------------+---------+-------+\n | Grand Total | 1110 | 636 |\n +--------------+---------+-------+" - }, - "repeatHeadings": { - "description": "True if the headings in this pivot group should be repeated.\nThis is only valid for row groupings and is ignored by columns.\n\nBy default, we minimize repitition of headings by not showing higher\nlevel headings where they are the same. For example, even though the\nthird row below corresponds to \"Q1 Mar\", \"Q1\" is not shown because\nit is redundant with previous rows. Setting repeat_headings to true\nwould cause \"Q1\" to be repeated for \"Feb\" and \"Mar\".\n\n +--------------+\n | Q1 | Jan |\n | | Feb |\n | | Mar |\n +--------+-----+\n | Q1 Total |\n +--------------+", - "type": "boolean" - }, - "sourceColumnOffset": { - "description": "The column offset of the source range that this grouping is based on.\n\nFor example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`\nmeans this group refers to column `C`, whereas the offset `1` would refer\nto column `D`.", - "format": "int32", - "type": "integer" - }, - "sortOrder": { - "enum": [ - "SORT_ORDER_UNSPECIFIED", - "ASCENDING", - "DESCENDING" - ], - "description": "The order the values in this group should be sorted.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use this.", - "Sort ascending.", - "Sort descending." - ] - }, - "valueBucket": { - "$ref": "PivotGroupSortValueBucket", - "description": "The bucket of the opposite pivot group to sort by.\nIf not specified, sorting is alphabetical by this group's values." - }, - "valueMetadata": { - "description": "Metadata about values in the grouping.", - "type": "array", - "items": { - "$ref": "PivotGroupValueMetadata" - } - }, - "showTotals": { - "type": "boolean", - "description": "True if the pivot table should include the totals for this grouping." - } - }, - "id": "PivotGroup" - }, - "TrimWhitespaceResponse": { - "id": "TrimWhitespaceResponse", - "description": "The result of trimming whitespace in cells.", - "type": "object", - "properties": { - "cellsChangedCount": { - "type": "integer", - "description": "The number of cells that were trimmed of whitespace.", - "format": "int32" - } - } - }, - "PivotTable": { - "description": "A pivot table.", - "type": "object", - "properties": { - "criteria": { - "description": "An optional mapping of filters per source column offset.\n\nThe filters are applied before aggregating data into the pivot table.\nThe map's key is the column offset of the source range that you want to\nfilter, and the value is the criteria for that column.\n\nFor example, if the source was `C10:E15`, a key of `0` will have the filter\nfor column `C`, whereas the key `1` is for column `D`.", - "type": "object", - "additionalProperties": { - "$ref": "PivotFilterCriteria" - } - }, - "rows": { - "description": "Each row grouping in the pivot table.", - "type": "array", - "items": { - "$ref": "PivotGroup" - } - }, - "valueLayout": { - "enum": [ - "HORIZONTAL", - "VERTICAL" - ], - "description": "Whether values should be listed horizontally (as columns)\nor vertically (as rows).", - "type": "string", - "enumDescriptions": [ - "Values are laid out horizontally (as columns).", - "Values are laid out vertically (as rows)." - ] - }, - "values": { - "description": "A list of values to include in the pivot table.", - "type": "array", - "items": { - "$ref": "PivotValue" - } - }, - "source": { - "$ref": "GridRange", - "description": "The range the pivot table is reading data from." - }, - "columns": { - "type": "array", - "items": { - "$ref": "PivotGroup" - }, - "description": "Each column grouping in the pivot table." - } - }, - "id": "PivotTable" - }, - "SearchDeveloperMetadataResponse": { - "id": "SearchDeveloperMetadataResponse", - "description": "A reply to a developer metadata search request.", - "type": "object", - "properties": { - "matchedDeveloperMetadata": { - "description": "The metadata matching the criteria of the search request.", - "type": "array", - "items": { - "$ref": "MatchedDeveloperMetadata" - } - } - } - }, - "AppendCellsRequest": { - "description": "Adds new cells after the last row with data in a sheet,\ninserting new rows into the sheet if necessary.", - "type": "object", - "properties": { - "rows": { - "type": "array", - "items": { - "$ref": "RowData" - }, - "description": "The data to append." - }, - "fields": { - "type": "string", - "description": "The fields of CellData that should be updated.\nAt least one field must be specified.\nThe root is the CellData; 'row.values.' should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask" - }, - "sheetId": { - "description": "The sheet ID to append the data to.", - "format": "int32", - "type": "integer" - } - }, - "id": "AppendCellsRequest" - }, - "TextFormatRun": { - "id": "TextFormatRun", - "description": "A run of a text format. The format of this run continues until the start\nindex of the next run.\nWhen updating, all fields must be set.", - "type": "object", - "properties": { - "format": { - "$ref": "TextFormat", - "description": "The format of this run. Absent values inherit the cell's format." - }, - "startIndex": { - "description": "The character index where this run starts.", - "format": "int32", - "type": "integer" - } - } - }, - "BatchUpdateValuesByDataFilterResponse": { - "description": "The response when updating a range of values in a spreadsheet.", - "type": "object", - "properties": { - "totalUpdatedRows": { - "description": "The total number of rows where at least one cell in the row was updated.", - "format": "int32", - "type": "integer" - }, - "responses": { - "description": "The response for each range updated.", - "type": "array", - "items": { - "$ref": "UpdateValuesByDataFilterResponse" - } - }, - "totalUpdatedSheets": { - "description": "The total number of sheets where at least one cell in the sheet was\nupdated.", - "format": "int32", - "type": "integer" - }, - "totalUpdatedCells": { - "type": "integer", - "description": "The total number of cells updated.", - "format": "int32" - }, - "totalUpdatedColumns": { - "type": "integer", - "description": "The total number of columns where at least one cell in the column was\nupdated.", - "format": "int32" - }, - "spreadsheetId": { - "type": "string", - "description": "The spreadsheet the updates were applied to." - } - }, - "id": "BatchUpdateValuesByDataFilterResponse" - }, - "RowData": { - "description": "Data about each cell in a row.", - "type": "object", - "properties": { - "values": { - "type": "array", - "items": { - "$ref": "CellData" - }, - "description": "The values in the row, one per column." - } - }, - "id": "RowData" - }, - "Border": { - "description": "A border along a cell.", - "type": "object", - "properties": { - "style": { - "description": "The style of the border.", - "type": "string", - "enumDescriptions": [ - "The style is not specified. Do not use this.", - "The border is dotted.", - "The border is dashed.", - "The border is a thin solid line.", - "The border is a medium solid line.", - "The border is a thick solid line.", - "No border.\nUsed only when updating a border in order to erase it.", - "The border is two solid lines." - ], - "enum": [ - "STYLE_UNSPECIFIED", - "DOTTED", - "DASHED", - "SOLID", - "SOLID_MEDIUM", - "SOLID_THICK", - "NONE", - "DOUBLE" - ] - }, - "color": { - "description": "The color of the border.", - "$ref": "Color" - }, - "width": { - "description": "The width of the border, in pixels.\nDeprecated; the width is determined by the \"style\" field.", - "format": "int32", - "type": "integer" - } - }, - "id": "Border" - }, - "GridData": { - "type": "object", - "properties": { - "columnMetadata": { - "description": "Metadata about the requested columns in the grid, starting with the column\nin start_column.", - "type": "array", - "items": { - "$ref": "DimensionProperties" - } - }, - "startColumn": { - "description": "The first column this GridData refers to, zero-based.", - "format": "int32", - "type": "integer" - }, - "rowMetadata": { - "description": "Metadata about the requested rows in the grid, starting with the row\nin start_row.", - "type": "array", - "items": { - "$ref": "DimensionProperties" - } - }, - "rowData": { - "type": "array", - "items": { - "$ref": "RowData" - }, - "description": "The data in the grid, one entry per row,\nstarting with the row in startRow.\nThe values in RowData will correspond to columns starting\nat start_column." - }, - "startRow": { - "type": "integer", - "description": "The first row this GridData refers to, zero-based.", - "format": "int32" - } - }, - "id": "GridData", - "description": "Data in the grid, as well as metadata about the dimensions." - }, - "FindReplaceRequest": { - "description": "Finds and replaces data in cells over a range, sheet, or all sheets.", - "type": "object", - "properties": { - "includeFormulas": { - "description": "True if the search should include cells with formulas.\nFalse to skip cells with formulas.", - "type": "boolean" - }, - "matchEntireCell": { - "description": "True if the find value should match the entire cell.", - "type": "boolean" - }, - "find": { - "type": "string", - "description": "The value to search." - }, - "searchByRegex": { - "description": "True if the find value is a regex.\nThe regular expression and replacement should follow Java regex rules\nat https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html.\nThe replacement string is allowed to refer to capturing groups.\nFor example, if one cell has the contents `\"Google Sheets\"` and another\nhas `\"Google Docs\"`, then searching for `\"o.* (.*)\"` with a replacement of\n`\"$1 Rocks\"` would change the contents of the cells to\n`\"GSheets Rocks\"` and `\"GDocs Rocks\"` respectively.", - "type": "boolean" - }, - "replacement": { - "type": "string", - "description": "The value to use as the replacement." - }, - "range": { - "description": "The range to find/replace over.", - "$ref": "GridRange" - }, - "sheetId": { - "type": "integer", - "description": "The sheet to find/replace over.", - "format": "int32" - }, - "matchCase": { - "type": "boolean", - "description": "True if the search is case sensitive." - }, - "allSheets": { - "description": "True to find/replace over all sheets.", - "type": "boolean" - } - }, - "id": "FindReplaceRequest" - }, - "UpdateNamedRangeRequest": { - "id": "UpdateNamedRangeRequest", - "description": "Updates properties of the named range with the specified\nnamedRangeId.", - "type": "object", - "properties": { - "namedRange": { - "$ref": "NamedRange", - "description": "The named range to update with the new properties." - }, - "fields": { - "type": "string", - "description": "The fields that should be updated. At least one field must be specified.\nThe root `namedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask" - } - } - }, - "UpdateCellsRequest": { - "id": "UpdateCellsRequest", - "description": "Updates all cells in a range with new data.", - "type": "object", - "properties": { - "range": { - "$ref": "GridRange", - "description": "The range to write data to.\n\nIf the data in rows does not cover the entire requested range,\nthe fields matching those set in fields will be cleared." - }, - "rows": { - "type": "array", - "items": { - "$ref": "RowData" - }, - "description": "The data to write." - }, - "fields": { - "description": "The fields of CellData that should be updated.\nAt least one field must be specified.\nThe root is the CellData; 'row.values.' should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" - }, - "start": { - "$ref": "GridCoordinate", - "description": "The coordinate to start writing data at.\nAny number of rows and columns (including a different number of\ncolumns per row) may be written." - } - } - }, - "RandomizeRangeRequest": { - "type": "object", - "properties": { - "range": { - "$ref": "GridRange", - "description": "The range to randomize." - } - }, - "id": "RandomizeRangeRequest", - "description": "Randomizes the order of the rows in a range." - }, - "DeleteRangeRequest": { - "description": "Deletes a range of cells, shifting other cells into the deleted area.", - "type": "object", - "properties": { - "shiftDimension": { - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ], - "description": "The dimension from which deleted cells will be replaced with.\nIf ROWS, existing cells will be shifted upward to\nreplace the deleted cells. If COLUMNS, existing cells\nwill be shifted left to replace the deleted cells." - }, - "range": { - "$ref": "GridRange", - "description": "The range of cells to delete." - } - }, - "id": "DeleteRangeRequest" - }, - "DeleteDuplicatesResponse": { - "type": "object", - "properties": { - "duplicatesRemovedCount": { - "description": "The number of duplicate rows removed.", - "format": "int32", - "type": "integer" - } - }, - "id": "DeleteDuplicatesResponse", - "description": "The result of removing duplicates in a range." - }, - "UnmergeCellsRequest": { - "description": "Unmerges cells in the given range.", - "type": "object", - "properties": { - "range": { - "description": "The range within which all cells should be unmerged.\nIf the range spans multiple merges, all will be unmerged.\nThe range must not partially span any merge.", - "$ref": "GridRange" - } - }, - "id": "UnmergeCellsRequest" - }, - "UpdateEmbeddedObjectPositionResponse": { - "description": "The result of updating an embedded object's position.", - "type": "object", - "properties": { - "position": { - "description": "The new position of the embedded object.", - "$ref": "EmbeddedObjectPosition" - } - }, - "id": "UpdateEmbeddedObjectPositionResponse" - }, - "SortSpec": { - "type": "object", - "properties": { - "foregroundColor": { - "$ref": "Color", - "description": "The text color to sort by. Mutually exclusive with sorting by background\nfill color. Requests to set this field will fail with a 400 error if\nbackground color is also set." - }, - "dimensionIndex": { - "description": "The dimension the sort should be applied to.", - "format": "int32", - "type": "integer" - }, - "backgroundColor": { - "$ref": "Color", - "description": "The background fill color to sort by. Mutually exclusive with sorting by\ntext color. Requests to set this field will fail with a 400 error if\nforeground color is also set." - }, - "sortOrder": { - "description": "The order data should be sorted.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use this.", - "Sort ascending.", - "Sort descending." - ], - "enum": [ - "SORT_ORDER_UNSPECIFIED", - "ASCENDING", - "DESCENDING" - ] - } - }, - "id": "SortSpec", - "description": "A sort order associated with a specific column or row." - }, - "BooleanRule": { - "description": "A rule that may or may not match, depending on the condition.", - "type": "object", - "properties": { - "format": { - "$ref": "CellFormat", - "description": "The format to apply.\nConditional formatting can only apply a subset of formatting:\nbold, italic,\nstrikethrough,\nforeground color &\nbackground color." - }, - "condition": { - "$ref": "BooleanCondition", - "description": "The condition of the rule. If the condition evaluates to true,\nthe format is applied." - } - }, - "id": "BooleanRule" - }, - "WaterfallChartSpec": { - "description": "A waterfall chart.", - "type": "object", - "properties": { - "series": { - "description": "The data this waterfall chart is visualizing.", - "type": "array", - "items": { - "$ref": "WaterfallChartSeries" - } - }, - "connectorLineStyle": { - "$ref": "LineStyle", - "description": "The line style for the connector lines." - }, - "domain": { - "$ref": "WaterfallChartDomain", - "description": "The domain data (horizontal axis) for the waterfall chart." - }, - "firstValueIsTotal": { - "description": "True to interpret the first value as a total.", - "type": "boolean" - }, - "stackedType": { - "description": "The stacked type.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "Values corresponding to the same domain (horizontal axis) value will be\nstacked vertically.", - "Series will spread out along the horizontal axis." - ], - "enum": [ - "WATERFALL_STACKED_TYPE_UNSPECIFIED", - "STACKED", - "SEQUENTIAL" - ] - }, - "hideConnectorLines": { - "description": "True to hide connector lines between columns.", - "type": "boolean" - } - }, - "id": "WaterfallChartSpec" - }, - "UpdateConditionalFormatRuleRequest": { - "description": "Updates a conditional format rule at the given index,\nor moves a conditional format rule to another index.", - "type": "object", - "properties": { - "sheetId": { - "type": "integer", - "description": "The sheet of the rule to move. Required if new_index is set,\nunused otherwise.", - "format": "int32" - }, - "newIndex": { - "type": "integer", - "description": "The zero-based new index the rule should end up at.", - "format": "int32" - }, - "rule": { - "$ref": "ConditionalFormatRule", - "description": "The rule that should replace the rule at the given index." - }, - "index": { - "description": "The zero-based index of the rule that should be replaced or moved.", - "format": "int32", - "type": "integer" - } - }, - "id": "UpdateConditionalFormatRuleRequest" - }, - "BasicChartDomain": { - "description": "The domain of a chart.\nFor example, if charting stock prices over time, this would be the date.", - "type": "object", - "properties": { - "domain": { - "$ref": "ChartData", - "description": "The data of the domain. For example, if charting stock prices over time,\nthis is the data representing the dates." - }, - "reversed": { - "description": "True to reverse the order of the domain values (horizontal axis).", - "type": "boolean" - } - }, - "id": "BasicChartDomain" - }, - "PasteDataRequest": { - "description": "Inserts data into the spreadsheet starting at the specified coordinate.", - "type": "object", - "properties": { - "type": { - "type": "string", - "enumDescriptions": [ - "Paste values, formulas, formats, and merges.", - "Paste the values ONLY without formats, formulas, or merges.", - "Paste the format and data validation only.", - "Like PASTE_NORMAL but without borders.", - "Paste the formulas only.", - "Paste the data validation only.", - "Paste the conditional formatting rules only." - ], - "enum": [ - "PASTE_NORMAL", - "PASTE_VALUES", - "PASTE_FORMAT", - "PASTE_NO_BORDERS", - "PASTE_FORMULA", - "PASTE_DATA_VALIDATION", - "PASTE_CONDITIONAL_FORMATTING" - ], - "description": "How the data should be pasted." - }, - "html": { - "description": "True if the data is HTML.", - "type": "boolean" - }, - "coordinate": { - "description": "The coordinate at which the data should start being inserted.", - "$ref": "GridCoordinate" - }, - "data": { - "description": "The data to insert.", - "type": "string" - }, - "delimiter": { - "description": "The delimiter in the data.", - "type": "string" - } - }, - "id": "PasteDataRequest" - }, - "UpdateDeveloperMetadataResponse": { - "type": "object", - "properties": { - "developerMetadata": { - "description": "The updated developer metadata.", - "type": "array", - "items": { - "$ref": "DeveloperMetadata" - } - } - }, - "id": "UpdateDeveloperMetadataResponse", - "description": "The response from updating developer metadata." - }, - "AppendDimensionRequest": { - "description": "Appends rows or columns to the end of a sheet.", - "type": "object", - "properties": { - "sheetId": { - "description": "The sheet to append rows or columns to.", - "format": "int32", - "type": "integer" - }, - "dimension": { - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ], - "description": "Whether rows or columns should be appended.", - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ] - }, - "length": { - "type": "integer", - "description": "The number of rows or columns to append.", - "format": "int32" - } - }, - "id": "AppendDimensionRequest" - }, - "AddNamedRangeRequest": { - "description": "Adds a named range to the spreadsheet.", - "type": "object", - "properties": { - "namedRange": { - "description": "The named range to add. The namedRangeId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a range that already exists.)", - "$ref": "NamedRange" - } - }, - "id": "AddNamedRangeRequest" - }, - "CreateDeveloperMetadataResponse": { - "id": "CreateDeveloperMetadataResponse", - "description": "The response from creating developer metadata.", - "type": "object", - "properties": { - "developerMetadata": { - "description": "The developer metadata that was created.", - "$ref": "DeveloperMetadata" - } - } - }, - "UpdateEmbeddedObjectPositionRequest": { - "description": "Update an embedded object's position (such as a moving or resizing a\nchart or image).", - "type": "object", - "properties": { - "fields": { - "description": "The fields of OverlayPosition\nthat should be updated when setting a new position. Used only if\nnewPosition.overlayPosition\nis set, in which case at least one field must\nbe specified. The root `newPosition.overlayPosition` is implied and\nshould not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" - }, - "objectId": { - "description": "The ID of the object to moved.", - "format": "int32", - "type": "integer" - }, - "newPosition": { - "description": "An explicit position to move the embedded object to.\nIf newPosition.sheetId is set,\na new sheet with that ID will be created.\nIf newPosition.newSheet is set to true,\na new sheet will be created with an ID that will be chosen for you.", - "$ref": "EmbeddedObjectPosition" - } - }, - "id": "UpdateEmbeddedObjectPositionRequest" - }, - "WaterfallChartColumnStyle": { - "id": "WaterfallChartColumnStyle", - "description": "Styles for a waterfall chart column.", - "type": "object", - "properties": { - "color": { - "description": "The color of the column.", - "$ref": "Color" - }, - "label": { - "description": "The label of the column's legend.", - "type": "string" - } - } - }, - "Request": { - "description": "A single kind of update to apply to a spreadsheet.", - "type": "object", - "properties": { - "updateSheetProperties": { - "$ref": "UpdateSheetPropertiesRequest", - "description": "Updates a sheet's properties." - }, - "deleteDimension": { - "description": "Deletes rows or columns in a sheet.", - "$ref": "DeleteDimensionRequest" - }, - "autoFill": { - "description": "Automatically fills in more data based on existing data.", - "$ref": "AutoFillRequest" - }, - "addSlicer": { - "$ref": "AddSlicerRequest", - "description": "Adds a slicer." - }, - "sortRange": { - "description": "Sorts data in a range.", - "$ref": "SortRangeRequest" - }, - "deleteDimensionGroup": { - "description": "Deletes a group over the specified range.", - "$ref": "DeleteDimensionGroupRequest" - }, - "deleteProtectedRange": { - "$ref": "DeleteProtectedRangeRequest", - "description": "Deletes a protected range." - }, - "duplicateFilterView": { - "$ref": "DuplicateFilterViewRequest", - "description": "Duplicates a filter view." - }, - "addChart": { - "$ref": "AddChartRequest", - "description": "Adds a chart." - }, - "findReplace": { - "$ref": "FindReplaceRequest", - "description": "Finds and replaces occurrences of some text with other text." - }, - "textToColumns": { - "$ref": "TextToColumnsRequest", - "description": "Converts a column of text into many columns of text." - }, - "updateChartSpec": { - "$ref": "UpdateChartSpecRequest", - "description": "Updates a chart's specifications." - }, - "addSheet": { - "description": "Adds a sheet.", - "$ref": "AddSheetRequest" - }, - "updateProtectedRange": { - "description": "Updates a protected range.", - "$ref": "UpdateProtectedRangeRequest" - }, - "deleteFilterView": { - "$ref": "DeleteFilterViewRequest", - "description": "Deletes a filter view from a sheet." - }, - "copyPaste": { - "$ref": "CopyPasteRequest", - "description": "Copies data from one area and pastes it to another." - }, - "insertDimension": { - "description": "Inserts new rows or columns in a sheet.", - "$ref": "InsertDimensionRequest" - }, - "deleteRange": { - "$ref": "DeleteRangeRequest", - "description": "Deletes a range of cells from a sheet, shifting the remaining cells." - }, - "deleteBanding": { - "description": "Removes a banded range", - "$ref": "DeleteBandingRequest" - }, - "addFilterView": { - "$ref": "AddFilterViewRequest", - "description": "Adds a filter view." - }, - "deleteDuplicates": { - "description": "Removes rows containing duplicate values in specified columns of a cell\nrange.", - "$ref": "DeleteDuplicatesRequest" - }, - "setDataValidation": { - "$ref": "SetDataValidationRequest", - "description": "Sets data validation for one or more cells." - }, - "updateBorders": { - "$ref": "UpdateBordersRequest", - "description": "Updates the borders in a range of cells." - }, - "deleteConditionalFormatRule": { - "$ref": "DeleteConditionalFormatRuleRequest", - "description": "Deletes an existing conditional format rule." - }, - "repeatCell": { - "description": "Repeats a single cell across a range.", - "$ref": "RepeatCellRequest" - }, - "clearBasicFilter": { - "$ref": "ClearBasicFilterRequest", - "description": "Clears the basic filter on a sheet." - }, - "appendDimension": { - "$ref": "AppendDimensionRequest", - "description": "Appends dimensions to the end of a sheet." - }, - "updateSlicerSpec": { - "$ref": "UpdateSlicerSpecRequest", - "description": "Updates a slicer's specifications." - }, - "updateConditionalFormatRule": { - "$ref": "UpdateConditionalFormatRuleRequest", - "description": "Updates an existing conditional format rule." - }, - "createDeveloperMetadata": { - "$ref": "CreateDeveloperMetadataRequest", - "description": "Creates new developer metadata" - }, - "insertRange": { - "$ref": "InsertRangeRequest", - "description": "Inserts new cells in a sheet, shifting the existing cells." - }, - "moveDimension": { - "$ref": "MoveDimensionRequest", - "description": "Moves rows or columns to another location in a sheet." - }, - "deleteDeveloperMetadata": { - "$ref": "DeleteDeveloperMetadataRequest", - "description": "Deletes developer metadata" - }, - "randomizeRange": { - "$ref": "RandomizeRangeRequest", - "description": "Randomizes the order of the rows in a range." - }, - "updateBanding": { - "$ref": "UpdateBandingRequest", - "description": "Updates a banded range" - }, - "addProtectedRange": { - "$ref": "AddProtectedRangeRequest", - "description": "Adds a protected range." - }, - "deleteNamedRange": { - "$ref": "DeleteNamedRangeRequest", - "description": "Deletes a named range." - }, - "duplicateSheet": { - "$ref": "DuplicateSheetRequest", - "description": "Duplicates a sheet." - }, - "unmergeCells": { - "description": "Unmerges merged cells.", - "$ref": "UnmergeCellsRequest" - }, - "deleteSheet": { - "description": "Deletes a sheet.", - "$ref": "DeleteSheetRequest" - }, - "updateEmbeddedObjectPosition": { - "$ref": "UpdateEmbeddedObjectPositionRequest", - "description": "Updates an embedded object's (e.g. chart, image) position." - }, - "addDimensionGroup": { - "description": "Creates a group over the specified range.", - "$ref": "AddDimensionGroupRequest" - }, - "updateDeveloperMetadata": { - "$ref": "UpdateDeveloperMetadataRequest", - "description": "Updates an existing developer metadata entry" - }, - "updateDimensionProperties": { - "$ref": "UpdateDimensionPropertiesRequest", - "description": "Updates dimensions' properties." - }, - "pasteData": { - "$ref": "PasteDataRequest", - "description": "Pastes data (HTML or delimited) into a sheet." - }, - "updateDimensionGroup": { - "$ref": "UpdateDimensionGroupRequest", - "description": "Updates the state of the specified group." - }, - "setBasicFilter": { - "$ref": "SetBasicFilterRequest", - "description": "Sets the basic filter on a sheet." - }, - "addConditionalFormatRule": { - "description": "Adds a new conditional format rule.", - "$ref": "AddConditionalFormatRuleRequest" - }, - "addNamedRange": { - "description": "Adds a named range.", - "$ref": "AddNamedRangeRequest" - }, - "updateCells": { - "$ref": "UpdateCellsRequest", - "description": "Updates many cells at once." - }, - "updateSpreadsheetProperties": { - "$ref": "UpdateSpreadsheetPropertiesRequest", - "description": "Updates the spreadsheet's properties." - }, - "trimWhitespace": { - "$ref": "TrimWhitespaceRequest", - "description": "Trims cells of whitespace (such as spaces, tabs, or new lines)." - }, - "deleteEmbeddedObject": { - "$ref": "DeleteEmbeddedObjectRequest", - "description": "Deletes an embedded object (e.g, chart, image) in a sheet." - }, - "updateFilterView": { - "$ref": "UpdateFilterViewRequest", - "description": "Updates the properties of a filter view." - }, - "addBanding": { - "$ref": "AddBandingRequest", - "description": "Adds a new banded range" - }, - "appendCells": { - "description": "Appends cells after the last row with data in a sheet.", - "$ref": "AppendCellsRequest" - }, - "autoResizeDimensions": { - "$ref": "AutoResizeDimensionsRequest", - "description": "Automatically resizes one or more dimensions based on the contents\nof the cells in that dimension." - }, - "cutPaste": { - "$ref": "CutPasteRequest", - "description": "Cuts data from one area and pastes it to another." - }, - "mergeCells": { - "$ref": "MergeCellsRequest", - "description": "Merges cells together." - }, - "updateNamedRange": { - "$ref": "UpdateNamedRangeRequest", - "description": "Updates a named range." - } - }, - "id": "Request" - }, - "GridRange": { - "type": "object", - "properties": { - "sheetId": { - "description": "The sheet this range is on.", - "format": "int32", - "type": "integer" - }, - "endRowIndex": { - "description": "The end row (exclusive) of the range, or not set if unbounded.", - "format": "int32", - "type": "integer" - }, - "endColumnIndex": { - "description": "The end column (exclusive) of the range, or not set if unbounded.", - "format": "int32", - "type": "integer" - }, - "startRowIndex": { - "description": "The start row (inclusive) of the range, or not set if unbounded.", - "format": "int32", - "type": "integer" - }, - "startColumnIndex": { - "description": "The start column (inclusive) of the range, or not set if unbounded.", - "format": "int32", - "type": "integer" - } - }, - "id": "GridRange", - "description": "A range on a sheet.\nAll indexes are zero-based.\nIndexes are half open, e.g the start index is inclusive\nand the end index is exclusive -- [start_index, end_index).\nMissing indexes indicate the range is unbounded on that side.\n\nFor example, if `\"Sheet1\"` is sheet ID 0, then:\n\n `Sheet1!A1:A1 == sheet_id: 0,\n start_row_index: 0, end_row_index: 1,\n start_column_index: 0, end_column_index: 1`\n\n `Sheet1!A3:B4 == sheet_id: 0,\n start_row_index: 2, end_row_index: 4,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1!A:B == sheet_id: 0,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1!A5:B == sheet_id: 0,\n start_row_index: 4,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1 == sheet_id:0`\n\nThe start index must always be less than or equal to the end index.\nIf the start index equals the end index, then the range is empty.\nEmpty ranges are typically not meaningful and are usually rendered in the\nUI as `#REF!`." - }, - "WaterfallChartDomain": { - "description": "The domain of a waterfall chart.", - "type": "object", - "properties": { - "reversed": { - "description": "True to reverse the order of the domain values (horizontal axis).", - "type": "boolean" - }, - "data": { - "$ref": "ChartData", - "description": "The data of the WaterfallChartDomain." - } - }, - "id": "WaterfallChartDomain" - }, - "DeleteDimensionGroupRequest": { - "description": "Deletes a group over the specified range by decrementing the depth of the\ndimensions in the range.\n\nFor example, assume the sheet has a depth-1 group over B:E and a depth-2\ngroup over C:D. Deleting a group over D:E leaves the sheet with a\ndepth-1 group over B:D and a depth-2 group over C:C.", - "type": "object", - "properties": { - "range": { - "description": "The range of the group to be deleted.", - "$ref": "DimensionRange" - } - }, - "id": "DeleteDimensionGroupRequest" - }, - "SetDataValidationRequest": { - "description": "Sets a data validation rule to every cell in the range.\nTo clear validation in a range, call this with no rule specified.", - "type": "object", - "properties": { - "rule": { - "$ref": "DataValidationRule", - "description": "The data validation rule to set on each cell in the range,\nor empty to clear the data validation in the range." - }, - "range": { - "description": "The range the data validation rule should apply to.", - "$ref": "GridRange" - } - }, - "id": "SetDataValidationRequest" - }, - "BubbleChartSpec": { - "id": "BubbleChartSpec", - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/bubblechart\"\u003ebubble chart\u003c/a\u003e.", - "type": "object", - "properties": { - "series": { - "$ref": "ChartData", - "description": "The data contianing the bubble y-values. These values locate the bubbles\nin the chart vertically." - }, - "legendPosition": { - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "The legend is rendered on the bottom of the chart.", - "The legend is rendered on the left of the chart.", - "The legend is rendered on the right of the chart.", - "The legend is rendered on the top of the chart.", - "No legend is rendered.", - "The legend is rendered inside the chart area." - ], - "enum": [ - "BUBBLE_CHART_LEGEND_POSITION_UNSPECIFIED", - "BOTTOM_LEGEND", - "LEFT_LEGEND", - "RIGHT_LEGEND", - "TOP_LEGEND", - "NO_LEGEND", - "INSIDE_LEGEND" - ], - "description": "Where the legend of the chart should be drawn." - }, - "domain": { - "$ref": "ChartData", - "description": "The data containing the bubble x-values. These values locate the bubbles\nin the chart horizontally." - }, - "bubbleSizes": { - "description": "The data contianing the bubble sizes. Bubble sizes are used to draw\nthe bubbles at different sizes relative to each other.\nIf specified, group_ids must also be specified. This field is\noptional.", - "$ref": "ChartData" - }, - "bubbleOpacity": { - "description": "The opacity of the bubbles between 0 and 1.0.\n0 is fully transparent and 1 is fully opaque.", - "format": "float", - "type": "number" - }, - "bubbleTextStyle": { - "$ref": "TextFormat", - "description": "The format of the text inside the bubbles.\nUnderline and Strikethrough are not supported." - }, - "bubbleBorderColor": { - "$ref": "Color", - "description": "The bubble border color." - }, - "groupIds": { - "description": "The data containing the bubble group IDs. All bubbles with the same group\nID are drawn in the same color. If bubble_sizes is specified then\nthis field must also be specified but may contain blank values.\nThis field is optional.", - "$ref": "ChartData" - }, - "bubbleLabels": { - "$ref": "ChartData", - "description": "The data containing the bubble labels. These do not need to be unique." - }, - "bubbleMinRadiusSize": { - "description": "The minimum radius size of the bubbles, in pixels.\nIf specific, the field must be a positive value.", - "format": "int32", - "type": "integer" - }, - "bubbleMaxRadiusSize": { - "description": "The max radius size of the bubbles, in pixels.\nIf specified, the field must be a positive value.", - "format": "int32", - "type": "integer" - } - } - }, - "TextPosition": { - "description": "Position settings for text.", - "type": "object", - "properties": { - "horizontalAlignment": { - "type": "string", - "enumDescriptions": [ - "The horizontal alignment is not specified. Do not use this.", - "The text is explicitly aligned to the left of the cell.", - "The text is explicitly aligned to the center of the cell.", - "The text is explicitly aligned to the right of the cell." - ], - "enum": [ - "HORIZONTAL_ALIGN_UNSPECIFIED", - "LEFT", - "CENTER", - "RIGHT" - ], - "description": "Horizontal alignment setting for the piece of text." - } - }, - "id": "TextPosition" - }, - "BatchUpdateSpreadsheetRequest": { - "type": "object", - "properties": { - "includeSpreadsheetInResponse": { - "description": "Determines if the update response should include the spreadsheet\nresource.", - "type": "boolean" - }, - "responseRanges": { - "description": "Limits the ranges included in the response spreadsheet.\nMeaningful only if include_spreadsheet_response is 'true'.", - "type": "array", - "items": { - "type": "string" - } - }, - "responseIncludeGridData": { - "description": "True if grid data should be returned. Meaningful only if\nif include_spreadsheet_in_response is 'true'.\nThis parameter is ignored if a field mask was set in the request.", - "type": "boolean" - }, - "requests": { - "type": "array", - "items": { - "$ref": "Request" - }, - "description": "A list of updates to apply to the spreadsheet.\nRequests will be applied in the order they are specified.\nIf any request is not valid, no requests will be applied." - } - }, - "id": "BatchUpdateSpreadsheetRequest", - "description": "The request for updating any aspect of a spreadsheet." - }, - "Padding": { - "description": "The amount of padding around the cell, in pixels.\nWhen updating padding, every field must be specified.", - "type": "object", - "properties": { - "left": { - "description": "The left padding of the cell.", - "format": "int32", - "type": "integer" - }, - "right": { - "description": "The right padding of the cell.", - "format": "int32", - "type": "integer" - }, - "bottom": { - "description": "The bottom padding of the cell.", - "format": "int32", - "type": "integer" - }, - "top": { - "description": "The top padding of the cell.", - "format": "int32", - "type": "integer" - } - }, - "id": "Padding" - }, - "BasicChartAxis": { - "type": "object", - "properties": { - "viewWindowOptions": { - "description": "The view window options for this axis.", - "$ref": "ChartAxisViewWindowOptions" - }, - "position": { - "description": "The position of this axis.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "The axis rendered at the bottom of a chart.\nFor most charts, this is the standard major axis.\nFor bar charts, this is a minor axis.", - "The axis rendered at the left of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is the standard major axis.", - "The axis rendered at the right of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is an unusual major axis." - ], - "enum": [ - "BASIC_CHART_AXIS_POSITION_UNSPECIFIED", - "BOTTOM_AXIS", - "LEFT_AXIS", - "RIGHT_AXIS" - ] - }, - "title": { - "type": "string", - "description": "The title of this axis. If set, this overrides any title inferred\nfrom headers of the data." - }, - "titleTextPosition": { - "$ref": "TextPosition", - "description": "The axis title text position." - }, - "format": { - "$ref": "TextFormat", - "description": "The format of the title.\nOnly valid if the axis is not associated with the domain." - } - }, - "id": "BasicChartAxis", - "description": "An axis of the chart.\nA chart may not have more than one axis per\naxis position." - }, - "DeleteDimensionRequest": { - "type": "object", - "properties": { - "range": { - "$ref": "DimensionRange", - "description": "The dimensions to delete from the sheet." - } - }, - "id": "DeleteDimensionRequest", - "description": "Deletes the dimensions from the sheet." - }, - "UpdateChartSpecRequest": { - "type": "object", - "properties": { - "chartId": { - "description": "The ID of the chart to update.", - "format": "int32", - "type": "integer" - }, - "spec": { - "description": "The specification to apply to the chart.", - "$ref": "ChartSpec" - } - }, - "id": "UpdateChartSpecRequest", - "description": "Updates a chart's specifications.\n(This does not move or resize a chart. To move or resize a chart, use\n UpdateEmbeddedObjectPositionRequest.)" - }, - "DeleteFilterViewRequest": { - "type": "object", - "properties": { - "filterId": { - "description": "The ID of the filter to delete.", - "format": "int32", - "type": "integer" - } - }, - "id": "DeleteFilterViewRequest", - "description": "Deletes a particular filter view." - }, - "BatchGetValuesByDataFilterRequest": { - "description": "The request for retrieving a range of values in a spreadsheet selected by a\nset of DataFilters.", - "type": "object", - "properties": { - "dataFilters": { - "description": "The data filters used to match the ranges of values to retrieve. Ranges\nthat match any of the specified data filters will be included in the\nresponse.", - "type": "array", - "items": { - "$ref": "DataFilter" - } - }, - "valueRenderOption": { - "enumDescriptions": [ - "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", - "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", - "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." - ], - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ], - "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string" - }, - "dateTimeRenderOption": { - "type": "string", - "enumDescriptions": [ - "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", - "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." - ], - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER]." - }, - "majorDimension": { - "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen a request that selects that range and sets `majorDimension=ROWS` will\nreturn `[[1,2],[3,4]]`,\nwhereas a request that sets `majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.", - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ] - } - }, - "id": "BatchGetValuesByDataFilterRequest" - }, - "BatchUpdateValuesResponse": { - "id": "BatchUpdateValuesResponse", - "description": "The response when updating a range of values in a spreadsheet.", - "type": "object", - "properties": { - "totalUpdatedRows": { - "description": "The total number of rows where at least one cell in the row was updated.", - "format": "int32", - "type": "integer" - }, - "responses": { - "description": "One UpdateValuesResponse per requested range, in the same order as\nthe requests appeared.", - "type": "array", - "items": { - "$ref": "UpdateValuesResponse" - } - }, - "totalUpdatedSheets": { - "description": "The total number of sheets where at least one cell in the sheet was\nupdated.", - "format": "int32", - "type": "integer" - }, - "totalUpdatedCells": { - "description": "The total number of cells updated.", - "format": "int32", - "type": "integer" - }, - "totalUpdatedColumns": { - "description": "The total number of columns where at least one cell in the column was\nupdated.", - "format": "int32", - "type": "integer" - }, - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", - "type": "string" - } - } - }, - "BatchClearValuesRequest": { - "id": "BatchClearValuesRequest", - "description": "The request for clearing more than one range of values in a spreadsheet.", - "type": "object", - "properties": { - "ranges": { - "description": "The ranges to clear, in A1 notation.", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "KeyValueFormat": { - "type": "object", - "properties": { - "position": { - "$ref": "TextPosition", - "description": "Specifies the horizontal text positioning of key value.\nThis field is optional. If not specified, default positioning is used." - }, - "textFormat": { - "$ref": "TextFormat", - "description": "Text formatting options for key value." - } - }, - "id": "KeyValueFormat", - "description": "Formatting options for key value." - }, - "DeveloperMetadata": { - "type": "object", - "properties": { - "metadataKey": { - "description": "The metadata key. There may be multiple metadata in a spreadsheet with the\nsame key. Developer metadata must always have a key specified.", - "type": "string" - }, - "metadataId": { - "description": "The spreadsheet-scoped unique ID that identifies the metadata. IDs may be\nspecified when metadata is created, otherwise one will be randomly\ngenerated and assigned. Must be positive.", - "format": "int32", - "type": "integer" - }, - "location": { - "$ref": "DeveloperMetadataLocation", - "description": "The location where the metadata is associated." - }, - "visibility": { - "type": "string", - "enumDescriptions": [ - "Default value.", - "Document-visible metadata is accessible from any developer project with\naccess to the document.", - "Project-visible metadata is only visible to and accessible by the developer\nproject that created the metadata." - ], - "enum": [ - "DEVELOPER_METADATA_VISIBILITY_UNSPECIFIED", - "DOCUMENT", - "PROJECT" - ], - "description": "The metadata visibility. Developer metadata must always have a visibility\nspecified." - }, - "metadataValue": { - "description": "Data associated with the metadata's key.", - "type": "string" - } - }, - "id": "DeveloperMetadata", - "description": "Developer metadata associated with a location or object in a spreadsheet.\nDeveloper metadata may be used to associate arbitrary data with various\nparts of a spreadsheet and will remain associated at those locations as they\nmove around and the spreadsheet is edited. For example, if developer\nmetadata is associated with row 5 and another row is then subsequently\ninserted above row 5, that original metadata will still be associated with\nthe row it was first associated with (what is now row 6). If the associated\nobject is deleted its metadata is deleted too." - }, - "BaselineValueFormat": { - "description": "Formatting options for baseline value.", - "type": "object", - "properties": { - "negativeColor": { - "$ref": "Color", - "description": "Color to be used, in case baseline value represents a negative change for\nkey value. This field is optional." - }, - "comparisonType": { - "enumDescriptions": [ - "Default value, do not use.", - "Use absolute difference between key and baseline value.", - "Use percentage difference between key and baseline value." - ], - "enum": [ - "COMPARISON_TYPE_UNDEFINED", - "ABSOLUTE_DIFFERENCE", - "PERCENTAGE_DIFFERENCE" - ], - "description": "The comparison type of key value with baseline value.", - "type": "string" - }, - "position": { - "$ref": "TextPosition", - "description": "Specifies the horizontal text positioning of baseline value.\nThis field is optional. If not specified, default positioning is used." - }, - "positiveColor": { - "$ref": "Color", - "description": "Color to be used, in case baseline value represents a positive change for\nkey value. This field is optional." - }, - "textFormat": { - "description": "Text formatting options for baseline value.", - "$ref": "TextFormat" - }, - "description": { - "type": "string", - "description": "Description which is appended after the baseline value.\nThis field is optional." - } - }, - "id": "BaselineValueFormat" - }, - "DimensionGroup": { - "type": "object", - "properties": { - "collapsed": { - "description": "This field is true if this group is collapsed. A collapsed group remains\ncollapsed if an overlapping group at a shallower depth is expanded.\n\nA true value does not imply that all dimensions within the group are\nhidden, since a dimension's visibility can change independently from this\ngroup property. However, when this property is updated, all dimensions\nwithin it are set to hidden if this field is true, or set to visible if\nthis field is false.", - "type": "boolean" - }, - "range": { - "$ref": "DimensionRange", - "description": "The range over which this group exists." - }, - "depth": { - "type": "integer", - "description": "The depth of the group, representing how many groups have a range that\nwholly contains the range of this group.", - "format": "int32" - } - }, - "id": "DimensionGroup", - "description": "A group over an interval of rows or columns on a sheet, which can contain or\nbe contained within other groups. A group can be collapsed or expanded as a\nunit on the sheet." - }, - "ClearBasicFilterRequest": { - "type": "object", - "properties": { - "sheetId": { - "type": "integer", - "description": "The sheet ID on which the basic filter should be cleared.", - "format": "int32" - } - }, - "id": "ClearBasicFilterRequest", - "description": "Clears the basic filter, if any exists on the sheet." - }, - "TextToColumnsRequest": { - "id": "TextToColumnsRequest", - "description": "Splits a column of text into multiple columns,\nbased on a delimiter in each cell.", - "type": "object", - "properties": { - "delimiter": { - "description": "The delimiter to use. Used only if delimiterType is\nCUSTOM.", - "type": "string" - }, - "source": { - "$ref": "GridRange", - "description": "The source data range. This must span exactly one column." - }, - "delimiterType": { - "description": "The delimiter type to use.", - "type": "string", - "enumDescriptions": [ - "Default value. This value must not be used.", - "\",\"", - "\";\"", - "\".\"", - "\" \"", - "A custom value as defined in delimiter.", - "Automatically detect columns." - ], - "enum": [ - "DELIMITER_TYPE_UNSPECIFIED", - "COMMA", - "SEMICOLON", - "PERIOD", - "SPACE", - "CUSTOM", - "AUTODETECT" - ] - } - } - }, - "DeleteBandingRequest": { - "id": "DeleteBandingRequest", - "description": "Removes the banded range with the given ID from the spreadsheet.", - "type": "object", - "properties": { - "bandedRangeId": { - "description": "The ID of the banded range to delete.", - "format": "int32", - "type": "integer" - } - } - }, - "AppendValuesResponse": { - "description": "The response when updating a range of values in a spreadsheet.", - "type": "object", - "properties": { - "updates": { - "description": "Information about the updates that were applied.", - "$ref": "UpdateValuesResponse" - }, - "tableRange": { - "description": "The range (in A1 notation) of the table that values are being appended to\n(before the values were appended).\nEmpty if no table was found.", - "type": "string" - }, - "spreadsheetId": { - "type": "string", - "description": "The spreadsheet the updates were applied to." - } - }, - "id": "AppendValuesResponse" - }, - "PivotFilterCriteria": { - "type": "object", - "properties": { - "visibleValues": { - "description": "Values that should be included. Values not listed here are excluded.", - "type": "array", - "items": { - "type": "string" - } - } - }, - "id": "PivotFilterCriteria", - "description": "Criteria for showing/hiding rows in a pivot table." - }, - "MoveDimensionRequest": { - "description": "Moves one or more rows or columns.", - "type": "object", - "properties": { - "source": { - "$ref": "DimensionRange", - "description": "The source dimensions to move." - }, - "destinationIndex": { - "description": "The zero-based start index of where to move the source data to,\nbased on the coordinates *before* the source data is removed\nfrom the grid. Existing data will be shifted down or right\n(depending on the dimension) to make room for the moved dimensions.\nThe source dimensions are removed from the grid, so the\nthe data may end up in a different index than specified.\n\nFor example, given `A1..A5` of `0, 1, 2, 3, 4` and wanting to move\n`\"1\"` and `\"2\"` to between `\"3\"` and `\"4\"`, the source would be\n`ROWS [1..3)`,and the destination index would be `\"4\"`\n(the zero-based index of row 5).\nThe end result would be `A1..A5` of `0, 3, 1, 2, 4`.", - "format": "int32", - "type": "integer" - } - }, - "id": "MoveDimensionRequest" - }, - "AddConditionalFormatRuleRequest": { - "description": "Adds a new conditional format rule at the given index.\nAll subsequent rules' indexes are incremented.", - "type": "object", - "properties": { - "index": { - "description": "The zero-based index where the rule should be inserted.", - "format": "int32", - "type": "integer" - }, - "rule": { - "$ref": "ConditionalFormatRule", - "description": "The rule to add." - } - }, - "id": "AddConditionalFormatRuleRequest" - }, - "ChartSpec": { - "description": "The specifications of a chart.", - "type": "object", - "properties": { - "subtitleTextFormat": { - "$ref": "TextFormat", - "description": "The subtitle text format.\nStrikethrough and underline are not supported." - }, - "subtitle": { - "description": "The subtitle of the chart.", - "type": "string" - }, - "backgroundColor": { - "$ref": "Color", - "description": "The background color of the entire chart.\nNot applicable to Org charts." - }, - "subtitleTextPosition": { - "description": "The subtitle text position.\nThis field is optional.", - "$ref": "TextPosition" - }, - "basicChart": { - "$ref": "BasicChartSpec", - "description": "A basic chart specification, can be one of many kinds of charts.\nSee BasicChartType for the list of all\ncharts this supports." - }, - "orgChart": { - "description": "An org chart specification.", - "$ref": "OrgChartSpec" - }, - "scorecardChart": { - "description": "A scorecard chart specification.", - "$ref": "ScorecardChartSpec" - }, - "pieChart": { - "$ref": "PieChartSpec", - "description": "A pie chart specification." - }, - "titleTextFormat": { - "$ref": "TextFormat", - "description": "The title text format.\nStrikethrough and underline are not supported." - }, - "title": { - "description": "The title of the chart.", - "type": "string" - }, - "altText": { - "type": "string", - "description": "The alternative text that describes the chart. This is often used\nfor accessibility." - }, - "titleTextPosition": { - "$ref": "TextPosition", - "description": "The title text position.\nThis field is optional." - }, - "histogramChart": { - "description": "A histogram chart specification.", - "$ref": "HistogramChartSpec" - }, - "candlestickChart": { - "$ref": "CandlestickChartSpec", - "description": "A candlestick chart specification." - }, - "bubbleChart": { - "$ref": "BubbleChartSpec", - "description": "A bubble chart specification." - }, - "waterfallChart": { - "description": "A waterfall chart specification.", - "$ref": "WaterfallChartSpec" - }, - "fontName": { - "description": "The name of the font to use by default for all chart text (e.g. title,\naxis labels, legend). If a font is specified for a specific part of the\nchart it will override this font name.", - "type": "string" - }, - "maximized": { - "type": "boolean", - "description": "True to make a chart fill the entire space in which it's rendered with\nminimum padding. False to use the default padding.\n(Not applicable to Geo and Org charts.)" - }, - "treemapChart": { - "$ref": "TreemapChartSpec", - "description": "A treemap chart specification." - }, - "hiddenDimensionStrategy": { - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "Charts will skip hidden rows and columns.", - "Charts will skip hidden rows only.", - "Charts will skip hidden columns only.", - "Charts will not skip any hidden rows or columns." - ], - "enum": [ - "CHART_HIDDEN_DIMENSION_STRATEGY_UNSPECIFIED", - "SKIP_HIDDEN_ROWS_AND_COLUMNS", - "SKIP_HIDDEN_ROWS", - "SKIP_HIDDEN_COLUMNS", - "SHOW_ALL" - ], - "description": "Determines how the charts will use hidden rows or columns." - } - }, - "id": "ChartSpec" - }, - "CreateDeveloperMetadataRequest": { - "type": "object", - "properties": { - "developerMetadata": { - "$ref": "DeveloperMetadata", - "description": "The developer metadata to create." - } - }, - "id": "CreateDeveloperMetadataRequest", - "description": "A request to create developer metadata." - }, - "BatchGetValuesByDataFilterResponse": { - "description": "The response when retrieving more than one range of values in a spreadsheet\nselected by DataFilters.", - "type": "object", - "properties": { - "valueRanges": { - "description": "The requested values with the list of data filters that matched them.", - "type": "array", - "items": { - "$ref": "MatchedValueRange" - } - }, - "spreadsheetId": { - "description": "The ID of the spreadsheet the data was retrieved from.", - "type": "string" - } - }, - "id": "BatchGetValuesByDataFilterResponse" - }, - "LineStyle": { - "description": "Properties that describe the style of a line.", - "type": "object", - "properties": { - "type": { - "description": "The dash type of the line.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "No dash type, which is equivalent to a non-visible line.", - "A custom dash for a line. Modifying the exact custom dash style is\ncurrently unsupported.", - "A solid line.", - "A dotted line.", - "A dashed line where the dashes have \"medium\" length.", - "A line that alternates between a \"medium\" dash and a dot.", - "A dashed line where the dashes have \"long\" length.", - "A line that alternates between a \"long\" dash and a dot." - ], - "enum": [ - "LINE_DASH_TYPE_UNSPECIFIED", - "INVISIBLE", - "CUSTOM", - "SOLID", - "DOTTED", - "MEDIUM_DASHED", - "MEDIUM_DASHED_DOTTED", - "LONG_DASHED", - "LONG_DASHED_DOTTED" - ] - }, - "width": { - "description": "The thickness of the line, in px.", - "format": "int32", - "type": "integer" - } - }, - "id": "LineStyle" - }, - "CandlestickDomain": { - "description": "The domain of a CandlestickChart.", - "type": "object", - "properties": { - "data": { - "$ref": "ChartData", - "description": "The data of the CandlestickDomain." - }, - "reversed": { - "description": "True to reverse the order of the domain values (horizontal axis).", - "type": "boolean" - } - }, - "id": "CandlestickDomain" - }, - "SheetProperties": { - "type": "object", - "properties": { - "hidden": { - "description": "True if the sheet is hidden in the UI, false if it's visible.", - "type": "boolean" - }, - "sheetType": { - "description": "The type of sheet. Defaults to GRID.\nThis field cannot be changed once set.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "The sheet is a grid.", - "The sheet has no grid and instead has an object like a chart or image." - ], - "enum": [ - "SHEET_TYPE_UNSPECIFIED", - "GRID", - "OBJECT" - ] - }, - "gridProperties": { - "description": "Additional properties of the sheet if this sheet is a grid.\n(If the sheet is an object sheet, containing a chart or image, then\nthis field will be absent.)\nWhen writing it is an error to set any grid properties on non-grid sheets.", - "$ref": "GridProperties" - }, - "title": { - "type": "string", - "description": "The name of the sheet." - }, - "index": { - "description": "The index of the sheet within the spreadsheet.\nWhen adding or updating sheet properties, if this field\nis excluded then the sheet is added or moved to the end\nof the sheet list. When updating sheet indices or inserting\nsheets, movement is considered in \"before the move\" indexes.\nFor example, if there were 3 sheets (S1, S2, S3) in order to\nmove S1 ahead of S2 the index would have to be set to 2. A sheet\nindex update request is ignored if the requested index is\nidentical to the sheets current index or if the requested new\nindex is equal to the current sheet index + 1.", - "format": "int32", - "type": "integer" - }, - "tabColor": { - "$ref": "Color", - "description": "The color of the tab in the UI." - }, - "sheetId": { - "description": "The ID of the sheet. Must be non-negative.\nThis field cannot be changed once set.", - "format": "int32", - "type": "integer" - }, - "rightToLeft": { - "description": "True if the sheet is an RTL sheet instead of an LTR sheet.", - "type": "boolean" - } - }, - "id": "SheetProperties", - "description": "Properties of a sheet." - }, - "UpdateDimensionPropertiesRequest": { - "description": "Updates properties of dimensions within the specified range.", - "type": "object", - "properties": { - "properties": { - "$ref": "DimensionProperties", - "description": "Properties to update." - }, - "range": { - "$ref": "DimensionRange", - "description": "The rows or columns to update." - }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `properties` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" - } - }, - "id": "UpdateDimensionPropertiesRequest" - }, - "SourceAndDestination": { - "description": "A combination of a source range and how to extend that source.", - "type": "object", - "properties": { - "source": { - "description": "The location of the data to use as the source of the autofill.", - "$ref": "GridRange" - }, - "dimension": { - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ], - "description": "The dimension that data should be filled into.", - "type": "string" - }, - "fillLength": { - "type": "integer", - "description": "The number of rows or columns that data should be filled into.\nPositive numbers expand beyond the last row or last column\nof the source. Negative numbers expand before the first row\nor first column of the source.", - "format": "int32" - } - }, - "id": "SourceAndDestination" - }, - "SlicerSpec": { - "type": "object", - "properties": { - "title": { - "type": "string", - "description": "The title of the slicer." - }, - "horizontalAlignment": { - "description": "The horizontal alignment of title in the slicer.\nIf unspecified, defaults to `LEFT`", - "type": "string", - "enumDescriptions": [ - "The horizontal alignment is not specified. Do not use this.", - "The text is explicitly aligned to the left of the cell.", - "The text is explicitly aligned to the center of the cell.", - "The text is explicitly aligned to the right of the cell." - ], - "enum": [ - "HORIZONTAL_ALIGN_UNSPECIFIED", - "LEFT", - "CENTER", - "RIGHT" - ] - }, - "textFormat": { - "$ref": "TextFormat", - "description": "The text format of title in the slicer." - }, - "backgroundColor": { - "$ref": "Color", - "description": "The background color of the slicer." - }, - "filterCriteria": { - "$ref": "FilterCriteria", - "description": "The filtering criteria of the slicer." - }, - "dataRange": { - "description": "The data range of the slicer.", - "$ref": "GridRange" - }, - "applyToPivotTables": { - "description": "True if the filter should apply to pivot tables.\nIf not set, default to `True`.", - "type": "boolean" - }, - "columnIndex": { - "description": "The column index in the data table on which the filter is applied to.", - "format": "int32", - "type": "integer" - } - }, - "id": "SlicerSpec", - "description": "The specifications of a slicer." - }, - "CandlestickSeries": { - "id": "CandlestickSeries", - "description": "The series of a CandlestickData.", - "type": "object", - "properties": { - "data": { - "$ref": "ChartData", - "description": "The data of the CandlestickSeries." - } - } - }, - "HistogramChartSpec": { - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/histogram\"\u003ehistogram chart\u003c/a\u003e.\nA histogram chart groups data items into bins, displaying each bin as a\ncolumn of stacked items. Histograms are used to display the distribution\nof a dataset. Each column of items represents a range into which those\nitems fall. The number of bins can be chosen automatically or specified\nexplicitly.", - "type": "object", - "properties": { - "bucketSize": { - "description": "By default the bucket size (the range of values stacked in a single\ncolumn) is chosen automatically, but it may be overridden here.\nE.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc.\nCannot be negative.\nThis field is optional.", - "format": "double", - "type": "number" - }, - "outlierPercentile": { - "type": "number", - "description": "The outlier percentile is used to ensure that outliers do not adversely\naffect the calculation of bucket sizes. For example, setting an outlier\npercentile of 0.05 indicates that the top and bottom 5% of values when\ncalculating buckets. The values are still included in the chart, they will\nbe added to the first or last buckets instead of their own buckets.\nMust be between 0.0 and 0.5.", - "format": "double" - }, - "showItemDividers": { - "description": "Whether horizontal divider lines should be displayed between items in each\ncolumn.", - "type": "boolean" - }, - "series": { - "description": "The series for a histogram may be either a single series of values to be\nbucketed or multiple series, each of the same length, containing the name\nof the series followed by the values to be bucketed for that series.", - "type": "array", - "items": { - "$ref": "HistogramSeries" - } - }, - "legendPosition": { - "description": "The position of the chart legend.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "The legend is rendered on the bottom of the chart.", - "The legend is rendered on the left of the chart.", - "The legend is rendered on the right of the chart.", - "The legend is rendered on the top of the chart.", - "No legend is rendered.", - "The legend is rendered inside the chart area." - ], - "enum": [ - "HISTOGRAM_CHART_LEGEND_POSITION_UNSPECIFIED", - "BOTTOM_LEGEND", - "LEFT_LEGEND", - "RIGHT_LEGEND", - "TOP_LEGEND", - "NO_LEGEND", - "INSIDE_LEGEND" - ] - } - }, - "id": "HistogramChartSpec" - }, - "UpdateValuesResponse": { - "id": "UpdateValuesResponse", - "description": "The response when updating a range of values in a spreadsheet.", - "type": "object", - "properties": { - "updatedColumns": { - "description": "The number of columns where at least one cell in the column was updated.", - "format": "int32", - "type": "integer" - }, - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", - "type": "string" - }, - "updatedRange": { - "description": "The range (in A1 notation) that updates were applied to.", - "type": "string" - }, - "updatedCells": { - "type": "integer", - "description": "The number of cells updated.", - "format": "int32" - }, - "updatedData": { - "$ref": "ValueRange", - "description": "The values of the cells after updates were applied.\nThis is only included if the request's `includeValuesInResponse` field\nwas `true`." - }, - "updatedRows": { - "description": "The number of rows where at least one cell in the row was updated.", - "format": "int32", - "type": "integer" - } - } - }, - "WaterfallChartSeries": { - "description": "A single series of data for a waterfall chart.", - "type": "object", - "properties": { - "customSubtotals": { - "type": "array", - "items": { - "$ref": "WaterfallChartCustomSubtotal" - }, - "description": "Custom subtotal columns appearing in this series. The order in which\nsubtotals are defined is not significant. Only one subtotal may be\ndefined for each data point." - }, - "subtotalColumnsStyle": { - "$ref": "WaterfallChartColumnStyle", - "description": "Styles for all subtotal columns in this series." - }, - "positiveColumnsStyle": { - "description": "Styles for all columns in this series with positive values.", - "$ref": "WaterfallChartColumnStyle" - }, - "data": { - "$ref": "ChartData", - "description": "The data being visualized in this series." - }, - "negativeColumnsStyle": { - "$ref": "WaterfallChartColumnStyle", - "description": "Styles for all columns in this series with negative values." - }, - "hideTrailingSubtotal": { - "description": "True to hide the subtotal column from the end of the series. By default,\na subtotal column will appear at the end of each series. Setting this\nfield to true will hide that subtotal column for this series.", - "type": "boolean" - } - }, - "id": "WaterfallChartSeries" - }, - "PivotGroupSortValueBucket": { - "description": "Information about which values in a pivot group should be used for sorting.", - "type": "object", - "properties": { - "valuesIndex": { - "description": "The offset in the PivotTable.values list which the values in this\ngrouping should be sorted by.", - "format": "int32", - "type": "integer" - }, - "buckets": { - "description": "Determines the bucket from which values are chosen to sort.\n\nFor example, in a pivot table with one row group & two column groups,\nthe row group can list up to two values. The first value corresponds\nto a value within the first column group, and the second value\ncorresponds to a value in the second column group. If no values\nare listed, this would indicate that the row should be sorted according\nto the \"Grand Total\" over the column groups. If a single value is listed,\nthis would correspond to using the \"Total\" of that bucket.", - "type": "array", - "items": { - "$ref": "ExtendedValue" - } - } - }, - "id": "PivotGroupSortValueBucket" - }, - "DeleteDeveloperMetadataRequest": { - "description": "A request to delete developer metadata.", - "type": "object", - "properties": { - "dataFilter": { - "$ref": "DataFilter", - "description": "The data filter describing the criteria used to select which developer\nmetadata entry to delete." - } - }, - "id": "DeleteDeveloperMetadataRequest" - }, - "CandlestickData": { - "type": "object", - "properties": { - "highSeries": { - "$ref": "CandlestickSeries", - "description": "The range data (vertical axis) for the high/maximum value for each\ncandle. This is the top of the candle's center line." - }, - "lowSeries": { - "$ref": "CandlestickSeries", - "description": "The range data (vertical axis) for the low/minimum value for each candle.\nThis is the bottom of the candle's center line." - }, - "closeSeries": { - "description": "The range data (vertical axis) for the close/final value for each candle.\nThis is the top of the candle body. If greater than the open value the\ncandle will be filled. Otherwise the candle will be hollow.", - "$ref": "CandlestickSeries" - }, - "openSeries": { - "$ref": "CandlestickSeries", - "description": "The range data (vertical axis) for the open/initial value for each\ncandle. This is the bottom of the candle body. If less than the close\nvalue the candle will be filled. Otherwise the candle will be hollow." - } - }, - "id": "CandlestickData", - "description": "The Candlestick chart data, each containing the low, open, close, and high\nvalues for a series." - }, - "DeleteProtectedRangeRequest": { - "description": "Deletes the protected range with the given ID.", - "type": "object", - "properties": { - "protectedRangeId": { - "type": "integer", - "description": "The ID of the protected range to delete.", - "format": "int32" - } - }, - "id": "DeleteProtectedRangeRequest" - }, - "InterpolationPoint": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "The interpolation point uses the minimum value in the\ncells over the range of the conditional format.", - "The interpolation point uses the maximum value in the\ncells over the range of the conditional format.", - "The interpolation point uses exactly the value in\nInterpolationPoint.value.", - "The interpolation point is the given percentage over\nall the cells in the range of the conditional format.\nThis is equivalent to NUMBER if the value was:\n`=(MAX(FLATTEN(range)) * (value / 100))\n + (MIN(FLATTEN(range)) * (1 - (value / 100)))`\n(where errors in the range are ignored when flattening).", - "The interpolation point is the given percentile\nover all the cells in the range of the conditional format.\nThis is equivalent to NUMBER if the value was:\n`=PERCENTILE(FLATTEN(range), value / 100)`\n(where errors in the range are ignored when flattening)." - ], - "enum": [ - "INTERPOLATION_POINT_TYPE_UNSPECIFIED", - "MIN", - "MAX", - "NUMBER", - "PERCENT", - "PERCENTILE" - ], - "description": "How the value should be interpreted." - }, - "value": { - "type": "string", - "description": "The value this interpolation point uses. May be a formula.\nUnused if type is MIN or\nMAX." - }, - "color": { - "$ref": "Color", - "description": "The color this interpolation point should use." - } - }, - "id": "InterpolationPoint", - "description": "A single interpolation point on a gradient conditional format.\nThese pin the gradient color scale according to the color,\ntype and value chosen." - }, - "FindReplaceResponse": { - "description": "The result of the find/replace.", - "type": "object", - "properties": { - "rowsChanged": { - "description": "The number of rows changed.", - "format": "int32", - "type": "integer" - }, - "sheetsChanged": { - "description": "The number of sheets changed.", - "format": "int32", - "type": "integer" - }, - "formulasChanged": { - "description": "The number of formula cells changed.", - "format": "int32", - "type": "integer" - }, - "valuesChanged": { - "description": "The number of non-formula cells changed.", - "format": "int32", - "type": "integer" - }, - "occurrencesChanged": { - "description": "The number of occurrences (possibly multiple within a cell) changed.\nFor example, if replacing `\"e\"` with `\"o\"` in `\"Google Sheets\"`, this would\nbe `\"3\"` because `\"Google Sheets\"` -\u003e `\"Googlo Shoots\"`.", - "format": "int32", - "type": "integer" - } - }, - "id": "FindReplaceResponse" - }, - "DuplicateFilterViewRequest": { - "description": "Duplicates a particular filter view.", - "type": "object", - "properties": { - "filterId": { - "description": "The ID of the filter being duplicated.", - "format": "int32", - "type": "integer" - } - }, - "id": "DuplicateFilterViewRequest" - }, - "UpdateConditionalFormatRuleResponse": { - "id": "UpdateConditionalFormatRuleResponse", - "description": "The result of updating a conditional format rule.", - "type": "object", - "properties": { - "newIndex": { - "type": "integer", - "description": "The index of the new rule.", - "format": "int32" - }, - "oldIndex": { - "description": "The old index of the rule. Not set if a rule was replaced\n(because it is the same as new_index).", - "format": "int32", - "type": "integer" - }, - "newRule": { - "$ref": "ConditionalFormatRule", - "description": "The new rule that replaced the old rule (if replacing),\nor the rule that was moved (if moved)" - }, - "oldRule": { - "$ref": "ConditionalFormatRule", - "description": "The old (deleted) rule. Not set if a rule was moved\n(because it is the same as new_rule)." - } - } - }, - "ConditionValue": { - "description": "The value of the condition.", - "type": "object", - "properties": { - "relativeDate": { - "enumDescriptions": [ - "Default value, do not use.", - "The value is one year before today.", - "The value is one month before today.", - "The value is one week before today.", - "The value is yesterday.", - "The value is today.", - "The value is tomorrow." - ], - "enum": [ - "RELATIVE_DATE_UNSPECIFIED", - "PAST_YEAR", - "PAST_MONTH", - "PAST_WEEK", - "YESTERDAY", - "TODAY", - "TOMORROW" - ], - "description": "A relative date (based on the current date).\nValid only if the type is\nDATE_BEFORE,\nDATE_AFTER,\nDATE_ON_OR_BEFORE or\nDATE_ON_OR_AFTER.\n\nRelative dates are not supported in data validation.\nThey are supported only in conditional formatting and\nconditional filters.", - "type": "string" - }, - "userEnteredValue": { - "description": "A value the condition is based on.\nThe value is parsed as if the user typed into a cell.\nFormulas are supported (and must begin with an `=` or a '+').", - "type": "string" - } - }, - "id": "ConditionValue" - }, - "DateTimeRule": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enumDescriptions": [ - "The default type, do not use.", - "Group dates by second, from 0 to 59.", - "Group dates by minute, from 0 to 59.", - "Group dates by hour using a 24-hour system, from 0 to 23.", - "Group dates by hour and minute using a 24-hour system, for example 19:45.", - "Group dates by hour and minute using a 12-hour system, for example 7:45\nPM. The AM/PM designation is translated based on the spreadsheet\nlocale.", - "Group dates by day of week, for example Sunday. The days of the week will\nbe translated based on the spreadsheet locale.", - "Group dates by day of year, from 1 to 366. Note that dates after Feb. 29\nfall in different buckets in leap years than in non-leap years.", - "Group dates by day of month, from 1 to 31.", - "Group dates by day and month, for example 22-Nov. The month is\ntranslated based on the spreadsheet locale.", - "Group dates by month, for example Nov. The month is translated based\non the spreadsheet locale.", - "Group dates by quarter, for example Q1 (which represents Jan-Mar).", - "Group dates by year, for example 2008.", - "Group dates by year and month, for example 2008-Nov. The month is\ntranslated based on the spreadsheet locale.", - "Group dates by year and quarter, for example 2008 Q4.", - "Group dates by year, month, and day, for example 2008-11-22." - ], - "enum": [ - "DATE_TIME_RULE_TYPE_UNSPECIFIED", - "SECOND", - "MINUTE", - "HOUR", - "HOUR_MINUTE", - "HOUR_MINUTE_AMPM", - "DAY_OF_WEEK", - "DAY_OF_YEAR", - "DAY_OF_MONTH", - "DAY_MONTH", - "MONTH", - "QUARTER", - "YEAR", - "YEAR_MONTH", - "YEAR_QUARTER", - "YEAR_MONTH_DAY" - ], - "description": "The type of date-time grouping to apply." - } - }, - "id": "DateTimeRule", - "description": "Allows you to organize the date-time values in a source data column into\nbuckets based on selected parts of their date or time values. For example,\nconsider a pivot table showing sales transactions by date:\n\n +----------+--------------+\n | Date | SUM of Sales |\n +----------+--------------+\n | 1/1/2017 | $621.14 |\n | 2/3/2017 | $708.84 |\n | 5/8/2017 | $326.84 |\n ...\n +----------+--------------+\nApplying a date-time group rule with a DateTimeRuleType of YEAR_MONTH\nresults in the following pivot table.\n\n +--------------+--------------+\n | Grouped Date | SUM of Sales |\n +--------------+--------------+\n | 2017-Jan | $53,731.78 |\n | 2017-Feb | $83,475.32 |\n | 2017-Mar | $94,385.05 |\n ...\n +--------------+--------------+" - }, - "AddChartRequest": { - "description": "Adds a chart to a sheet in the spreadsheet.", - "type": "object", - "properties": { - "chart": { - "$ref": "EmbeddedChart", - "description": "The chart that should be added to the spreadsheet, including the position\nwhere it should be placed. The chartId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of an embedded object that already exists.)" - } - }, - "id": "AddChartRequest" - }, - "BandedRange": { - "description": "A banded (alternating colors) range in a sheet.", - "type": "object", - "properties": { - "range": { - "$ref": "GridRange", - "description": "The range over which these properties are applied." - }, - "bandedRangeId": { - "description": "The id of the banded range.", - "format": "int32", - "type": "integer" - }, - "rowProperties": { - "$ref": "BandingProperties", - "description": "Properties for row bands. These properties are applied on a row-by-row\nbasis throughout all the rows in the range. At least one of\nrow_properties or column_properties must be specified." - }, - "columnProperties": { - "$ref": "BandingProperties", - "description": "Properties for column bands. These properties are applied on a column-\nby-column basis throughout all the columns in the range. At least one of\nrow_properties or column_properties must be specified." - } - }, - "id": "BandedRange" - }, - "Spreadsheet": { - "type": "object", - "properties": { - "spreadsheetId": { - "description": "The ID of the spreadsheet.\nThis field is read-only.", - "type": "string" - }, - "namedRanges": { - "type": "array", - "items": { - "$ref": "NamedRange" - }, - "description": "The named ranges defined in a spreadsheet." - }, - "developerMetadata": { - "description": "The developer metadata associated with a spreadsheet.", - "type": "array", - "items": { - "$ref": "DeveloperMetadata" - } - }, - "sheets": { - "type": "array", - "items": { - "$ref": "Sheet" - }, - "description": "The sheets that are part of a spreadsheet." - }, - "spreadsheetUrl": { - "description": "The url of the spreadsheet.\nThis field is read-only.", - "type": "string" - }, - "properties": { - "$ref": "SpreadsheetProperties", - "description": "Overall properties of a spreadsheet." - } - }, - "id": "Spreadsheet", - "description": "Resource that represents a spreadsheet." - }, - "HistogramSeries": { - "id": "HistogramSeries", - "description": "A histogram series containing the series color and data.", - "type": "object", - "properties": { - "barColor": { - "$ref": "Color", - "description": "The color of the column representing this series in each bucket.\nThis field is optional." - }, - "data": { - "description": "The data for this histogram series.", - "$ref": "ChartData" - } - } - }, - "UpdateProtectedRangeRequest": { - "description": "Updates an existing protected range with the specified\nprotectedRangeId.", - "type": "object", - "properties": { - "protectedRange": { - "$ref": "ProtectedRange", - "description": "The protected range to update with the new properties." - }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `protectedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" - } - }, - "id": "UpdateProtectedRangeRequest" - }, - "HistogramRule": { - "description": "Allows you to organize the numeric values in a source data column into\nbuckets of a constant size. All values from HistogramRule.start to\nHistogramRule.end are placed into groups of size\nHistogramRule.interval. In addition, all values below\nHistogramRule.start are placed in one group, and all values above\nHistogramRule.end are placed in another. Only\nHistogramRule.interval is required, though if HistogramRule.start\nand HistogramRule.end are both provided, HistogramRule.start must\nbe less than HistogramRule.end. For example, a pivot table showing\naverage purchase amount by age that has 50+ rows:\n\n +-----+-------------------+\n | Age | AVERAGE of Amount |\n +-----+-------------------+\n | 16 | $27.13 |\n | 17 | $5.24 |\n | 18 | $20.15 |\n ...\n +-----+-------------------+\ncould be turned into a pivot table that looks like the one below by\napplying a histogram group rule with a HistogramRule.start of 25,\nan HistogramRule.interval of 20, and an HistogramRule.end\nof 65.\n\n +-------------+-------------------+\n | Grouped Age | AVERAGE of Amount |\n +-------------+-------------------+\n | \u003c 25 | $19.34 |\n | 25-45 | $31.43 |\n | 45-65 | $35.87 |\n | \u003e 65 | $27.55 |\n +-------------+-------------------+\n | Grand Total | $29.12 |\n +-------------+-------------------+", - "type": "object", - "properties": { - "start": { - "description": "The minimum value at which items are placed into buckets\nof constant size. Values below start are lumped into a single bucket.\nThis field is optional.", - "format": "double", - "type": "number" - }, - "end": { - "description": "The maximum value at which items are placed into buckets\nof constant size. Values above end are lumped into a single bucket.\nThis field is optional.", - "format": "double", - "type": "number" - }, - "interval": { - "description": "The size of the buckets that are created. Must be positive.", - "format": "double", - "type": "number" - } - }, - "id": "HistogramRule" - }, - "AddSheetResponse": { - "description": "The result of adding a sheet.", - "type": "object", - "properties": { - "properties": { - "$ref": "SheetProperties", - "description": "The properties of the newly added sheet." - } - }, - "id": "AddSheetResponse" - }, - "AddFilterViewResponse": { - "description": "The result of adding a filter view.", - "type": "object", - "properties": { - "filter": { - "$ref": "FilterView", - "description": "The newly added filter view." - } - }, - "id": "AddFilterViewResponse" - }, - "PivotGroupRule": { - "id": "PivotGroupRule", - "description": "An optional setting on a PivotGroup that defines buckets for the values\nin the source data column rather than breaking out each individual value.\nOnly one PivotGroup with a group rule may be added for each column in\nthe source data, though on any given column you may add both a\nPivotGroup that has a rule and a PivotGroup that does not.", - "type": "object", - "properties": { - "histogramRule": { - "description": "A HistogramRule.", - "$ref": "HistogramRule" - }, - "dateTimeRule": { - "$ref": "DateTimeRule", - "description": "A DateTimeRule." - }, - "manualRule": { - "$ref": "ManualRule", - "description": "A ManualRule." - } - } - }, - "IterativeCalculationSettings": { - "description": "Settings to control how circular dependencies are resolved with iterative\ncalculation.", - "type": "object", - "properties": { - "convergenceThreshold": { - "type": "number", - "description": "When iterative calculation is enabled and successive results differ by\nless than this threshold value, the calculation rounds stop.", - "format": "double" - }, - "maxIterations": { - "description": "When iterative calculation is enabled, the maximum number of calculation\nrounds to perform.", - "format": "int32", - "type": "integer" - } - }, - "id": "IterativeCalculationSettings" - }, - "ScorecardChartSpec": { - "type": "object", - "properties": { - "baselineValueData": { - "$ref": "ChartData", - "description": "The data for scorecard baseline value.\nThis field is optional." - }, - "keyValueData": { - "$ref": "ChartData", - "description": "The data for scorecard key value." - }, - "aggregateType": { - "description": "The aggregation type for key and baseline chart data in scorecard chart.\nThis field is optional.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "Average aggregate function.", - "Count aggregate function.", - "Maximum aggregate function.", - "Median aggregate function.", - "Minimum aggregate function.", - "Sum aggregate function." - ], - "enum": [ - "CHART_AGGREGATE_TYPE_UNSPECIFIED", - "AVERAGE", - "COUNT", - "MAX", - "MEDIAN", - "MIN", - "SUM" - ] - }, - "numberFormatSource": { - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "Inherit number formatting from data.", - "Apply custom formatting as specified by ChartCustomNumberFormatOptions." - ], - "enum": [ - "CHART_NUMBER_FORMAT_SOURCE_UNDEFINED", - "FROM_DATA", - "CUSTOM" - ], - "description": "The number format source used in the scorecard chart.\nThis field is optional." - }, - "keyValueFormat": { - "$ref": "KeyValueFormat", - "description": "Formatting options for key value." - }, - "customFormatOptions": { - "description": "Custom formatting options for numeric key/baseline values in scorecard\nchart. This field is used only when number_format_source is set to\nCUSTOM. This field is optional.", - "$ref": "ChartCustomNumberFormatOptions" - }, - "scaleFactor": { - "description": "Value to scale scorecard key and baseline value. For example, a factor of\n10 can be used to divide all values in the chart by 10.\nThis field is optional.", - "format": "double", - "type": "number" - }, - "baselineValueFormat": { - "$ref": "BaselineValueFormat", - "description": "Formatting options for baseline value.\nThis field is needed only if baseline_value_data is specified." - } - }, - "id": "ScorecardChartSpec", - "description": "A scorecard chart. Scorecard charts are used to highlight key performance\nindicators, known as KPIs, on the spreadsheet. A scorecard chart can\nrepresent things like total sales, average cost, or a top selling item. You\ncan specify a single data value, or aggregate over a range of data.\nPercentage or absolute difference from a baseline value can be highlighted,\nlike changes over time." - }, - "OverlayPosition": { - "id": "OverlayPosition", - "description": "The location an object is overlaid on top of a grid.", - "type": "object", - "properties": { - "offsetYPixels": { - "type": "integer", - "description": "The vertical offset, in pixels, that the object is offset\nfrom the anchor cell.", - "format": "int32" - }, - "heightPixels": { - "type": "integer", - "description": "The height of the object, in pixels. Defaults to 371.", - "format": "int32" - }, - "widthPixels": { - "description": "The width of the object, in pixels. Defaults to 600.", - "format": "int32", - "type": "integer" - }, - "offsetXPixels": { - "description": "The horizontal offset, in pixels, that the object is offset\nfrom the anchor cell.", - "format": "int32", - "type": "integer" - }, - "anchorCell": { - "description": "The cell the object is anchored to.", - "$ref": "GridCoordinate" - } - } - }, - "SpreadsheetProperties": { - "description": "Properties of a spreadsheet.", - "type": "object", - "properties": { - "title": { - "description": "The title of the spreadsheet.", - "type": "string" - }, - "timeZone": { - "description": "The time zone of the spreadsheet, in CLDR format such as\n`America/New_York`. If the time zone isn't recognized, this may\nbe a custom time zone such as `GMT-07:00`.", - "type": "string" - }, - "locale": { - "type": "string", - "description": "The locale of the spreadsheet in one of the following formats:\n\n* an ISO 639-1 language code such as `en`\n\n* an ISO 639-2 language code such as `fil`, if no 639-1 code exists\n\n* a combination of the ISO language code and country code, such as `en_US`\n\nNote: when updating this field, not all locales/languages are supported." - }, - "iterativeCalculationSettings": { - "description": "Determines whether and how circular references are resolved with iterative\ncalculation. Absence of this field means that circular references will\nresult in calculation errors.", - "$ref": "IterativeCalculationSettings" - }, - "autoRecalc": { - "type": "string", - "enumDescriptions": [ - "Default value. This value must not be used.", - "Volatile functions are updated on every change.", - "Volatile functions are updated on every change and every minute.", - "Volatile functions are updated on every change and hourly." - ], - "enum": [ - "RECALCULATION_INTERVAL_UNSPECIFIED", - "ON_CHANGE", - "MINUTE", - "HOUR" - ], - "description": "The amount of time to wait before volatile functions are recalculated." - }, - "defaultFormat": { - "description": "The default format of all cells in the spreadsheet.\nCellData.effectiveFormat will not be set if\nthe cell's format is equal to this default format. This field is read-only.", - "$ref": "CellFormat" - } - }, - "id": "SpreadsheetProperties" - }, - "AddChartResponse": { - "id": "AddChartResponse", - "description": "The result of adding a chart to a spreadsheet.", - "type": "object", - "properties": { - "chart": { - "$ref": "EmbeddedChart", - "description": "The newly added chart." - } - } - }, - "InsertDimensionRequest": { - "type": "object", - "properties": { - "inheritFromBefore": { - "description": "Whether dimension properties should be extended from the dimensions\nbefore or after the newly inserted dimensions.\nTrue to inherit from the dimensions before (in which case the start\nindex must be greater than 0), and false to inherit from the dimensions\nafter.\n\nFor example, if row index 0 has red background and row index 1\nhas a green background, then inserting 2 rows at index 1 can inherit\neither the green or red background. If `inheritFromBefore` is true,\nthe two new rows will be red (because the row before the insertion point\nwas red), whereas if `inheritFromBefore` is false, the two new rows will\nbe green (because the row after the insertion point was green).", - "type": "boolean" - }, - "range": { - "$ref": "DimensionRange", - "description": "The dimensions to insert. Both the start and end indexes must be bounded." - } - }, - "id": "InsertDimensionRequest", - "description": "Inserts rows or columns in a sheet at a particular index." - }, - "BatchUpdateValuesRequest": { - "id": "BatchUpdateValuesRequest", - "description": "The request for updating more than one range of values in a spreadsheet.", - "type": "object", - "properties": { - "responseValueRenderOption": { - "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string", - "enumDescriptions": [ - "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", - "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", - "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." - ], - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ] - }, - "includeValuesInResponse": { - "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values. The `updatedData` field within\neach of the BatchUpdateValuesResponse.responses will contain\nthe updated values. If the range to write was larger than than the range\nactually written, the response will include all values in the requested\nrange (excluding trailing empty rows and columns).", - "type": "boolean" - }, - "valueInputOption": { - "enumDescriptions": [ - "Default input value. This value must not be used.", - "The values the user has entered will not be parsed and will be stored\nas-is.", - "The values will be parsed as if the user typed them into the UI.\nNumbers will stay as numbers, but strings may be converted to numbers,\ndates, etc. following the same rules that are applied when entering\ntext into a cell via the Google Sheets UI." - ], - "enum": [ - "INPUT_VALUE_OPTION_UNSPECIFIED", - "RAW", - "USER_ENTERED" - ], - "description": "How the input data should be interpreted.", - "type": "string" - }, - "data": { - "description": "The new values to apply to the spreadsheet.", - "type": "array", - "items": { - "$ref": "ValueRange" - } - }, - "responseDateTimeRenderOption": { - "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER.", - "type": "string", - "enumDescriptions": [ - "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", - "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." - ], - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ] - } - } - }, - "CutPasteRequest": { - "type": "object", - "properties": { - "destination": { - "$ref": "GridCoordinate", - "description": "The top-left coordinate where the data should be pasted." - }, - "source": { - "$ref": "GridRange", - "description": "The source data to cut." - }, - "pasteType": { - "enum": [ - "PASTE_NORMAL", - "PASTE_VALUES", - "PASTE_FORMAT", - "PASTE_NO_BORDERS", - "PASTE_FORMULA", - "PASTE_DATA_VALIDATION", - "PASTE_CONDITIONAL_FORMATTING" - ], - "description": "What kind of data to paste. All the source data will be cut, regardless\nof what is pasted.", - "type": "string", - "enumDescriptions": [ - "Paste values, formulas, formats, and merges.", - "Paste the values ONLY without formats, formulas, or merges.", - "Paste the format and data validation only.", - "Like PASTE_NORMAL but without borders.", - "Paste the formulas only.", - "Paste the data validation only.", - "Paste the conditional formatting rules only." - ] - } - }, - "id": "CutPasteRequest", - "description": "Moves data from the source to the destination." - }, - "ChartAxisViewWindowOptions": { - "description": "The options that define a \"view window\" for a chart (such as the visible\nvalues in an axis).", - "type": "object", - "properties": { - "viewWindowMin": { - "description": "The minimum numeric value to be shown in this view window. If unset, will\nautomatically determine a minimum value that looks good for the data.", - "format": "double", - "type": "number" - }, - "viewWindowMax": { - "description": "The maximum numeric value to be shown in this view window. If unset, will\nautomatically determine a maximum value that looks good for the data.", - "format": "double", - "type": "number" - }, - "viewWindowMode": { - "description": "The view window's mode.", - "type": "string", - "enumDescriptions": [ - "The default view window mode used in the Sheets editor for this chart\ntype. In most cases, if set, the default mode is equivalent to\n`PRETTY`.", - "Do not use. Represents that the currently set mode is not supported by\nthe API.", - "Follows the min and max exactly if specified. If a value is unspecified,\nit will fall back to the `PRETTY` value.", - "Chooses a min and max that make the chart look good. Both min and max are\nignored in this mode." - ], - "enum": [ - "DEFAULT_VIEW_WINDOW_MODE", - "VIEW_WINDOW_MODE_UNSUPPORTED", - "EXPLICIT", - "PRETTY" - ] - } - }, - "id": "ChartAxisViewWindowOptions" - }, - "BasicChartSeries": { - "description": "A single series of data in a chart.\nFor example, if charting stock prices over time, multiple series may exist,\none for the \"Open Price\", \"High Price\", \"Low Price\" and \"Close Price\".", - "type": "object", - "properties": { - "color": { - "$ref": "Color", - "description": "The color for elements (i.e. bars, lines, points) associated with this\nseries. If empty, a default color is used." - }, - "lineStyle": { - "description": "The line style of this series. Valid only if the\nchartType is AREA,\nLINE, or SCATTER.\nCOMBO charts are also supported if the\nseries chart type is\nAREA or LINE.", - "$ref": "LineStyle" - }, - "series": { - "$ref": "ChartData", - "description": "The data being visualized in this chart series." - }, - "type": { - "enumDescriptions": [ - "Default value, do not use.", - "A \u003ca href=\"/chart/interactive/docs/gallery/barchart\"\u003ebar chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/linechart\"\u003eline chart\u003c/a\u003e.", - "An \u003ca href=\"/chart/interactive/docs/gallery/areachart\"\u003earea chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/columnchart\"\u003ecolumn chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/scatterchart\"\u003escatter\nchart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/combochart\"\u003ecombo chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/steppedareachart\"\u003estepped area\nchart\u003c/a\u003e." - ], - "enum": [ - "BASIC_CHART_TYPE_UNSPECIFIED", - "BAR", - "LINE", - "AREA", - "COLUMN", - "SCATTER", - "COMBO", - "STEPPED_AREA" - ], - "description": "The type of this series. Valid only if the\nchartType is\nCOMBO.\nDifferent types will change the way the series is visualized.\nOnly LINE, AREA,\nand COLUMN are supported.", - "type": "string" - }, - "targetAxis": { - "enumDescriptions": [ - "Default value, do not use.", - "The axis rendered at the bottom of a chart.\nFor most charts, this is the standard major axis.\nFor bar charts, this is a minor axis.", - "The axis rendered at the left of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is the standard major axis.", - "The axis rendered at the right of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is an unusual major axis." - ], - "enum": [ - "BASIC_CHART_AXIS_POSITION_UNSPECIFIED", - "BOTTOM_AXIS", - "LEFT_AXIS", - "RIGHT_AXIS" - ], - "description": "The minor axis that will specify the range of values for this series.\nFor example, if charting stocks over time, the \"Volume\" series\nmay want to be pinned to the right with the prices pinned to the left,\nbecause the scale of trading volume is different than the scale of\nprices.\nIt is an error to specify an axis that isn't a valid minor axis\nfor the chart's type.", - "type": "string" - } - }, - "id": "BasicChartSeries" - }, - "AutoResizeDimensionsRequest": { - "id": "AutoResizeDimensionsRequest", - "description": "Automatically resizes one or more dimensions based on the contents\nof the cells in that dimension.", - "type": "object", - "properties": { - "dimensions": { - "$ref": "DimensionRange", - "description": "The dimensions to automatically resize." - } - } - }, - "UpdateBordersRequest": { - "description": "Updates the borders of a range.\nIf a field is not set in the request, that means the border remains as-is.\nFor example, with two subsequent UpdateBordersRequest:\n\n 1. range: A1:A5 `{ top: RED, bottom: WHITE }`\n 2. range: A1:A5 `{ left: BLUE }`\n\nThat would result in A1:A5 having a borders of\n`{ top: RED, bottom: WHITE, left: BLUE }`.\nIf you want to clear a border, explicitly set the style to\nNONE.", - "type": "object", - "properties": { - "left": { - "$ref": "Border", - "description": "The border to put at the left of the range." - }, - "bottom": { - "$ref": "Border", - "description": "The border to put at the bottom of the range." - }, - "innerVertical": { - "description": "The vertical border to put within the range.", - "$ref": "Border" - }, - "right": { - "$ref": "Border", - "description": "The border to put at the right of the range." - }, - "range": { - "$ref": "GridRange", - "description": "The range whose borders should be updated." - }, - "innerHorizontal": { - "$ref": "Border", - "description": "The horizontal border to put within the range." - }, - "top": { - "$ref": "Border", - "description": "The border to put at the top of the range." - } - }, - "id": "UpdateBordersRequest" - }, - "CellFormat": { - "id": "CellFormat", - "description": "The format of a cell.", - "type": "object", - "properties": { - "backgroundColor": { - "$ref": "Color", - "description": "The background color of the cell." - }, - "padding": { - "$ref": "Padding", - "description": "The padding of the cell." - }, - "verticalAlignment": { - "enum": [ - "VERTICAL_ALIGN_UNSPECIFIED", - "TOP", - "MIDDLE", - "BOTTOM" - ], - "description": "The vertical alignment of the value in the cell.", - "type": "string", - "enumDescriptions": [ - "The vertical alignment is not specified. Do not use this.", - "The text is explicitly aligned to the top of the cell.", - "The text is explicitly aligned to the middle of the cell.", - "The text is explicitly aligned to the bottom of the cell." - ] - }, - "borders": { - "description": "The borders of the cell.", - "$ref": "Borders" - }, - "textDirection": { - "type": "string", - "enumDescriptions": [ - "The text direction is not specified. Do not use this.", - "The text direction of left-to-right was set by the user.", - "The text direction of right-to-left was set by the user." - ], - "enum": [ - "TEXT_DIRECTION_UNSPECIFIED", - "LEFT_TO_RIGHT", - "RIGHT_TO_LEFT" - ], - "description": "The direction of the text in the cell." - }, - "wrapStrategy": { - "enum": [ - "WRAP_STRATEGY_UNSPECIFIED", - "OVERFLOW_CELL", - "LEGACY_WRAP", - "CLIP", - "WRAP" - ], - "description": "The wrap strategy for the value in the cell.", - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "Lines that are longer than the cell width will be written in the next\ncell over, so long as that cell is empty. If the next cell over is\nnon-empty, this behaves the same as CLIP. The text will never wrap\nto the next line unless the user manually inserts a new line.\nExample:\n\n | First sentence. |\n | Manual newline that is very long. \u003c- Text continues into next cell\n | Next newline. |", - "This wrap strategy represents the old Google Sheets wrap strategy where\nwords that are longer than a line are clipped rather than broken. This\nstrategy is not supported on all platforms and is being phased out.\nExample:\n\n | Cell has a |\n | loooooooooo| \u003c- Word is clipped.\n | word. |", - "Lines that are longer than the cell width will be clipped.\nThe text will never wrap to the next line unless the user manually\ninserts a new line.\nExample:\n\n | First sentence. |\n | Manual newline t| \u003c- Text is clipped\n | Next newline. |", - "Words that are longer than a line are wrapped at the character level\nrather than clipped.\nExample:\n\n | Cell has a |\n | loooooooooo| \u003c- Word is broken.\n | ong word. |" - ] - }, - "textRotation": { - "$ref": "TextRotation", - "description": "The rotation applied to text in a cell" - }, - "numberFormat": { - "$ref": "NumberFormat", - "description": "A format describing how number values should be represented to the user." - }, - "hyperlinkDisplayType": { - "enumDescriptions": [ - "The default value: the hyperlink is rendered. Do not use this.", - "A hyperlink should be explicitly rendered.", - "A hyperlink should not be rendered." - ], - "enum": [ - "HYPERLINK_DISPLAY_TYPE_UNSPECIFIED", - "LINKED", - "PLAIN_TEXT" - ], - "description": "How a hyperlink, if it exists, should be displayed in the cell.", - "type": "string" - }, - "horizontalAlignment": { - "type": "string", - "enumDescriptions": [ - "The horizontal alignment is not specified. Do not use this.", - "The text is explicitly aligned to the left of the cell.", - "The text is explicitly aligned to the center of the cell.", - "The text is explicitly aligned to the right of the cell." - ], - "enum": [ - "HORIZONTAL_ALIGN_UNSPECIFIED", - "LEFT", - "CENTER", - "RIGHT" - ], - "description": "The horizontal alignment of the value in the cell." - }, - "textFormat": { - "$ref": "TextFormat", - "description": "The format of the text in the cell (unless overridden by a format run)." - } - } - }, - "ClearValuesResponse": { - "type": "object", - "properties": { - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", - "type": "string" - }, - "clearedRange": { - "description": "The range (in A1 notation) that was cleared.\n(If the request was for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual range\n that was cleared, bounded to the sheet's limits.)", - "type": "string" - } - }, - "id": "ClearValuesResponse", - "description": "The response when clearing a range of values in a spreadsheet." - }, - "WaterfallChartCustomSubtotal": { - "type": "object", - "properties": { - "subtotalIndex": { - "description": "The 0-based index of a data point within the series. If\ndata_is_subtotal is true, the data point at this index is the\nsubtotal. Otherwise, the subtotal appears after the data point with\nthis index. A series can have multiple subtotals at arbitrary indices,\nbut subtotals do not affect the indices of the data points. For\nexample, if a series has three data points, their indices will always\nbe 0, 1, and 2, regardless of how many subtotals exist on the series or\nwhat data points they are associated with.", - "format": "int32", - "type": "integer" - }, - "dataIsSubtotal": { - "description": "True if the data point at subtotal_index is the subtotal. If false,\nthe subtotal will be computed and appear after the data point.", - "type": "boolean" - }, - "label": { - "description": "A label for the subtotal column.", - "type": "string" - } - }, - "id": "WaterfallChartCustomSubtotal", - "description": "A custom subtotal column for a waterfall chart series." - }, - "ChartData": { - "description": "The data included in a domain or series.", - "type": "object", - "properties": { - "sourceRange": { - "$ref": "ChartSourceRange", - "description": "The source ranges of the data." - } - }, - "id": "ChartData" - }, - "BatchGetValuesResponse": { - "id": "BatchGetValuesResponse", - "description": "The response when retrieving more than one range of values in a spreadsheet.", - "type": "object", - "properties": { - "valueRanges": { - "type": "array", - "items": { - "$ref": "ValueRange" - }, - "description": "The requested values. The order of the ValueRanges is the same as the\norder of the requested ranges." - }, - "spreadsheetId": { - "type": "string", - "description": "The ID of the spreadsheet the data was retrieved from." - } - } - }, - "UpdateBandingRequest": { - "type": "object", - "properties": { - "bandedRange": { - "$ref": "BandedRange", - "description": "The banded range to update with the new properties." - }, - "fields": { - "type": "string", - "description": "The fields that should be updated. At least one field must be specified.\nThe root `bandedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask" - } - }, - "id": "UpdateBandingRequest", - "description": "Updates properties of the supplied banded range." - }, - "Color": { - "id": "Color", - "description": "Represents a color in the RGBA color space. This representation is designed\nfor simplicity of conversion to/from color representations in various\nlanguages over compactness; for example, the fields of this representation\ncan be trivially provided to the constructor of \"java.awt.Color\" in Java; it\ncan also be trivially provided to UIColor's \"+colorWithRed:green:blue:alpha\"\nmethod in iOS; and, with just a little work, it can be easily formatted into\na CSS \"rgba()\" string in JavaScript, as well.\n\nNote: this proto does not carry information about the absolute color space\nthat should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,\nDCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color\nspace.\n\nExample (Java):\n\n import com.google.type.Color;\n\n // ...\n public static java.awt.Color fromProto(Color protocolor) {\n float alpha = protocolor.hasAlpha()\n ? protocolor.getAlpha().getValue()\n : 1.0;\n\n return new java.awt.Color(\n protocolor.getRed(),\n protocolor.getGreen(),\n protocolor.getBlue(),\n alpha);\n }\n\n public static Color toProto(java.awt.Color color) {\n float red = (float) color.getRed();\n float green = (float) color.getGreen();\n float blue = (float) color.getBlue();\n float denominator = 255.0;\n Color.Builder resultBuilder =\n Color\n .newBuilder()\n .setRed(red / denominator)\n .setGreen(green / denominator)\n .setBlue(blue / denominator);\n int alpha = color.getAlpha();\n if (alpha != 255) {\n result.setAlpha(\n FloatValue\n .newBuilder()\n .setValue(((float) alpha) / denominator)\n .build());\n }\n return resultBuilder.build();\n }\n // ...\n\nExample (iOS / Obj-C):\n\n // ...\n static UIColor* fromProto(Color* protocolor) {\n float red = [protocolor red];\n float green = [protocolor green];\n float blue = [protocolor blue];\n FloatValue* alpha_wrapper = [protocolor alpha];\n float alpha = 1.0;\n if (alpha_wrapper != nil) {\n alpha = [alpha_wrapper value];\n }\n return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];\n }\n\n static Color* toProto(UIColor* color) {\n CGFloat red, green, blue, alpha;\n if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {\n return nil;\n }\n Color* result = [[Color alloc] init];\n [result setRed:red];\n [result setGreen:green];\n [result setBlue:blue];\n if (alpha \u003c= 0.9999) {\n [result setAlpha:floatWrapperWithValue(alpha)];\n }\n [result autorelease];\n return result;\n }\n // ...\n\n Example (JavaScript):\n\n // ...\n\n var protoToCssColor = function(rgb_color) {\n var redFrac = rgb_color.red || 0.0;\n var greenFrac = rgb_color.green || 0.0;\n var blueFrac = rgb_color.blue || 0.0;\n var red = Math.floor(redFrac * 255);\n var green = Math.floor(greenFrac * 255);\n var blue = Math.floor(blueFrac * 255);\n\n if (!('alpha' in rgb_color)) {\n return rgbToCssColor_(red, green, blue);\n }\n\n var alphaFrac = rgb_color.alpha.value || 0.0;\n var rgbParams = [red, green, blue].join(',');\n return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');\n };\n\n var rgbToCssColor_ = function(red, green, blue) {\n var rgbNumber = new Number((red \u003c\u003c 16) | (green \u003c\u003c 8) | blue);\n var hexString = rgbNumber.toString(16);\n var missingZeros = 6 - hexString.length;\n var resultBuilder = ['#'];\n for (var i = 0; i \u003c missingZeros; i++) {\n resultBuilder.push('0');\n }\n resultBuilder.push(hexString);\n return resultBuilder.join('');\n };\n\n // ...", - "type": "object", - "properties": { - "green": { - "type": "number", - "description": "The amount of green in the color as a value in the interval [0, 1].", - "format": "float" - }, - "blue": { - "type": "number", - "description": "The amount of blue in the color as a value in the interval [0, 1].", - "format": "float" - }, - "alpha": { - "description": "The fraction of this color that should be applied to the pixel. That is,\nthe final pixel color is defined by the equation:\n\n pixel color = alpha * (this color) + (1.0 - alpha) * (background color)\n\nThis means that a value of 1.0 corresponds to a solid color, whereas\na value of 0.0 corresponds to a completely transparent color. This\nuses a wrapper message rather than a simple float scalar so that it is\npossible to distinguish between a default value and the value being unset.\nIf omitted, this color object is to be rendered as a solid color\n(as if the alpha value had been explicitly given with a value of 1.0).", - "format": "float", - "type": "number" - }, - "red": { - "description": "The amount of red in the color as a value in the interval [0, 1].", - "format": "float", - "type": "number" - } - } - }, - "TrimWhitespaceRequest": { - "id": "TrimWhitespaceRequest", - "description": "Trims the whitespace (such as spaces, tabs, or new lines) in every cell in\nthe specified range. This request removes all whitespace from the start and\nend of each cell's text, and reduces any subsequence of remaining whitespace\ncharacters to a single space. If the resulting trimmed text starts with a '+'\nor '=' character, the text remains as a string value and isn't interpreted\nas a formula.", - "type": "object", - "properties": { - "range": { - "$ref": "GridRange", - "description": "The range whose cells to trim." - } - } - }, - "ChartSourceRange": { - "type": "object", - "properties": { - "sources": { - "description": "The ranges of data for a series or domain.\nExactly one dimension must have a length of 1,\nand all sources in the list must have the same dimension\nwith length 1.\nThe domain (if it exists) & all series must have the same number\nof source ranges. If using more than one source range, then the source\nrange at a given offset must be in order and contiguous across the domain\nand series.\n\nFor example, these are valid configurations:\n\n domain sources: A1:A5\n series1 sources: B1:B5\n series2 sources: D6:D10\n\n domain sources: A1:A5, C10:C12\n series1 sources: B1:B5, D10:D12\n series2 sources: C1:C5, E10:E12", - "type": "array", - "items": { - "$ref": "GridRange" - } - } - }, - "id": "ChartSourceRange", - "description": "Source ranges for a chart." - }, - "ValueRange": { - "id": "ValueRange", - "description": "Data within a range of the spreadsheet.", - "type": "object", - "properties": { - "majorDimension": { - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ], - "description": "The major dimension of the values.\n\nFor output, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.\n\nFor input, with `range=A1:B2,majorDimension=ROWS` then `[[1,2],[3,4]]`\nwill set `A1=1,B1=2,A2=3,B2=4`. With `range=A1:B2,majorDimension=COLUMNS`\nthen `[[1,2],[3,4]]` will set `A1=1,B1=3,A2=2,B2=4`.\n\nWhen writing, if this field is not set, it defaults to ROWS.", - "type": "string" - }, - "values": { - "description": "The data that was read or to be written. This is an array of arrays,\nthe outer array representing all the data and each inner array\nrepresenting a major dimension. Each item in the inner array\ncorresponds with one cell.\n\nFor output, empty trailing rows and columns will not be included.\n\nFor input, supported value types are: bool, string, and double.\nNull values will be skipped.\nTo set a cell to an empty value, set the string value to an empty string.", - "type": "array", - "items": { - "type": "array", - "items": { - "type": "any" - } - } - }, - "range": { - "description": "The range the values cover, in A1 notation.\nFor output, this range indicates the entire requested range,\neven though the values will exclude trailing rows and columns.\nWhen appending values, this field represents the range to search for a\ntable, after which values will be appended.", - "type": "string" - } - } - }, - "AddBandingRequest": { - "type": "object", - "properties": { - "bandedRange": { - "$ref": "BandedRange", - "description": "The banded range to add. The bandedRangeId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a range that already exists.)" - } - }, - "id": "AddBandingRequest", - "description": "Adds a new banded range to the spreadsheet." - }, - "Response": { - "type": "object", - "properties": { - "updateDeveloperMetadata": { - "description": "A reply from updating a developer metadata entry.", - "$ref": "UpdateDeveloperMetadataResponse" - }, - "findReplace": { - "$ref": "FindReplaceResponse", - "description": "A reply from doing a find/replace." - }, - "addSheet": { - "$ref": "AddSheetResponse", - "description": "A reply from adding a sheet." - }, - "updateConditionalFormatRule": { - "description": "A reply from updating a conditional format rule.", - "$ref": "UpdateConditionalFormatRuleResponse" - }, - "createDeveloperMetadata": { - "$ref": "CreateDeveloperMetadataResponse", - "description": "A reply from creating a developer metadata entry." - }, - "addNamedRange": { - "$ref": "AddNamedRangeResponse", - "description": "A reply from adding a named range." - }, - "deleteDeveloperMetadata": { - "$ref": "DeleteDeveloperMetadataResponse", - "description": "A reply from deleting a developer metadata entry." - }, - "trimWhitespace": { - "$ref": "TrimWhitespaceResponse", - "description": "A reply from trimming whitespace." - }, - "addFilterView": { - "$ref": "AddFilterViewResponse", - "description": "A reply from adding a filter view." - }, - "deleteDuplicates": { - "description": "A reply from removing rows containing duplicate values.", - "$ref": "DeleteDuplicatesResponse" - }, - "addBanding": { - "$ref": "AddBandingResponse", - "description": "A reply from adding a banded range." - }, - "addProtectedRange": { - "$ref": "AddProtectedRangeResponse", - "description": "A reply from adding a protected range." - }, - "duplicateSheet": { - "$ref": "DuplicateSheetResponse", - "description": "A reply from duplicating a sheet." - }, - "updateEmbeddedObjectPosition": { - "$ref": "UpdateEmbeddedObjectPositionResponse", - "description": "A reply from updating an embedded object's position." - }, - "addSlicer": { - "$ref": "AddSlicerResponse", - "description": "A reply from adding a slicer." - }, - "deleteConditionalFormatRule": { - "$ref": "DeleteConditionalFormatRuleResponse", - "description": "A reply from deleting a conditional format rule." - }, - "deleteDimensionGroup": { - "$ref": "DeleteDimensionGroupResponse", - "description": "A reply from deleting a dimension group." - }, - "addDimensionGroup": { - "$ref": "AddDimensionGroupResponse", - "description": "A reply from adding a dimension group." - }, - "duplicateFilterView": { - "$ref": "DuplicateFilterViewResponse", - "description": "A reply from duplicating a filter view." - }, - "addChart": { - "$ref": "AddChartResponse", - "description": "A reply from adding a chart." - } - }, - "id": "Response", - "description": "A single response from an update." - }, - "InsertRangeRequest": { - "description": "Inserts cells into a range, shifting the existing cells over or down.", - "type": "object", - "properties": { - "shiftDimension": { - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ], - "description": "The dimension which will be shifted when inserting cells.\nIf ROWS, existing cells will be shifted down.\nIf COLUMNS, existing cells will be shifted right.", - "type": "string" - }, - "range": { - "description": "The range to insert new cells into.", - "$ref": "GridRange" - } - }, - "id": "InsertRangeRequest" - }, - "EmbeddedChart": { - "description": "A chart embedded in a sheet.", - "type": "object", - "properties": { - "chartId": { - "description": "The ID of the chart.", - "format": "int32", - "type": "integer" - }, - "position": { - "$ref": "EmbeddedObjectPosition", - "description": "The position of the chart." - }, - "spec": { - "$ref": "ChartSpec", - "description": "The specification of the chart." - } - }, - "id": "EmbeddedChart" - }, - "AddNamedRangeResponse": { - "id": "AddNamedRangeResponse", - "description": "The result of adding a named range.", - "type": "object", - "properties": { - "namedRange": { - "$ref": "NamedRange", - "description": "The named range to add." - } - } - }, - "AddSheetRequest": { - "description": "Adds a new sheet.\nWhen a sheet is added at a given index,\nall subsequent sheets' indexes are incremented.\nTo add an object sheet, use AddChartRequest instead and specify\nEmbeddedObjectPosition.sheetId or\nEmbeddedObjectPosition.newSheet.", - "type": "object", - "properties": { - "properties": { - "$ref": "SheetProperties", - "description": "The properties the new sheet should have.\nAll properties are optional.\nThe sheetId field is optional; if one is not\nset, an id will be randomly generated. (It is an error to specify the ID\nof a sheet that already exists.)" - } - }, - "id": "AddSheetRequest" - }, - "AddSlicerRequest": { - "description": "Adds a slicer to a sheet in the spreadsheet.", - "type": "object", - "properties": { - "slicer": { - "$ref": "Slicer", - "description": "The slicer that should be added to the spreadsheet, including\nthe position where it should be placed. The slicerId field is optional; if one is not set, an id\nwill be randomly generated. (It is an error to specify the ID\nof a slicer that already exists.)" - } - }, - "id": "AddSlicerRequest" - }, - "DeleteConditionalFormatRuleResponse": { - "description": "The result of deleting a conditional format rule.", - "type": "object", - "properties": { - "rule": { - "$ref": "ConditionalFormatRule", - "description": "The rule that was deleted." - } - }, - "id": "DeleteConditionalFormatRuleResponse" - }, - "GridCoordinate": { - "id": "GridCoordinate", - "description": "A coordinate in a sheet.\nAll indexes are zero-based.", - "type": "object", - "properties": { - "sheetId": { - "description": "The sheet this coordinate is on.", - "format": "int32", - "type": "integer" - }, - "rowIndex": { - "description": "The row index of the coordinate.", - "format": "int32", - "type": "integer" - }, - "columnIndex": { - "description": "The column index of the coordinate.", - "format": "int32", - "type": "integer" - } - } - }, - "UpdateSheetPropertiesRequest": { - "description": "Updates properties of the sheet with the specified\nsheetId.", - "type": "object", - "properties": { - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `properties` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" - }, - "properties": { - "$ref": "SheetProperties", - "description": "The properties to update." - } - }, - "id": "UpdateSheetPropertiesRequest" - }, - "AddSlicerResponse": { - "id": "AddSlicerResponse", - "description": "The result of adding a slicer to a spreadsheet.", - "type": "object", - "properties": { - "slicer": { - "$ref": "Slicer", - "description": "The newly added slicer." - } - } - }, - "GridProperties": { - "type": "object", - "properties": { - "frozenRowCount": { - "type": "integer", - "description": "The number of rows that are frozen in the grid.", - "format": "int32" - }, - "columnCount": { - "type": "integer", - "description": "The number of columns in the grid.", - "format": "int32" - }, - "frozenColumnCount": { - "description": "The number of columns that are frozen in the grid.", - "format": "int32", - "type": "integer" - }, - "columnGroupControlAfter": { - "type": "boolean", - "description": "True if the column grouping control toggle is shown after the group." - }, - "rowGroupControlAfter": { - "description": "True if the row grouping control toggle is shown after the group.", - "type": "boolean" - }, - "rowCount": { - "description": "The number of rows in the grid.", - "format": "int32", - "type": "integer" - }, - "hideGridlines": { - "type": "boolean", - "description": "True if the grid isn't showing gridlines in the UI." - } - }, - "id": "GridProperties", - "description": "Properties of a grid." - }, - "Sheet": { - "id": "Sheet", - "description": "A sheet in a spreadsheet.", - "type": "object", - "properties": { - "data": { - "description": "Data in the grid, if this is a grid sheet.\nThe number of GridData objects returned is dependent on the number of\nranges requested on this sheet. For example, if this is representing\n`Sheet1`, and the spreadsheet was requested with ranges\n`Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a\nstartRow/startColumn of `0`,\nwhile the second one will have `startRow 14` (zero-based row 15),\nand `startColumn 3` (zero-based column D).", - "type": "array", - "items": { - "$ref": "GridData" - } - }, - "properties": { - "$ref": "SheetProperties", - "description": "The properties of the sheet." - }, - "developerMetadata": { - "description": "The developer metadata associated with a sheet.", - "type": "array", - "items": { - "$ref": "DeveloperMetadata" - } - }, - "protectedRanges": { - "description": "The protected ranges in this sheet.", - "type": "array", - "items": { - "$ref": "ProtectedRange" - } - }, - "columnGroups": { - "description": "All column groups on this sheet, ordered by increasing range start index,\nthen by group depth.", - "type": "array", - "items": { - "$ref": "DimensionGroup" - } - }, - "conditionalFormats": { - "description": "The conditional format rules in this sheet.", - "type": "array", - "items": { - "$ref": "ConditionalFormatRule" - } - }, - "basicFilter": { - "$ref": "BasicFilter", - "description": "The filter on this sheet, if any." - }, - "merges": { - "type": "array", - "items": { - "$ref": "GridRange" - }, - "description": "The ranges that are merged together." - }, - "bandedRanges": { - "description": "The banded (alternating colors) ranges on this sheet.", - "type": "array", - "items": { - "$ref": "BandedRange" - } - }, - "charts": { - "type": "array", - "items": { - "$ref": "EmbeddedChart" - }, - "description": "The specifications of every chart on this sheet." - }, - "filterViews": { - "type": "array", - "items": { - "$ref": "FilterView" - }, - "description": "The filter views in this sheet." - }, - "slicers": { - "type": "array", - "items": { - "$ref": "Slicer" - }, - "description": "The slicers on this sheet." - }, - "rowGroups": { - "description": "All row groups on this sheet, ordered by increasing range start index, then\nby group depth.", - "type": "array", - "items": { - "$ref": "DimensionGroup" - } - } - } - }, - "FilterCriteria": { - "description": "Criteria for showing/hiding rows in a filter or filter view.", - "type": "object", - "properties": { - "visibleForegroundColor": { - "$ref": "Color", - "description": "The text color to filter by; only cells with this text color are shown.\nMutually exclusive with all other filter criteria. Requests to set this\nfield will fail with a 400 error if any other filter criteria field is set." - }, - "hiddenValues": { - "description": "Values that should be hidden.", - "type": "array", - "items": { - "type": "string" - } - }, - "condition": { - "$ref": "BooleanCondition", - "description": "A condition that must be true for values to be shown.\n(This does not override hiddenValues -- if a value is listed there,\n it will still be hidden.)" - }, - "visibleBackgroundColor": { - "$ref": "Color", - "description": "The background fill color to filter by; only cells with this fill color are\nshown. Mutually exclusive with all other filter criteria. Requests to set\nthis field will fail with a 400 error if any other filter criteria field is\nset." - } - }, - "id": "FilterCriteria" - }, - "PivotGroupValueMetadata": { - "id": "PivotGroupValueMetadata", - "description": "Metadata about a value in a pivot grouping.", - "type": "object", - "properties": { - "value": { - "description": "The calculated value the metadata corresponds to.\n(Note that formulaValue is not valid,\n because the values will be calculated.)", - "$ref": "ExtendedValue" - }, - "collapsed": { - "type": "boolean", - "description": "True if the data corresponding to the value is collapsed." - } - } - }, - "Editors": { - "id": "Editors", - "description": "The editors of a protected range.", - "type": "object", - "properties": { - "groups": { - "description": "The email addresses of groups with edit access to the protected range.", - "type": "array", - "items": { - "type": "string" - } - }, - "domainUsersCanEdit": { - "description": "True if anyone in the document's domain has edit access to the protected\nrange. Domain protection is only supported on documents within a domain.", - "type": "boolean" - }, - "users": { - "description": "The email addresses of users with edit access to the protected range.", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "DataValidationRule": { - "type": "object", - "properties": { - "showCustomUi": { - "description": "True if the UI should be customized based on the kind of condition.\nIf true, \"List\" conditions will show a dropdown.", - "type": "boolean" - }, - "strict": { - "description": "True if invalid data should be rejected.", - "type": "boolean" - }, - "inputMessage": { - "description": "A message to show the user when adding data to the cell.", - "type": "string" - }, - "condition": { - "$ref": "BooleanCondition", - "description": "The condition that data in the cell must match." - } - }, - "id": "DataValidationRule", - "description": "A data validation rule." - }, - "TextRotation": { - "id": "TextRotation", - "description": "The rotation applied to text in a cell.", - "type": "object", - "properties": { - "angle": { - "type": "integer", - "description": "The angle between the standard orientation and the desired orientation.\nMeasured in degrees. Valid values are between -90 and 90. Positive\nangles are angled upwards, negative are angled downwards.\n\nNote: For LTR text direction positive angles are in the\ncounterclockwise direction, whereas for RTL they are in the clockwise\ndirection", - "format": "int32" - }, - "vertical": { - "description": "If true, text reads top to bottom, but the orientation of individual\ncharacters is unchanged.\nFor example:\n\n | V |\n | e |\n | r |\n | t |\n | i |\n | c |\n | a |\n | l |", - "type": "boolean" - } - } - }, - "DeleteDimensionGroupResponse": { - "description": "The result of deleting a group.", - "type": "object", - "properties": { - "dimensionGroups": { - "description": "All groups of a dimension after deleting a group from that dimension.", - "type": "array", - "items": { - "$ref": "DimensionGroup" - } - } - }, - "id": "DeleteDimensionGroupResponse" - }, - "PieChartSpec": { - "type": "object", - "properties": { - "domain": { - "$ref": "ChartData", - "description": "The data that covers the domain of the pie chart." - }, - "threeDimensional": { - "description": "True if the pie is three dimensional.", - "type": "boolean" - }, - "series": { - "$ref": "ChartData", - "description": "The data that covers the one and only series of the pie chart." - }, - "legendPosition": { - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "The legend is rendered on the bottom of the chart.", - "The legend is rendered on the left of the chart.", - "The legend is rendered on the right of the chart.", - "The legend is rendered on the top of the chart.", - "No legend is rendered.", - "Each pie slice has a label attached to it." - ], - "enum": [ - "PIE_CHART_LEGEND_POSITION_UNSPECIFIED", - "BOTTOM_LEGEND", - "LEFT_LEGEND", - "RIGHT_LEGEND", - "TOP_LEGEND", - "NO_LEGEND", - "LABELED_LEGEND" - ], - "description": "Where the legend of the pie chart should be drawn." - }, - "pieHole": { - "description": "The size of the hole in the pie chart.", - "format": "double", - "type": "number" - } - }, - "id": "PieChartSpec", - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/piechart\"\u003epie chart\u003c/a\u003e." - }, - "UpdateDeveloperMetadataRequest": { - "id": "UpdateDeveloperMetadataRequest", - "description": "A request to update properties of developer metadata.\nUpdates the properties of the developer metadata selected by the filters to\nthe values provided in the DeveloperMetadata resource. Callers must\nspecify the properties they wish to update in the fields parameter, as well\nas specify at least one DataFilter matching the metadata they wish to\nupdate.", - "type": "object", - "properties": { - "dataFilters": { - "description": "The filters matching the developer metadata entries to update.", - "type": "array", - "items": { - "$ref": "DataFilter" - } - }, - "fields": { - "type": "string", - "description": "The fields that should be updated. At least one field must be specified.\nThe root `developerMetadata` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask" - }, - "developerMetadata": { - "$ref": "DeveloperMetadata", - "description": "The value that all metadata matched by the data filters will be updated to." - } - } - }, - "UpdateFilterViewRequest": { - "id": "UpdateFilterViewRequest", - "description": "Updates properties of the filter view.", - "type": "object", - "properties": { - "filter": { - "$ref": "FilterView", - "description": "The new properties of the filter view." - }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `filter` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" - } - } - }, - "UpdateSlicerSpecRequest": { - "description": "Updates a slicer’s specifications.\n(This does not move or resize a slicer. To move or resize a slicer use\nUpdateEmbeddedObjectPositionRequest.", - "type": "object", - "properties": { - "spec": { - "$ref": "SlicerSpec", - "description": "The specification to apply to the slicer." - }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `SlicerSpec` is implied and should not be specified. A single \"*\"`\ncan be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" - }, - "slicerId": { - "description": "The id of the slicer to update.", - "format": "int32", - "type": "integer" - } - }, - "id": "UpdateSlicerSpecRequest" - }, - "ConditionalFormatRule": { - "description": "A rule describing a conditional format.", - "type": "object", - "properties": { - "ranges": { - "description": "The ranges that are formatted if the condition is true.\nAll the ranges must be on the same grid.", - "type": "array", - "items": { - "$ref": "GridRange" - } - }, - "gradientRule": { - "$ref": "GradientRule", - "description": "The formatting will vary based on the gradients in the rule." - }, - "booleanRule": { - "$ref": "BooleanRule", - "description": "The formatting is either \"on\" or \"off\" according to the rule." - } - }, - "id": "ConditionalFormatRule" - }, - "CopyPasteRequest": { - "type": "object", - "properties": { - "source": { - "$ref": "GridRange", - "description": "The source range to copy." - }, - "pasteType": { - "enumDescriptions": [ - "Paste values, formulas, formats, and merges.", - "Paste the values ONLY without formats, formulas, or merges.", - "Paste the format and data validation only.", - "Like PASTE_NORMAL but without borders.", - "Paste the formulas only.", - "Paste the data validation only.", - "Paste the conditional formatting rules only." - ], - "enum": [ - "PASTE_NORMAL", - "PASTE_VALUES", - "PASTE_FORMAT", - "PASTE_NO_BORDERS", - "PASTE_FORMULA", - "PASTE_DATA_VALIDATION", - "PASTE_CONDITIONAL_FORMATTING" - ], - "description": "What kind of data to paste.", - "type": "string" - }, - "destination": { - "$ref": "GridRange", - "description": "The location to paste to. If the range covers a span that's\na multiple of the source's height or width, then the\ndata will be repeated to fill in the destination range.\nIf the range is smaller than the source range, the entire\nsource data will still be copied (beyond the end of the destination range)." - }, - "pasteOrientation": { - "description": "How that data should be oriented when pasting.", - "type": "string", - "enumDescriptions": [ - "Paste normally.", - "Paste transposed, where all rows become columns and vice versa." - ], - "enum": [ - "NORMAL", - "TRANSPOSE" - ] - } - }, - "id": "CopyPasteRequest", - "description": "Copies data from the source to the destination." - }, - "BooleanCondition": { - "description": "A condition that can evaluate to true or false.\nBooleanConditions are used by conditional formatting,\ndata validation, and the criteria in filters.", - "type": "object", - "properties": { - "type": { - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "The cell's value must be greater than the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be greater than or equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be less than the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be less than or equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be not equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be between the two condition values.\nSupported by data validation, conditional formatting and filters.\nRequires exactly two ConditionValues.", - "The cell's value must not be between the two condition values.\nSupported by data validation, conditional formatting and filters.\nRequires exactly two ConditionValues.", - "The cell's value must contain the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must not contain the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must start with the condition's value.\nSupported by conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must end with the condition's value.\nSupported by conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be exactly the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be a valid email address.\nSupported by data validation.\nRequires no ConditionValues.", - "The cell's value must be a valid URL.\nSupported by data validation.\nRequires no ConditionValues.", - "The cell's value must be the same date as the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be before the date of the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue\nthat may be a relative date.", - "The cell's value must be after the date of the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue\nthat may be a relative date.", - "The cell's value must be on or before the date of the condition's value.\nSupported by data validation.\nRequires a single ConditionValue\nthat may be a relative date.", - "The cell's value must be on or after the date of the condition's value.\nSupported by data validation.\nRequires a single ConditionValue\nthat may be a relative date.", - "The cell's value must be between the dates of the two condition values.\nSupported by data validation.\nRequires exactly two ConditionValues.", - "The cell's value must be outside the dates of the two condition values.\nSupported by data validation.\nRequires exactly two ConditionValues.", - "The cell's value must be a date.\nSupported by data validation.\nRequires no ConditionValues.", - "The cell's value must be listed in the grid in condition value's range.\nSupported by data validation.\nRequires a single ConditionValue,\nand the value must be a valid range in A1 notation.", - "The cell's value must be in the list of condition values.\nSupported by data validation.\nSupports any number of condition values,\none per item in the list.\nFormulas are not supported in the values.", - "The cell's value must be empty.\nSupported by conditional formatting and filters.\nRequires no ConditionValues.", - "The cell's value must not be empty.\nSupported by conditional formatting and filters.\nRequires no ConditionValues.", - "The condition's formula must evaluate to true.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be TRUE/FALSE or in the list of condition values.\nSupported by data validation.\nRenders as a cell checkbox.\nSupports zero, one or two ConditionValues. No\nvalues indicates the cell must be TRUE or FALSE, where TRUE renders as\nchecked and FALSE renders as unchecked. One value indicates the cell\nwill render as checked when it contains that value and unchecked when it\nis blank. Two values indicate that the cell will render as checked when\nit contains the first value and unchecked when it contains the second\nvalue. For example, [\"Yes\",\"No\"] indicates that the cell will render a\nchecked box when it has the value \"Yes\" and an unchecked box when it has\nthe value \"No\"." - ], - "enum": [ - "CONDITION_TYPE_UNSPECIFIED", - "NUMBER_GREATER", - "NUMBER_GREATER_THAN_EQ", - "NUMBER_LESS", - "NUMBER_LESS_THAN_EQ", - "NUMBER_EQ", - "NUMBER_NOT_EQ", - "NUMBER_BETWEEN", - "NUMBER_NOT_BETWEEN", - "TEXT_CONTAINS", - "TEXT_NOT_CONTAINS", - "TEXT_STARTS_WITH", - "TEXT_ENDS_WITH", - "TEXT_EQ", - "TEXT_IS_EMAIL", - "TEXT_IS_URL", - "DATE_EQ", - "DATE_BEFORE", - "DATE_AFTER", - "DATE_ON_OR_BEFORE", - "DATE_ON_OR_AFTER", - "DATE_BETWEEN", - "DATE_NOT_BETWEEN", - "DATE_IS_VALID", - "ONE_OF_RANGE", - "ONE_OF_LIST", - "BLANK", - "NOT_BLANK", - "CUSTOM_FORMULA", - "BOOLEAN" - ], - "description": "The type of condition." - }, - "values": { - "type": "array", - "items": { - "$ref": "ConditionValue" - }, - "description": "The values of the condition. The number of supported values depends\non the condition type. Some support zero values,\nothers one or two values,\nand ConditionType.ONE_OF_LIST supports an arbitrary number of values." - } - }, - "id": "BooleanCondition" - }, - "BasicChartSpec": { - "description": "The specification for a basic chart. See BasicChartType for the list\nof charts this supports.", - "type": "object", - "properties": { - "series": { - "description": "The data this chart is visualizing.", - "type": "array", - "items": { - "$ref": "BasicChartSeries" - } - }, - "legendPosition": { - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "The legend is rendered on the bottom of the chart.", - "The legend is rendered on the left of the chart.", - "The legend is rendered on the right of the chart.", - "The legend is rendered on the top of the chart.", - "No legend is rendered." - ], - "enum": [ - "BASIC_CHART_LEGEND_POSITION_UNSPECIFIED", - "BOTTOM_LEGEND", - "LEFT_LEGEND", - "RIGHT_LEGEND", - "TOP_LEGEND", - "NO_LEGEND" - ], - "description": "The position of the chart legend." - }, - "compareMode": { - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "Only the focused data element is highlighted and shown in the tooltip.", - "All data elements with the same category (e.g., domain value) are\nhighlighted and shown in the tooltip." - ], - "enum": [ - "BASIC_CHART_COMPARE_MODE_UNSPECIFIED", - "DATUM", - "CATEGORY" - ], - "description": "The behavior of tooltips and data highlighting when hovering on data and\nchart area." - }, - "domains": { - "type": "array", - "items": { - "$ref": "BasicChartDomain" - }, - "description": "The domain of data this is charting.\nOnly a single domain is supported." - }, - "lineSmoothing": { - "description": "Gets whether all lines should be rendered smooth or straight by default.\nApplies to Line charts.", - "type": "boolean" - }, - "headerCount": { - "type": "integer", - "description": "The number of rows or columns in the data that are \"headers\".\nIf not set, Google Sheets will guess how many rows are headers based\non the data.\n\n(Note that BasicChartAxis.title may override the axis title\n inferred from the header values.)", - "format": "int32" - }, - "stackedType": { - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "Series are not stacked.", - "Series values are stacked, each value is rendered vertically beginning\nfrom the top of the value below it.", - "Vertical stacks are stretched to reach the top of the chart, with\nvalues laid out as percentages of each other." - ], - "enum": [ - "BASIC_CHART_STACKED_TYPE_UNSPECIFIED", - "NOT_STACKED", - "STACKED", - "PERCENT_STACKED" - ], - "description": "The stacked type for charts that support vertical stacking.\nApplies to Area, Bar, Column, Combo, and Stepped Area charts." - }, - "axis": { - "description": "The axis on the chart.", - "type": "array", - "items": { - "$ref": "BasicChartAxis" - } - }, - "threeDimensional": { - "description": "True to make the chart 3D.\nApplies to Bar and Column charts.", - "type": "boolean" - }, - "interpolateNulls": { - "description": "If some values in a series are missing, gaps may appear in the chart (e.g,\nsegments of lines in a line chart will be missing). To eliminate these\ngaps set this to true.\nApplies to Line, Area, and Combo charts.", - "type": "boolean" - }, - "chartType": { - "enumDescriptions": [ - "Default value, do not use.", - "A \u003ca href=\"/chart/interactive/docs/gallery/barchart\"\u003ebar chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/linechart\"\u003eline chart\u003c/a\u003e.", - "An \u003ca href=\"/chart/interactive/docs/gallery/areachart\"\u003earea chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/columnchart\"\u003ecolumn chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/scatterchart\"\u003escatter\nchart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/combochart\"\u003ecombo chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/steppedareachart\"\u003estepped area\nchart\u003c/a\u003e." - ], - "enum": [ - "BASIC_CHART_TYPE_UNSPECIFIED", - "BAR", - "LINE", - "AREA", - "COLUMN", - "SCATTER", - "COMBO", - "STEPPED_AREA" - ], - "description": "The type of the chart.", - "type": "string" - } - }, - "id": "BasicChartSpec" - }, - "AddDimensionGroupRequest": { - "id": "AddDimensionGroupRequest", - "description": "Creates a group over the specified range.\n\nIf the requested range is a superset of the range of an existing group G,\nthen the depth of G is incremented and this new group G' has the\ndepth of that group. For example, a group [C:D, depth 1] + [B:E] results in\ngroups [B:E, depth 1] and [C:D, depth 2].\nIf the requested range is a subset of the range of an existing group G,\nthen the depth of the new group G' becomes one greater than the depth of G.\nFor example, a group [B:E, depth 1] + [C:D] results in groups [B:E, depth 1]\nand [C:D, depth 2].\nIf the requested range starts before and ends within, or starts within and\nends after, the range of an existing group G, then the range of the existing\ngroup G becomes the union of the ranges, and the new group G' has\ndepth one greater than the depth of G and range as the intersection of the\nranges. For example, a group [B:D, depth 1] + [C:E] results in groups [B:E,\ndepth 1] and [C:D, depth 2].", - "type": "object", - "properties": { - "range": { - "description": "The range over which to create a group.", - "$ref": "DimensionRange" - } - } - }, - "CellData": { - "id": "CellData", - "description": "Data about a specific cell.", - "type": "object", - "properties": { - "hyperlink": { - "description": "A hyperlink this cell points to, if any.\nThis field is read-only. (To set it, use a `=HYPERLINK` formula\nin the userEnteredValue.formulaValue\nfield.)", - "type": "string" - }, - "pivotTable": { - "$ref": "PivotTable", - "description": "A pivot table anchored at this cell. The size of pivot table itself\nis computed dynamically based on its data, grouping, filters, values,\netc. Only the top-left cell of the pivot table contains the pivot table\ndefinition. The other cells will contain the calculated values of the\nresults of the pivot in their effective_value fields." - }, - "userEnteredFormat": { - "$ref": "CellFormat", - "description": "The format the user entered for the cell.\n\nWhen writing, the new format will be merged with the existing format." - }, - "note": { - "description": "Any note on the cell.", - "type": "string" - }, - "effectiveFormat": { - "$ref": "CellFormat", - "description": "The effective format being used by the cell.\nThis includes the results of applying any conditional formatting and,\nif the cell contains a formula, the computed number format.\nIf the effective format is the default format, effective format will\nnot be written.\nThis field is read-only." - }, - "userEnteredValue": { - "$ref": "ExtendedValue", - "description": "The value the user entered in the cell. e.g, `1234`, `'Hello'`, or `=NOW()`\nNote: Dates, Times and DateTimes are represented as doubles in\nserial number format." - }, - "dataValidation": { - "description": "A data validation rule on the cell, if any.\n\nWhen writing, the new data validation rule will overwrite any prior rule.", - "$ref": "DataValidationRule" - }, - "effectiveValue": { - "$ref": "ExtendedValue", - "description": "The effective value of the cell. For cells with formulas, this is\nthe calculated value. For cells with literals, this is\nthe same as the user_entered_value.\nThis field is read-only." - }, - "formattedValue": { - "description": "The formatted value of the cell.\nThis is the value as it's shown to the user.\nThis field is read-only.", - "type": "string" - }, - "textFormatRuns": { - "description": "Runs of rich text applied to subsections of the cell. Runs are only valid\non user entered strings, not formulas, bools, or numbers.\nRuns start at specific indexes in the text and continue until the next\nrun. Properties of a run will continue unless explicitly changed\nin a subsequent run (and properties of the first run will continue\nthe properties of the cell unless explicitly changed).\n\nWhen writing, the new runs will overwrite any prior runs. When writing a\nnew user_entered_value, previous runs are erased.", - "type": "array", - "items": { - "$ref": "TextFormatRun" - } - } - } - }, - "BatchUpdateValuesByDataFilterRequest": { - "description": "The request for updating more than one range of values in a spreadsheet.", - "type": "object", - "properties": { - "responseValueRenderOption": { - "type": "string", - "enumDescriptions": [ - "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", - "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", - "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." - ], - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ], - "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE." - }, - "includeValuesInResponse": { - "type": "boolean", - "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values. The `updatedData` field within\neach of the BatchUpdateValuesResponse.responses will contain\nthe updated values. If the range to write was larger than than the range\nactually written, the response will include all values in the requested\nrange (excluding trailing empty rows and columns)." - }, - "valueInputOption": { - "description": "How the input data should be interpreted.", - "type": "string", - "enumDescriptions": [ - "Default input value. This value must not be used.", - "The values the user has entered will not be parsed and will be stored\nas-is.", - "The values will be parsed as if the user typed them into the UI.\nNumbers will stay as numbers, but strings may be converted to numbers,\ndates, etc. following the same rules that are applied when entering\ntext into a cell via the Google Sheets UI." - ], - "enum": [ - "INPUT_VALUE_OPTION_UNSPECIFIED", - "RAW", - "USER_ENTERED" - ] - }, - "data": { - "type": "array", - "items": { - "$ref": "DataFilterValueRange" - }, - "description": "The new values to apply to the spreadsheet. If more than one range is\nmatched by the specified DataFilter the specified values will be\napplied to all of those ranges." - }, - "responseDateTimeRenderOption": { - "enumDescriptions": [ - "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", - "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." - ], - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER.", - "type": "string" - } - }, - "id": "BatchUpdateValuesByDataFilterRequest" - } - }, - "protocol": "rest", - "icons": { - "x32": "http://www.google.com/images/icons/product/search-32.gif", - "x16": "http://www.google.com/images/icons/product/search-16.gif" - }, - "canonicalName": "Sheets", - "auth": { - "oauth2": { - "scopes": { - "https://www.googleapis.com/auth/drive.file": { - "description": "View and manage Google Drive files and folders that you have opened or created with this app" - }, - "https://www.googleapis.com/auth/drive": { - "description": "See, edit, create, and delete all of your Google Drive files" - }, - "https://www.googleapis.com/auth/drive.readonly": { - "description": "See and download all your Google Drive files" - }, - "https://www.googleapis.com/auth/spreadsheets.readonly": { - "description": "View your Google Spreadsheets" - }, - "https://www.googleapis.com/auth/spreadsheets": { - "description": "See, edit, create, and delete your spreadsheets in Google Drive" - } - } - } - }, - "rootUrl": "https://sheets.googleapis.com/", - "ownerDomain": "google.com", - "name": "sheets", - "batchPath": "batch", - "fullyEncodeReservedExpansion": true, - "title": "Google Sheets API", - "ownerName": "Google", - "resources": { - "spreadsheets": { - "methods": { - "get": { - "flatPath": "v4/spreadsheets/{spreadsheetId}", - "path": "v4/spreadsheets/{spreadsheetId}", - "id": "sheets.spreadsheets.get", - "description": "Returns the spreadsheet at the given ID.\nThe caller must specify the spreadsheet ID.\n\nBy default, data within grids will not be returned.\nYou can include grid data one of two ways:\n\n* Specify a field mask listing your desired fields using the `fields` URL\nparameter in HTTP\n\n* Set the includeGridData\nURL parameter to true. If a field mask is set, the `includeGridData`\nparameter is ignored\n\nFor large spreadsheets, it is recommended to retrieve only the specific\nfields of the spreadsheet that you want.\n\nTo retrieve only subsets of the spreadsheet, use the\nranges URL parameter.\nMultiple ranges can be specified. Limiting the range will\nreturn only the portions of the spreadsheet that intersect the requested\nranges. Ranges are specified using A1 notation.", - "response": { - "$ref": "Spreadsheet" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "GET", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/drive.readonly", - "https://www.googleapis.com/auth/spreadsheets", - "https://www.googleapis.com/auth/spreadsheets.readonly" - ], - "parameters": { - "ranges": { - "location": "query", - "description": "The ranges to retrieve from the spreadsheet.", - "type": "string", - "repeated": true - }, - "includeGridData": { - "location": "query", - "description": "True if grid data should be returned.\nThis parameter is ignored if a field mask was set in the request.", - "type": "boolean" - }, - "spreadsheetId": { - "required": true, - "type": "string", - "location": "path", - "description": "The spreadsheet to request." - } - } - }, - "getByDataFilter": { - "request": { - "$ref": "GetSpreadsheetByDataFilterRequest" - }, - "description": "Returns the spreadsheet at the given ID.\nThe caller must specify the spreadsheet ID.\n\nThis method differs from GetSpreadsheet in that it allows selecting\nwhich subsets of spreadsheet data to return by specifying a\ndataFilters parameter.\nMultiple DataFilters can be specified. Specifying one or\nmore data filters will return the portions of the spreadsheet that\nintersect ranges matched by any of the filters.\n\nBy default, data within grids will not be returned.\nYou can include grid data one of two ways:\n\n* Specify a field mask listing your desired fields using the `fields` URL\nparameter in HTTP\n\n* Set the includeGridData\nparameter to true. If a field mask is set, the `includeGridData`\nparameter is ignored\n\nFor large spreadsheets, it is recommended to retrieve only the specific\nfields of the spreadsheet that you want.", - "response": { - "$ref": "Spreadsheet" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": { - "spreadsheetId": { - "location": "path", - "description": "The spreadsheet to request.", - "required": true, - "type": "string" - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}:getByDataFilter", - "path": "v4/spreadsheets/{spreadsheetId}:getByDataFilter", - "id": "sheets.spreadsheets.getByDataFilter" - }, - "create": { - "response": { - "$ref": "Spreadsheet" - }, - "parameterOrder": [], - "httpMethod": "POST", - "parameters": {}, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets", - "path": "v4/spreadsheets", - "id": "sheets.spreadsheets.create", - "description": "Creates a spreadsheet, returning the newly created spreadsheet.", - "request": { - "$ref": "Spreadsheet" - } - }, - "batchUpdate": { - "response": { - "$ref": "BatchUpdateSpreadsheetResponse" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST", - "parameters": { - "spreadsheetId": { - "required": true, - "type": "string", - "location": "path", - "description": "The spreadsheet to apply the updates to." - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}:batchUpdate", - "path": "v4/spreadsheets/{spreadsheetId}:batchUpdate", - "id": "sheets.spreadsheets.batchUpdate", - "description": "Applies one or more updates to the spreadsheet.\n\nEach request is validated before\nbeing applied. If any request is not valid then the entire request will\nfail and nothing will be applied.\n\nSome requests have replies to\ngive you some information about how\nthey are applied. The replies will mirror the requests. For example,\nif you applied 4 updates and the 3rd one had a reply, then the\nresponse will have 2 empty replies, the actual reply, and another empty\nreply, in that order.\n\nDue to the collaborative nature of spreadsheets, it is not guaranteed that\nthe spreadsheet will reflect exactly your changes after this completes,\nhowever it is guaranteed that the updates in the request will be\napplied together atomically. Your changes may be altered with respect to\ncollaborator changes. If there are no collaborators, the spreadsheet\nshould reflect your changes.", - "request": { - "$ref": "BatchUpdateSpreadsheetRequest" - } - } - }, - "resources": { - "sheets": { - "methods": { - "copyTo": { - "flatPath": "v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo", - "path": "v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo", - "id": "sheets.spreadsheets.sheets.copyTo", - "request": { - "$ref": "CopySheetToAnotherSpreadsheetRequest" - }, - "description": "Copies a single sheet from a spreadsheet to another spreadsheet.\nReturns the properties of the newly created sheet.", - "response": { - "$ref": "SheetProperties" - }, - "parameterOrder": [ - "spreadsheetId", - "sheetId" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": { - "sheetId": { - "location": "path", - "description": "The ID of the sheet to copy.", - "format": "int32", - "required": true, - "type": "integer" - }, - "spreadsheetId": { - "description": "The ID of the spreadsheet containing the sheet to copy.", - "required": true, - "type": "string", - "location": "path" - } - } - } - } - }, - "developerMetadata": { - "methods": { - "search": { - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": { - "spreadsheetId": { - "required": true, - "type": "string", - "location": "path", - "description": "The ID of the spreadsheet to retrieve metadata from." - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/developerMetadata:search", - "id": "sheets.spreadsheets.developerMetadata.search", - "path": "v4/spreadsheets/{spreadsheetId}/developerMetadata:search", - "request": { - "$ref": "SearchDeveloperMetadataRequest" - }, - "description": "Returns all developer metadata matching the specified DataFilter.\nIf the provided DataFilter represents a DeveloperMetadataLookup object,\nthis will return all DeveloperMetadata entries selected by it. If the\nDataFilter represents a location in a spreadsheet, this will return all\ndeveloper metadata associated with locations intersecting that region.", - "httpMethod": "POST", - "parameterOrder": [ - "spreadsheetId" - ], - "response": { - "$ref": "SearchDeveloperMetadataResponse" - } - }, - "get": { - "description": "Returns the developer metadata with the specified ID.\nThe caller must specify the spreadsheet ID and the developer metadata's\nunique metadataId.", - "response": { - "$ref": "DeveloperMetadata" - }, - "parameterOrder": [ - "spreadsheetId", - "metadataId" - ], - "httpMethod": "GET", + "values": { + "methods": { + "get": { "scopes": [ "https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" + "https://www.googleapis.com/auth/drive.readonly", + "https://www.googleapis.com/auth/spreadsheets", + "https://www.googleapis.com/auth/spreadsheets.readonly" ], "parameters": { + "majorDimension": { + "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.", + "type": "string", + "location": "query", + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ] + }, "spreadsheetId": { "location": "path", - "description": "The ID of the spreadsheet to retrieve metadata from.", + "description": "The ID of the spreadsheet to retrieve data from.", "required": true, "type": "string" }, - "metadataId": { - "description": "The ID of the developer metadata to retrieve.", - "format": "int32", + "range": { + "description": "The A1 notation of the values to retrieve.", "required": true, - "type": "integer", + "type": "string", "location": "path" - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}", - "path": "v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}", - "id": "sheets.spreadsheets.developerMetadata.get" - } - } - }, - "values": { - "methods": { - "batchGetByDataFilter": { - "httpMethod": "POST", - "parameterOrder": [ - "spreadsheetId" - ], - "response": { - "$ref": "BatchGetValuesByDataFilterResponse" - }, - "parameters": { - "spreadsheetId": { - "location": "path", - "description": "The ID of the spreadsheet to retrieve data from.", - "required": true, + }, + "valueRenderOption": { + "location": "query", + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" + ], + "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", "type": "string" + }, + "dateTimeRenderOption": { + "type": "string", + "location": "query", + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ], + "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER]." } }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter", - "id": "sheets.spreadsheets.values.batchGetByDataFilter", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter", - "description": "Returns one or more ranges of values that match the specified data filters.\nThe caller must specify the spreadsheet ID and one or more\nDataFilters. Ranges that match any of the data filters in\nthe request will be returned.", - "request": { - "$ref": "BatchGetValuesByDataFilterRequest" - } - }, - "batchClear": { + "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}", + "path": "v4/spreadsheets/{spreadsheetId}/values/{range}", + "id": "sheets.spreadsheets.values.get", + "description": "Returns a range of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and a range.", "response": { - "$ref": "BatchClearValuesResponse" + "$ref": "ValueRange" }, "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" + "spreadsheetId", + "range" ], - "parameters": { - "spreadsheetId": { - "required": true, - "type": "string", - "location": "path", - "description": "The ID of the spreadsheet to update." - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchClear", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchClear", - "id": "sheets.spreadsheets.values.batchClear", - "request": { - "$ref": "BatchClearValuesRequest" - }, - "description": "Clears one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more ranges.\nOnly values are cleared -- all other properties of the cell (such as\nformatting, data validation, etc..) are kept." + "httpMethod": "GET" }, - "get": { - "description": "Returns a range of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and a range.", + "update": { "response": { - "$ref": "ValueRange" + "$ref": "UpdateValuesResponse" }, "parameterOrder": [ "spreadsheetId", "range" ], - "httpMethod": "GET", + "httpMethod": "PUT", "scopes": [ "https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/drive.readonly", - "https://www.googleapis.com/auth/spreadsheets", - "https://www.googleapis.com/auth/spreadsheets.readonly" + "https://www.googleapis.com/auth/spreadsheets" ], "parameters": { - "range": { - "location": "path", - "description": "The A1 notation of the values to retrieve.", + "spreadsheetId": { + "description": "The ID of the spreadsheet to update.", "required": true, - "type": "string" - }, - "valueRenderOption": { - "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", "type": "string", + "location": "path" + }, + "responseValueRenderOption": { "location": "query", "enum": [ "FORMATTED_VALUE", "UNFORMATTED_VALUE", "FORMULA" - ] + ], + "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", + "type": "string" }, - "dateTimeRenderOption": { + "valueInputOption": { "location": "query", "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" + "INPUT_VALUE_OPTION_UNSPECIFIED", + "RAW", + "USER_ENTERED" ], - "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", + "description": "How the input data should be interpreted.", "type": "string" }, - "majorDimension": { - "type": "string", + "responseDateTimeRenderOption": { "location": "query", "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" + "SERIAL_NUMBER", + "FORMATTED_STRING" ], - "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`." + "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER.", + "type": "string" }, - "spreadsheetId": { - "description": "The ID of the spreadsheet to retrieve data from.", + "range": { "required": true, "type": "string", - "location": "path" + "location": "path", + "description": "The A1 notation of the values to update." + }, + "includeValuesInResponse": { + "location": "query", + "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values.\nIf the range to write was larger than than the range actually written,\nthe response will include all values in the requested range (excluding\ntrailing empty rows and columns).", + "type": "boolean" } }, "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}", "path": "v4/spreadsheets/{spreadsheetId}/values/{range}", - "id": "sheets.spreadsheets.values.get" + "id": "sheets.spreadsheets.values.update", + "request": { + "$ref": "ValueRange" + }, + "description": "Sets values in a range of a spreadsheet.\nThe caller must specify the spreadsheet ID, range, and\na valueInputOption." }, - "update": { + "batchUpdateByDataFilter": { + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter", + "id": "sheets.spreadsheets.values.batchUpdateByDataFilter", + "description": "Sets values in one or more ranges of a spreadsheet.\nThe caller must specify the spreadsheet ID,\na valueInputOption, and one or more\nDataFilterValueRanges.", + "request": { + "$ref": "BatchUpdateValuesByDataFilterRequest" + }, "response": { - "$ref": "UpdateValuesResponse" + "$ref": "BatchUpdateValuesByDataFilterResponse" }, "parameterOrder": [ - "spreadsheetId", - "range" + "spreadsheetId" ], - "httpMethod": "PUT", + "httpMethod": "POST", + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to update.", + "required": true, + "type": "string" + } + }, "scopes": [ "https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/spreadsheets" + ] + }, + "batchUpdate": { + "description": "Sets values in one or more ranges of a spreadsheet.\nThe caller must specify the spreadsheet ID,\na valueInputOption, and one or more\nValueRanges.", + "request": { + "$ref": "BatchUpdateValuesRequest" + }, + "response": { + "$ref": "BatchUpdateValuesResponse" + }, + "parameterOrder": [ + "spreadsheetId" ], + "httpMethod": "POST", "parameters": { - "responseDateTimeRenderOption": { - "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER.", - "type": "string", - "location": "query", - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ] - }, - "includeValuesInResponse": { - "location": "query", - "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values.\nIf the range to write was larger than than the range actually written,\nthe response will include all values in the requested range (excluding\ntrailing empty rows and columns).", - "type": "boolean" - }, - "range": { - "description": "The A1 notation of the values to update.", + "spreadsheetId": { + "description": "The ID of the spreadsheet to update.", "required": true, "type": "string", "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchUpdate", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchUpdate", + "id": "sheets.spreadsheets.values.batchUpdate" + }, + "batchGet": { + "parameters": { + "ranges": { + "description": "The A1 notation of the values to retrieve.", + "type": "string", + "repeated": true, + "location": "query" + }, + "majorDimension": { + "location": "query", + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.", + "type": "string" }, "spreadsheetId": { "location": "path", - "description": "The ID of the spreadsheet to update.", + "description": "The ID of the spreadsheet to retrieve data from.", "required": true, "type": "string" }, - "responseValueRenderOption": { + "valueRenderOption": { + "type": "string", "location": "query", "enum": [ "FORMATTED_VALUE", "UNFORMATTED_VALUE", "FORMULA" - ], - "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string" + ], + "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE." }, - "valueInputOption": { + "dateTimeRenderOption": { "location": "query", "enum": [ - "INPUT_VALUE_OPTION_UNSPECIFIED", - "RAW", - "USER_ENTERED" + "SERIAL_NUMBER", + "FORMATTED_STRING" ], - "description": "How the input data should be interpreted.", + "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", "type": "string" } }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}", - "path": "v4/spreadsheets/{spreadsheetId}/values/{range}", - "id": "sheets.spreadsheets.values.update", - "request": { - "$ref": "ValueRange" - }, - "description": "Sets values in a range of a spreadsheet.\nThe caller must specify the spreadsheet ID, range, and\na valueInputOption." - }, - "batchUpdateByDataFilter": { - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter", - "id": "sheets.spreadsheets.values.batchUpdateByDataFilter", - "description": "Sets values in one or more ranges of a spreadsheet.\nThe caller must specify the spreadsheet ID,\na valueInputOption, and one or more\nDataFilterValueRanges.", - "request": { - "$ref": "BatchUpdateValuesByDataFilterRequest" - }, - "response": { - "$ref": "BatchUpdateValuesByDataFilterResponse" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST", - "parameters": { - "spreadsheetId": { - "description": "The ID of the spreadsheet to update.", - "required": true, - "type": "string", - "location": "path" - } - }, "scopes": [ "https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ] - }, - "batchUpdate": { - "httpMethod": "POST", + "https://www.googleapis.com/auth/drive.readonly", + "https://www.googleapis.com/auth/spreadsheets", + "https://www.googleapis.com/auth/spreadsheets.readonly" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchGet", + "id": "sheets.spreadsheets.values.batchGet", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchGet", + "description": "Returns one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more ranges.", + "httpMethod": "GET", "parameterOrder": [ "spreadsheetId" ], "response": { - "$ref": "BatchUpdateValuesResponse" - }, + "$ref": "BatchGetValuesResponse" + } + }, + "clear": { "scopes": [ "https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", @@ -6067,17 +463,21 @@ "description": "The ID of the spreadsheet to update.", "required": true, "type": "string" + }, + "range": { + "required": true, + "type": "string", + "location": "path", + "description": "The A1 notation of the values to clear." } }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchUpdate", - "id": "sheets.spreadsheets.values.batchUpdate", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchUpdate", + "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}:clear", + "id": "sheets.spreadsheets.values.clear", + "path": "v4/spreadsheets/{spreadsheetId}/values/{range}:clear", "request": { - "$ref": "BatchUpdateValuesRequest" + "$ref": "ClearValuesRequest" }, - "description": "Sets values in one or more ranges of a spreadsheet.\nThe caller must specify the spreadsheet ID,\na valueInputOption, and one or more\nValueRanges." - }, - "clear": { + "description": "Clears values from a spreadsheet.\nThe caller must specify the spreadsheet ID and range.\nOnly values are cleared -- all other properties of the cell (such as\nformatting, data validation, etc..) are kept.", "httpMethod": "POST", "parameterOrder": [ "spreadsheetId", @@ -6085,19 +485,22 @@ ], "response": { "$ref": "ClearValuesResponse" + } + }, + "batchClearByDataFilter": { + "response": { + "$ref": "BatchClearValuesByDataFilterResponse" }, + "parameterOrder": [ + "spreadsheetId" + ], + "httpMethod": "POST", "parameters": { "spreadsheetId": { + "location": "path", "description": "The ID of the spreadsheet to update.", "required": true, - "type": "string", - "location": "path" - }, - "range": { - "description": "The A1 notation of the values to clear.", - "required": true, - "type": "string", - "location": "path" + "type": "string" } }, "scopes": [ @@ -6105,80 +508,125 @@ "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/spreadsheets" ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}:clear", - "id": "sheets.spreadsheets.values.clear", - "path": "v4/spreadsheets/{spreadsheetId}/values/{range}:clear", - "description": "Clears values from a spreadsheet.\nThe caller must specify the spreadsheet ID and range.\nOnly values are cleared -- all other properties of the cell (such as\nformatting, data validation, etc..) are kept.", + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter", + "id": "sheets.spreadsheets.values.batchClearByDataFilter", + "description": "Clears one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more\nDataFilters. Ranges matching any of the specified data\nfilters will be cleared. Only values are cleared -- all other properties\nof the cell (such as formatting, data validation, etc..) are kept.", "request": { - "$ref": "ClearValuesRequest" + "$ref": "BatchClearValuesByDataFilterRequest" } }, - "batchGet": { - "response": { - "$ref": "BatchGetValuesResponse" + "append": { + "id": "sheets.spreadsheets.values.append", + "path": "v4/spreadsheets/{spreadsheetId}/values/{range}:append", + "description": "Appends values to a spreadsheet. The input range is used to search for\nexisting data and find a \"table\" within that range. Values will be\nappended to the next row of the table, starting with the first column of\nthe table. See the\n[guide](/sheets/api/guides/values#appending_values)\nand\n[sample code](/sheets/api/samples/writing#append_values)\nfor specific details of how tables are detected and data is appended.\n\nThe caller must specify the spreadsheet ID, range, and\na valueInputOption. The `valueInputOption` only\ncontrols how the input data will be added to the sheet (column-wise or\nrow-wise), it does not influence what cell the data starts being written\nto.", + "request": { + "$ref": "ValueRange" }, + "httpMethod": "POST", "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "GET", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/drive.readonly", - "https://www.googleapis.com/auth/spreadsheets", - "https://www.googleapis.com/auth/spreadsheets.readonly" + "spreadsheetId", + "range" ], + "response": { + "$ref": "AppendValuesResponse" + }, "parameters": { - "spreadsheetId": { - "location": "path", - "description": "The ID of the spreadsheet to retrieve data from.", - "required": true, - "type": "string" - }, - "valueRenderOption": { - "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", + "insertDataOption": { + "description": "How the input data should be inserted.", "type": "string", "location": "query", "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" + "OVERWRITE", + "INSERT_ROWS" ] }, - "dateTimeRenderOption": { - "type": "string", + "valueInputOption": { + "location": "query", + "enum": [ + "INPUT_VALUE_OPTION_UNSPECIFIED", + "RAW", + "USER_ENTERED" + ], + "description": "How the input data should be interpreted.", + "type": "string" + }, + "responseDateTimeRenderOption": { "location": "query", "enum": [ "SERIAL_NUMBER", "FORMATTED_STRING" ], - "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER]." + "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", + "type": "string" }, - "ranges": { - "description": "The A1 notation of the values to retrieve.", + "range": { + "required": true, "type": "string", - "repeated": true, - "location": "query" + "location": "path", + "description": "The A1 notation of a range to search for a logical table of data.\nValues will be appended after the last row of the table." }, - "majorDimension": { + "includeValuesInResponse": { + "type": "boolean", + "location": "query", + "description": "Determines if the update response should include the values\nof the cells that were appended. By default, responses\ndo not include the updated values." + }, + "spreadsheetId": { + "description": "The ID of the spreadsheet to update.", + "required": true, + "type": "string", + "location": "path" + }, + "responseValueRenderOption": { + "type": "string", "location": "query", "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" ], - "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.", + "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE." + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}:append" + }, + "batchGetByDataFilter": { + "response": { + "$ref": "BatchGetValuesByDataFilterResponse" + }, + "parameterOrder": [ + "spreadsheetId" + ], + "httpMethod": "POST", + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to retrieve data from.", + "required": true, "type": "string" } }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchGet", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchGet", - "id": "sheets.spreadsheets.values.batchGet", - "description": "Returns one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more ranges." + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter", + "id": "sheets.spreadsheets.values.batchGetByDataFilter", + "request": { + "$ref": "BatchGetValuesByDataFilterRequest" + }, + "description": "Returns one or more ranges of values that match the specified data filters.\nThe caller must specify the spreadsheet ID and one or more\nDataFilters. Ranges that match any of the data filters in\nthe request will be returned." }, - "batchClearByDataFilter": { + "batchClear": { "response": { - "$ref": "BatchClearValuesByDataFilterResponse" + "$ref": "BatchClearValuesResponse" }, "parameterOrder": [ "spreadsheetId" @@ -6191,190 +639,5742 @@ ], "parameters": { "spreadsheetId": { - "description": "The ID of the spreadsheet to update.", + "description": "The ID of the spreadsheet to update.", + "required": true, + "type": "string", + "location": "path" + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchClear", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchClear", + "id": "sheets.spreadsheets.values.batchClear", + "request": { + "$ref": "BatchClearValuesRequest" + }, + "description": "Clears one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more ranges.\nOnly values are cleared -- all other properties of the cell (such as\nformatting, data validation, etc..) are kept." + } + } + }, + "sheets": { + "methods": { + "copyTo": { + "response": { + "$ref": "SheetProperties" + }, + "parameterOrder": [ + "spreadsheetId", + "sheetId" + ], + "httpMethod": "POST", + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "spreadsheetId": { + "description": "The ID of the spreadsheet containing the sheet to copy.", "required": true, "type": "string", "location": "path" - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter", - "id": "sheets.spreadsheets.values.batchClearByDataFilter", - "request": { - "$ref": "BatchClearValuesByDataFilterRequest" - }, - "description": "Clears one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more\nDataFilters. Ranges matching any of the specified data\nfilters will be cleared. Only values are cleared -- all other properties\nof the cell (such as formatting, data validation, etc..) are kept." - }, - "append": { - "id": "sheets.spreadsheets.values.append", - "path": "v4/spreadsheets/{spreadsheetId}/values/{range}:append", - "description": "Appends values to a spreadsheet. The input range is used to search for\nexisting data and find a \"table\" within that range. Values will be\nappended to the next row of the table, starting with the first column of\nthe table. See the\n[guide](/sheets/api/guides/values#appending_values)\nand\n[sample code](/sheets/api/samples/writing#append_values)\nfor specific details of how tables are detected and data is appended.\n\nThe caller must specify the spreadsheet ID, range, and\na valueInputOption. The `valueInputOption` only\ncontrols how the input data will be added to the sheet (column-wise or\nrow-wise), it does not influence what cell the data starts being written\nto.", - "request": { - "$ref": "ValueRange" - }, - "httpMethod": "POST", - "parameterOrder": [ - "spreadsheetId", - "range" - ], - "response": { - "$ref": "AppendValuesResponse" - }, - "parameters": { - "spreadsheetId": { - "required": true, - "type": "string", - "location": "path", - "description": "The ID of the spreadsheet to update." - }, - "responseValueRenderOption": { - "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string", - "location": "query", - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ] - }, - "insertDataOption": { - "description": "How the input data should be inserted.", - "type": "string", - "location": "query", - "enum": [ - "OVERWRITE", - "INSERT_ROWS" - ] - }, - "valueInputOption": { - "location": "query", - "enum": [ - "INPUT_VALUE_OPTION_UNSPECIFIED", - "RAW", - "USER_ENTERED" - ], - "description": "How the input data should be interpreted.", - "type": "string" - }, - "responseDateTimeRenderOption": { - "location": "query", - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", - "type": "string" - }, - "includeValuesInResponse": { - "description": "Determines if the update response should include the values\nof the cells that were appended. By default, responses\ndo not include the updated values.", - "type": "boolean", - "location": "query" }, - "range": { - "description": "The A1 notation of a range to search for a logical table of data.\nValues will be appended after the last row of the table.", + "sheetId": { "required": true, - "type": "string", - "location": "path" + "type": "integer", + "location": "path", + "description": "The ID of the sheet to copy.", + "format": "int32" } }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}:append" + "flatPath": "v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo", + "path": "v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo", + "id": "sheets.spreadsheets.sheets.copyTo", + "request": { + "$ref": "CopySheetToAnotherSpreadsheetRequest" + }, + "description": "Copies a single sheet from a spreadsheet to another spreadsheet.\nReturns the properties of the newly created sheet." + } + } + } + } + } + }, + "parameters": { + "alt": { + "type": "string", + "enumDescriptions": [ + "Responses with Content-Type of application/json", + "Media download with context-dependent Content-Type", + "Responses with Content-Type of application/x-protobuf" + ], + "location": "query", + "description": "Data format for response.", + "default": "json", + "enum": [ + "json", + "media", + "proto" + ] + }, + "access_token": { + "type": "string", + "location": "query", + "description": "OAuth access token." + }, + "key": { + "type": "string", + "location": "query", + "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token." + }, + "upload_protocol": { + "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").", + "type": "string", + "location": "query" + }, + "quotaUser": { + "location": "query", + "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.", + "type": "string" + }, + "prettyPrint": { + "description": "Returns response with indentations and line breaks.", + "type": "boolean", + "default": "true", + "location": "query" + }, + "fields": { + "type": "string", + "location": "query", + "description": "Selector specifying which fields to include in a partial response." + }, + "uploadType": { + "type": "string", + "location": "query", + "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\")." + }, + "callback": { + "location": "query", + "description": "JSONP", + "type": "string" + }, + "oauth_token": { + "description": "OAuth 2.0 token for the current user.", + "type": "string", + "location": "query" + }, + "$.xgafv": { + "location": "query", + "enum": [ + "1", + "2" + ], + "description": "V1 error format.", + "type": "string", + "enumDescriptions": [ + "v1 error format", + "v2 error format" + ] + } + }, + "version": "v4", + "baseUrl": "https://sheets.googleapis.com/", + "kind": "discovery#restDescription", + "description": "Reads and writes Google Sheets.", + "servicePath": "", + "basePath": "", + "revision": "20191115", + "documentationLink": "https://developers.google.com/sheets/", + "id": "sheets:v4", + "discoveryVersion": "v1", + "version_module": true, + "schemas": { + "AddSheetResponse": { + "id": "AddSheetResponse", + "description": "The result of adding a sheet.", + "type": "object", + "properties": { + "properties": { + "description": "The properties of the newly added sheet.", + "$ref": "SheetProperties" + } + } + }, + "PivotGroupRule": { + "id": "PivotGroupRule", + "description": "An optional setting on a PivotGroup that defines buckets for the values\nin the source data column rather than breaking out each individual value.\nOnly one PivotGroup with a group rule may be added for each column in\nthe source data, though on any given column you may add both a\nPivotGroup that has a rule and a PivotGroup that does not.", + "type": "object", + "properties": { + "manualRule": { + "$ref": "ManualRule", + "description": "A ManualRule." + }, + "histogramRule": { + "$ref": "HistogramRule", + "description": "A HistogramRule." + }, + "dateTimeRule": { + "$ref": "DateTimeRule", + "description": "A DateTimeRule." + } + } + }, + "AddFilterViewResponse": { + "description": "The result of adding a filter view.", + "type": "object", + "properties": { + "filter": { + "$ref": "FilterView", + "description": "The newly added filter view." + } + }, + "id": "AddFilterViewResponse" + }, + "IterativeCalculationSettings": { + "type": "object", + "properties": { + "convergenceThreshold": { + "description": "When iterative calculation is enabled and successive results differ by\nless than this threshold value, the calculation rounds stop.", + "format": "double", + "type": "number" + }, + "maxIterations": { + "description": "When iterative calculation is enabled, the maximum number of calculation\nrounds to perform.", + "format": "int32", + "type": "integer" + } + }, + "id": "IterativeCalculationSettings", + "description": "Settings to control how circular dependencies are resolved with iterative\ncalculation." + }, + "ScorecardChartSpec": { + "description": "A scorecard chart. Scorecard charts are used to highlight key performance\nindicators, known as KPIs, on the spreadsheet. A scorecard chart can\nrepresent things like total sales, average cost, or a top selling item. You\ncan specify a single data value, or aggregate over a range of data.\nPercentage or absolute difference from a baseline value can be highlighted,\nlike changes over time.", + "type": "object", + "properties": { + "numberFormatSource": { + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "Inherit number formatting from data.", + "Apply custom formatting as specified by ChartCustomNumberFormatOptions." + ], + "enum": [ + "CHART_NUMBER_FORMAT_SOURCE_UNDEFINED", + "FROM_DATA", + "CUSTOM" + ], + "description": "The number format source used in the scorecard chart.\nThis field is optional." + }, + "keyValueFormat": { + "$ref": "KeyValueFormat", + "description": "Formatting options for key value." + }, + "customFormatOptions": { + "description": "Custom formatting options for numeric key/baseline values in scorecard\nchart. This field is used only when number_format_source is set to\nCUSTOM. This field is optional.", + "$ref": "ChartCustomNumberFormatOptions" + }, + "scaleFactor": { + "type": "number", + "description": "Value to scale scorecard key and baseline value. For example, a factor of\n10 can be used to divide all values in the chart by 10.\nThis field is optional.", + "format": "double" + }, + "baselineValueFormat": { + "description": "Formatting options for baseline value.\nThis field is needed only if baseline_value_data is specified.", + "$ref": "BaselineValueFormat" + }, + "baselineValueData": { + "$ref": "ChartData", + "description": "The data for scorecard baseline value.\nThis field is optional." + }, + "keyValueData": { + "$ref": "ChartData", + "description": "The data for scorecard key value." + }, + "aggregateType": { + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "Average aggregate function.", + "Count aggregate function.", + "Maximum aggregate function.", + "Median aggregate function.", + "Minimum aggregate function.", + "Sum aggregate function." + ], + "enum": [ + "CHART_AGGREGATE_TYPE_UNSPECIFIED", + "AVERAGE", + "COUNT", + "MAX", + "MEDIAN", + "MIN", + "SUM" + ], + "description": "The aggregation type for key and baseline chart data in scorecard chart.\nThis field is optional." + } + }, + "id": "ScorecardChartSpec" + }, + "SpreadsheetProperties": { + "description": "Properties of a spreadsheet.", + "type": "object", + "properties": { + "autoRecalc": { + "enum": [ + "RECALCULATION_INTERVAL_UNSPECIFIED", + "ON_CHANGE", + "MINUTE", + "HOUR" + ], + "description": "The amount of time to wait before volatile functions are recalculated.", + "type": "string", + "enumDescriptions": [ + "Default value. This value must not be used.", + "Volatile functions are updated on every change.", + "Volatile functions are updated on every change and every minute.", + "Volatile functions are updated on every change and hourly." + ] + }, + "defaultFormat": { + "description": "The default format of all cells in the spreadsheet.\nCellData.effectiveFormat will not be set if\nthe cell's format is equal to this default format. This field is read-only.", + "$ref": "CellFormat" + }, + "title": { + "description": "The title of the spreadsheet.", + "type": "string" + }, + "timeZone": { + "type": "string", + "description": "The time zone of the spreadsheet, in CLDR format such as\n`America/New_York`. If the time zone isn't recognized, this may\nbe a custom time zone such as `GMT-07:00`." + }, + "locale": { + "type": "string", + "description": "The locale of the spreadsheet in one of the following formats:\n\n* an ISO 639-1 language code such as `en`\n\n* an ISO 639-2 language code such as `fil`, if no 639-1 code exists\n\n* a combination of the ISO language code and country code, such as `en_US`\n\nNote: when updating this field, not all locales/languages are supported." + }, + "iterativeCalculationSettings": { + "description": "Determines whether and how circular references are resolved with iterative\ncalculation. Absence of this field means that circular references will\nresult in calculation errors.", + "$ref": "IterativeCalculationSettings" + } + }, + "id": "SpreadsheetProperties" + }, + "OverlayPosition": { + "description": "The location an object is overlaid on top of a grid.", + "type": "object", + "properties": { + "widthPixels": { + "description": "The width of the object, in pixels. Defaults to 600.", + "format": "int32", + "type": "integer" + }, + "offsetXPixels": { + "description": "The horizontal offset, in pixels, that the object is offset\nfrom the anchor cell.", + "format": "int32", + "type": "integer" + }, + "anchorCell": { + "$ref": "GridCoordinate", + "description": "The cell the object is anchored to." + }, + "offsetYPixels": { + "description": "The vertical offset, in pixels, that the object is offset\nfrom the anchor cell.", + "format": "int32", + "type": "integer" + }, + "heightPixels": { + "description": "The height of the object, in pixels. Defaults to 371.", + "format": "int32", + "type": "integer" + } + }, + "id": "OverlayPosition" + }, + "AddChartResponse": { + "type": "object", + "properties": { + "chart": { + "description": "The newly added chart.", + "$ref": "EmbeddedChart" + } + }, + "id": "AddChartResponse", + "description": "The result of adding a chart to a spreadsheet." + }, + "InsertDimensionRequest": { + "type": "object", + "properties": { + "inheritFromBefore": { + "description": "Whether dimension properties should be extended from the dimensions\nbefore or after the newly inserted dimensions.\nTrue to inherit from the dimensions before (in which case the start\nindex must be greater than 0), and false to inherit from the dimensions\nafter.\n\nFor example, if row index 0 has red background and row index 1\nhas a green background, then inserting 2 rows at index 1 can inherit\neither the green or red background. If `inheritFromBefore` is true,\nthe two new rows will be red (because the row before the insertion point\nwas red), whereas if `inheritFromBefore` is false, the two new rows will\nbe green (because the row after the insertion point was green).", + "type": "boolean" + }, + "range": { + "$ref": "DimensionRange", + "description": "The dimensions to insert. Both the start and end indexes must be bounded." + } + }, + "id": "InsertDimensionRequest", + "description": "Inserts rows or columns in a sheet at a particular index." + }, + "BatchUpdateValuesRequest": { + "description": "The request for updating more than one range of values in a spreadsheet.", + "type": "object", + "properties": { + "responseDateTimeRenderOption": { + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ], + "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER.", + "type": "string", + "enumDescriptions": [ + "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", + "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." + ] + }, + "responseValueRenderOption": { + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" + ], + "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", + "type": "string", + "enumDescriptions": [ + "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", + "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", + "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." + ] + }, + "includeValuesInResponse": { + "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values. The `updatedData` field within\neach of the BatchUpdateValuesResponse.responses will contain\nthe updated values. If the range to write was larger than than the range\nactually written, the response will include all values in the requested\nrange (excluding trailing empty rows and columns).", + "type": "boolean" + }, + "valueInputOption": { + "enum": [ + "INPUT_VALUE_OPTION_UNSPECIFIED", + "RAW", + "USER_ENTERED" + ], + "description": "How the input data should be interpreted.", + "type": "string", + "enumDescriptions": [ + "Default input value. This value must not be used.", + "The values the user has entered will not be parsed and will be stored\nas-is.", + "The values will be parsed as if the user typed them into the UI.\nNumbers will stay as numbers, but strings may be converted to numbers,\ndates, etc. following the same rules that are applied when entering\ntext into a cell via the Google Sheets UI." + ] + }, + "data": { + "description": "The new values to apply to the spreadsheet.", + "type": "array", + "items": { + "$ref": "ValueRange" + } + } + }, + "id": "BatchUpdateValuesRequest" + }, + "CutPasteRequest": { + "description": "Moves data from the source to the destination.", + "type": "object", + "properties": { + "source": { + "$ref": "GridRange", + "description": "The source data to cut." + }, + "pasteType": { + "description": "What kind of data to paste. All the source data will be cut, regardless\nof what is pasted.", + "type": "string", + "enumDescriptions": [ + "Paste values, formulas, formats, and merges.", + "Paste the values ONLY without formats, formulas, or merges.", + "Paste the format and data validation only.", + "Like PASTE_NORMAL but without borders.", + "Paste the formulas only.", + "Paste the data validation only.", + "Paste the conditional formatting rules only." + ], + "enum": [ + "PASTE_NORMAL", + "PASTE_VALUES", + "PASTE_FORMAT", + "PASTE_NO_BORDERS", + "PASTE_FORMULA", + "PASTE_DATA_VALIDATION", + "PASTE_CONDITIONAL_FORMATTING" + ] + }, + "destination": { + "$ref": "GridCoordinate", + "description": "The top-left coordinate where the data should be pasted." + } + }, + "id": "CutPasteRequest" + }, + "ChartAxisViewWindowOptions": { + "id": "ChartAxisViewWindowOptions", + "description": "The options that define a \"view window\" for a chart (such as the visible\nvalues in an axis).", + "type": "object", + "properties": { + "viewWindowMax": { + "description": "The maximum numeric value to be shown in this view window. If unset, will\nautomatically determine a maximum value that looks good for the data.", + "format": "double", + "type": "number" + }, + "viewWindowMode": { + "enumDescriptions": [ + "The default view window mode used in the Sheets editor for this chart\ntype. In most cases, if set, the default mode is equivalent to\n`PRETTY`.", + "Do not use. Represents that the currently set mode is not supported by\nthe API.", + "Follows the min and max exactly if specified. If a value is unspecified,\nit will fall back to the `PRETTY` value.", + "Chooses a min and max that make the chart look good. Both min and max are\nignored in this mode." + ], + "enum": [ + "DEFAULT_VIEW_WINDOW_MODE", + "VIEW_WINDOW_MODE_UNSUPPORTED", + "EXPLICIT", + "PRETTY" + ], + "description": "The view window's mode.", + "type": "string" + }, + "viewWindowMin": { + "description": "The minimum numeric value to be shown in this view window. If unset, will\nautomatically determine a minimum value that looks good for the data.", + "format": "double", + "type": "number" + } + } + }, + "BasicChartSeries": { + "id": "BasicChartSeries", + "description": "A single series of data in a chart.\nFor example, if charting stock prices over time, multiple series may exist,\none for the \"Open Price\", \"High Price\", \"Low Price\" and \"Close Price\".", + "type": "object", + "properties": { + "series": { + "$ref": "ChartData", + "description": "The data being visualized in this chart series." + }, + "type": { + "description": "The type of this series. Valid only if the\nchartType is\nCOMBO.\nDifferent types will change the way the series is visualized.\nOnly LINE, AREA,\nand COLUMN are supported.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "A \u003ca href=\"/chart/interactive/docs/gallery/barchart\"\u003ebar chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/linechart\"\u003eline chart\u003c/a\u003e.", + "An \u003ca href=\"/chart/interactive/docs/gallery/areachart\"\u003earea chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/columnchart\"\u003ecolumn chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/scatterchart\"\u003escatter\nchart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/combochart\"\u003ecombo chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/steppedareachart\"\u003estepped area\nchart\u003c/a\u003e." + ], + "enum": [ + "BASIC_CHART_TYPE_UNSPECIFIED", + "BAR", + "LINE", + "AREA", + "COLUMN", + "SCATTER", + "COMBO", + "STEPPED_AREA" + ] + }, + "targetAxis": { + "enum": [ + "BASIC_CHART_AXIS_POSITION_UNSPECIFIED", + "BOTTOM_AXIS", + "LEFT_AXIS", + "RIGHT_AXIS" + ], + "description": "The minor axis that will specify the range of values for this series.\nFor example, if charting stocks over time, the \"Volume\" series\nmay want to be pinned to the right with the prices pinned to the left,\nbecause the scale of trading volume is different than the scale of\nprices.\nIt is an error to specify an axis that isn't a valid minor axis\nfor the chart's type.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "The axis rendered at the bottom of a chart.\nFor most charts, this is the standard major axis.\nFor bar charts, this is a minor axis.", + "The axis rendered at the left of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is the standard major axis.", + "The axis rendered at the right of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is an unusual major axis." + ] + }, + "color": { + "$ref": "Color", + "description": "The color for elements (i.e. bars, lines, points) associated with this\nseries. If empty, a default color is used." + }, + "lineStyle": { + "$ref": "LineStyle", + "description": "The line style of this series. Valid only if the\nchartType is AREA,\nLINE, or SCATTER.\nCOMBO charts are also supported if the\nseries chart type is\nAREA or LINE." + } + } + }, + "AutoResizeDimensionsRequest": { + "description": "Automatically resizes one or more dimensions based on the contents\nof the cells in that dimension.", + "type": "object", + "properties": { + "dimensions": { + "$ref": "DimensionRange", + "description": "The dimensions to automatically resize." + } + }, + "id": "AutoResizeDimensionsRequest" + }, + "UpdateBordersRequest": { + "id": "UpdateBordersRequest", + "description": "Updates the borders of a range.\nIf a field is not set in the request, that means the border remains as-is.\nFor example, with two subsequent UpdateBordersRequest:\n\n 1. range: A1:A5 `{ top: RED, bottom: WHITE }`\n 2. range: A1:A5 `{ left: BLUE }`\n\nThat would result in A1:A5 having a borders of\n`{ top: RED, bottom: WHITE, left: BLUE }`.\nIf you want to clear a border, explicitly set the style to\nNONE.", + "type": "object", + "properties": { + "left": { + "$ref": "Border", + "description": "The border to put at the left of the range." + }, + "bottom": { + "$ref": "Border", + "description": "The border to put at the bottom of the range." + }, + "innerVertical": { + "$ref": "Border", + "description": "The vertical border to put within the range." + }, + "right": { + "$ref": "Border", + "description": "The border to put at the right of the range." + }, + "range": { + "$ref": "GridRange", + "description": "The range whose borders should be updated." + }, + "innerHorizontal": { + "$ref": "Border", + "description": "The horizontal border to put within the range." + }, + "top": { + "$ref": "Border", + "description": "The border to put at the top of the range." + } + } + }, + "CellFormat": { + "description": "The format of a cell.", + "type": "object", + "properties": { + "numberFormat": { + "$ref": "NumberFormat", + "description": "A format describing how number values should be represented to the user." + }, + "hyperlinkDisplayType": { + "type": "string", + "enumDescriptions": [ + "The default value: the hyperlink is rendered. Do not use this.", + "A hyperlink should be explicitly rendered.", + "A hyperlink should not be rendered." + ], + "enum": [ + "HYPERLINK_DISPLAY_TYPE_UNSPECIFIED", + "LINKED", + "PLAIN_TEXT" + ], + "description": "How a hyperlink, if it exists, should be displayed in the cell." + }, + "horizontalAlignment": { + "type": "string", + "enumDescriptions": [ + "The horizontal alignment is not specified. Do not use this.", + "The text is explicitly aligned to the left of the cell.", + "The text is explicitly aligned to the center of the cell.", + "The text is explicitly aligned to the right of the cell." + ], + "enum": [ + "HORIZONTAL_ALIGN_UNSPECIFIED", + "LEFT", + "CENTER", + "RIGHT" + ], + "description": "The horizontal alignment of the value in the cell." + }, + "textFormat": { + "$ref": "TextFormat", + "description": "The format of the text in the cell (unless overridden by a format run)." + }, + "backgroundColor": { + "$ref": "Color", + "description": "The background color of the cell." + }, + "padding": { + "$ref": "Padding", + "description": "The padding of the cell." + }, + "verticalAlignment": { + "description": "The vertical alignment of the value in the cell.", + "type": "string", + "enumDescriptions": [ + "The vertical alignment is not specified. Do not use this.", + "The text is explicitly aligned to the top of the cell.", + "The text is explicitly aligned to the middle of the cell.", + "The text is explicitly aligned to the bottom of the cell." + ], + "enum": [ + "VERTICAL_ALIGN_UNSPECIFIED", + "TOP", + "MIDDLE", + "BOTTOM" + ] + }, + "borders": { + "description": "The borders of the cell.", + "$ref": "Borders" + }, + "textDirection": { + "enumDescriptions": [ + "The text direction is not specified. Do not use this.", + "The text direction of left-to-right was set by the user.", + "The text direction of right-to-left was set by the user." + ], + "enum": [ + "TEXT_DIRECTION_UNSPECIFIED", + "LEFT_TO_RIGHT", + "RIGHT_TO_LEFT" + ], + "description": "The direction of the text in the cell.", + "type": "string" + }, + "wrapStrategy": { + "description": "The wrap strategy for the value in the cell.", + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Lines that are longer than the cell width will be written in the next\ncell over, so long as that cell is empty. If the next cell over is\nnon-empty, this behaves the same as CLIP. The text will never wrap\nto the next line unless the user manually inserts a new line.\nExample:\n\n | First sentence. |\n | Manual newline that is very long. \u003c- Text continues into next cell\n | Next newline. |", + "This wrap strategy represents the old Google Sheets wrap strategy where\nwords that are longer than a line are clipped rather than broken. This\nstrategy is not supported on all platforms and is being phased out.\nExample:\n\n | Cell has a |\n | loooooooooo| \u003c- Word is clipped.\n | word. |", + "Lines that are longer than the cell width will be clipped.\nThe text will never wrap to the next line unless the user manually\ninserts a new line.\nExample:\n\n | First sentence. |\n | Manual newline t| \u003c- Text is clipped\n | Next newline. |", + "Words that are longer than a line are wrapped at the character level\nrather than clipped.\nExample:\n\n | Cell has a |\n | loooooooooo| \u003c- Word is broken.\n | ong word. |" + ], + "enum": [ + "WRAP_STRATEGY_UNSPECIFIED", + "OVERFLOW_CELL", + "LEGACY_WRAP", + "CLIP", + "WRAP" + ] + }, + "textRotation": { + "$ref": "TextRotation", + "description": "The rotation applied to text in a cell" + } + }, + "id": "CellFormat" + }, + "ClearValuesResponse": { + "id": "ClearValuesResponse", + "description": "The response when clearing a range of values in a spreadsheet.", + "type": "object", + "properties": { + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", + "type": "string" + }, + "clearedRange": { + "description": "The range (in A1 notation) that was cleared.\n(If the request was for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual range\n that was cleared, bounded to the sheet's limits.)", + "type": "string" + } + } + }, + "WaterfallChartCustomSubtotal": { + "description": "A custom subtotal column for a waterfall chart series.", + "type": "object", + "properties": { + "subtotalIndex": { + "description": "The 0-based index of a data point within the series. If\ndata_is_subtotal is true, the data point at this index is the\nsubtotal. Otherwise, the subtotal appears after the data point with\nthis index. A series can have multiple subtotals at arbitrary indices,\nbut subtotals do not affect the indices of the data points. For\nexample, if a series has three data points, their indices will always\nbe 0, 1, and 2, regardless of how many subtotals exist on the series or\nwhat data points they are associated with.", + "format": "int32", + "type": "integer" + }, + "dataIsSubtotal": { + "type": "boolean", + "description": "True if the data point at subtotal_index is the subtotal. If false,\nthe subtotal will be computed and appear after the data point." + }, + "label": { + "description": "A label for the subtotal column.", + "type": "string" + } + }, + "id": "WaterfallChartCustomSubtotal" + }, + "ChartData": { + "description": "The data included in a domain or series.", + "type": "object", + "properties": { + "sourceRange": { + "description": "The source ranges of the data.", + "$ref": "ChartSourceRange" + } + }, + "id": "ChartData" + }, + "BatchGetValuesResponse": { + "type": "object", + "properties": { + "valueRanges": { + "description": "The requested values. The order of the ValueRanges is the same as the\norder of the requested ranges.", + "type": "array", + "items": { + "$ref": "ValueRange" + } + }, + "spreadsheetId": { + "description": "The ID of the spreadsheet the data was retrieved from.", + "type": "string" + } + }, + "id": "BatchGetValuesResponse", + "description": "The response when retrieving more than one range of values in a spreadsheet." + }, + "UpdateBandingRequest": { + "description": "Updates properties of the supplied banded range.", + "type": "object", + "properties": { + "bandedRange": { + "$ref": "BandedRange", + "description": "The banded range to update with the new properties." + }, + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `bandedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" + } + }, + "id": "UpdateBandingRequest" + }, + "Color": { + "description": "Represents a color in the RGBA color space. This representation is designed\nfor simplicity of conversion to/from color representations in various\nlanguages over compactness; for example, the fields of this representation\ncan be trivially provided to the constructor of \"java.awt.Color\" in Java; it\ncan also be trivially provided to UIColor's \"+colorWithRed:green:blue:alpha\"\nmethod in iOS; and, with just a little work, it can be easily formatted into\na CSS \"rgba()\" string in JavaScript, as well.\n\nNote: this proto does not carry information about the absolute color space\nthat should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,\nDCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color\nspace.\n\nExample (Java):\n\n import com.google.type.Color;\n\n // ...\n public static java.awt.Color fromProto(Color protocolor) {\n float alpha = protocolor.hasAlpha()\n ? protocolor.getAlpha().getValue()\n : 1.0;\n\n return new java.awt.Color(\n protocolor.getRed(),\n protocolor.getGreen(),\n protocolor.getBlue(),\n alpha);\n }\n\n public static Color toProto(java.awt.Color color) {\n float red = (float) color.getRed();\n float green = (float) color.getGreen();\n float blue = (float) color.getBlue();\n float denominator = 255.0;\n Color.Builder resultBuilder =\n Color\n .newBuilder()\n .setRed(red / denominator)\n .setGreen(green / denominator)\n .setBlue(blue / denominator);\n int alpha = color.getAlpha();\n if (alpha != 255) {\n result.setAlpha(\n FloatValue\n .newBuilder()\n .setValue(((float) alpha) / denominator)\n .build());\n }\n return resultBuilder.build();\n }\n // ...\n\nExample (iOS / Obj-C):\n\n // ...\n static UIColor* fromProto(Color* protocolor) {\n float red = [protocolor red];\n float green = [protocolor green];\n float blue = [protocolor blue];\n FloatValue* alpha_wrapper = [protocolor alpha];\n float alpha = 1.0;\n if (alpha_wrapper != nil) {\n alpha = [alpha_wrapper value];\n }\n return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];\n }\n\n static Color* toProto(UIColor* color) {\n CGFloat red, green, blue, alpha;\n if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {\n return nil;\n }\n Color* result = [[Color alloc] init];\n [result setRed:red];\n [result setGreen:green];\n [result setBlue:blue];\n if (alpha \u003c= 0.9999) {\n [result setAlpha:floatWrapperWithValue(alpha)];\n }\n [result autorelease];\n return result;\n }\n // ...\n\n Example (JavaScript):\n\n // ...\n\n var protoToCssColor = function(rgb_color) {\n var redFrac = rgb_color.red || 0.0;\n var greenFrac = rgb_color.green || 0.0;\n var blueFrac = rgb_color.blue || 0.0;\n var red = Math.floor(redFrac * 255);\n var green = Math.floor(greenFrac * 255);\n var blue = Math.floor(blueFrac * 255);\n\n if (!('alpha' in rgb_color)) {\n return rgbToCssColor_(red, green, blue);\n }\n\n var alphaFrac = rgb_color.alpha.value || 0.0;\n var rgbParams = [red, green, blue].join(',');\n return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');\n };\n\n var rgbToCssColor_ = function(red, green, blue) {\n var rgbNumber = new Number((red \u003c\u003c 16) | (green \u003c\u003c 8) | blue);\n var hexString = rgbNumber.toString(16);\n var missingZeros = 6 - hexString.length;\n var resultBuilder = ['#'];\n for (var i = 0; i \u003c missingZeros; i++) {\n resultBuilder.push('0');\n }\n resultBuilder.push(hexString);\n return resultBuilder.join('');\n };\n\n // ...", + "type": "object", + "properties": { + "red": { + "type": "number", + "description": "The amount of red in the color as a value in the interval [0, 1].", + "format": "float" + }, + "green": { + "description": "The amount of green in the color as a value in the interval [0, 1].", + "format": "float", + "type": "number" + }, + "blue": { + "description": "The amount of blue in the color as a value in the interval [0, 1].", + "format": "float", + "type": "number" + }, + "alpha": { + "type": "number", + "description": "The fraction of this color that should be applied to the pixel. That is,\nthe final pixel color is defined by the equation:\n\n pixel color = alpha * (this color) + (1.0 - alpha) * (background color)\n\nThis means that a value of 1.0 corresponds to a solid color, whereas\na value of 0.0 corresponds to a completely transparent color. This\nuses a wrapper message rather than a simple float scalar so that it is\npossible to distinguish between a default value and the value being unset.\nIf omitted, this color object is to be rendered as a solid color\n(as if the alpha value had been explicitly given with a value of 1.0).", + "format": "float" + } + }, + "id": "Color" + }, + "TrimWhitespaceRequest": { + "type": "object", + "properties": { + "range": { + "$ref": "GridRange", + "description": "The range whose cells to trim." + } + }, + "id": "TrimWhitespaceRequest", + "description": "Trims the whitespace (such as spaces, tabs, or new lines) in every cell in\nthe specified range. This request removes all whitespace from the start and\nend of each cell's text, and reduces any subsequence of remaining whitespace\ncharacters to a single space. If the resulting trimmed text starts with a '+'\nor '=' character, the text remains as a string value and isn't interpreted\nas a formula." + }, + "ChartSourceRange": { + "description": "Source ranges for a chart.", + "type": "object", + "properties": { + "sources": { + "type": "array", + "items": { + "$ref": "GridRange" + }, + "description": "The ranges of data for a series or domain.\nExactly one dimension must have a length of 1,\nand all sources in the list must have the same dimension\nwith length 1.\nThe domain (if it exists) & all series must have the same number\nof source ranges. If using more than one source range, then the source\nrange at a given offset must be in order and contiguous across the domain\nand series.\n\nFor example, these are valid configurations:\n\n domain sources: A1:A5\n series1 sources: B1:B5\n series2 sources: D6:D10\n\n domain sources: A1:A5, C10:C12\n series1 sources: B1:B5, D10:D12\n series2 sources: C1:C5, E10:E12" + } + }, + "id": "ChartSourceRange" + }, + "ValueRange": { + "description": "Data within a range of the spreadsheet.", + "type": "object", + "properties": { + "majorDimension": { + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The major dimension of the values.\n\nFor output, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.\n\nFor input, with `range=A1:B2,majorDimension=ROWS` then `[[1,2],[3,4]]`\nwill set `A1=1,B1=2,A2=3,B2=4`. With `range=A1:B2,majorDimension=COLUMNS`\nthen `[[1,2],[3,4]]` will set `A1=1,B1=3,A2=2,B2=4`.\n\nWhen writing, if this field is not set, it defaults to ROWS.", + "type": "string" + }, + "values": { + "description": "The data that was read or to be written. This is an array of arrays,\nthe outer array representing all the data and each inner array\nrepresenting a major dimension. Each item in the inner array\ncorresponds with one cell.\n\nFor output, empty trailing rows and columns will not be included.\n\nFor input, supported value types are: bool, string, and double.\nNull values will be skipped.\nTo set a cell to an empty value, set the string value to an empty string.", + "type": "array", + "items": { + "type": "array", + "items": { + "type": "any" + } + } + }, + "range": { + "description": "The range the values cover, in A1 notation.\nFor output, this range indicates the entire requested range,\neven though the values will exclude trailing rows and columns.\nWhen appending values, this field represents the range to search for a\ntable, after which values will be appended.", + "type": "string" + } + }, + "id": "ValueRange" + }, + "AddBandingRequest": { + "description": "Adds a new banded range to the spreadsheet.", + "type": "object", + "properties": { + "bandedRange": { + "$ref": "BandedRange", + "description": "The banded range to add. The bandedRangeId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a range that already exists.)" + } + }, + "id": "AddBandingRequest" + }, + "Response": { + "type": "object", + "properties": { + "deleteDeveloperMetadata": { + "description": "A reply from deleting a developer metadata entry.", + "$ref": "DeleteDeveloperMetadataResponse" + }, + "trimWhitespace": { + "description": "A reply from trimming whitespace.", + "$ref": "TrimWhitespaceResponse" + }, + "addFilterView": { + "description": "A reply from adding a filter view.", + "$ref": "AddFilterViewResponse" + }, + "deleteDuplicates": { + "$ref": "DeleteDuplicatesResponse", + "description": "A reply from removing rows containing duplicate values." + }, + "addBanding": { + "$ref": "AddBandingResponse", + "description": "A reply from adding a banded range." + }, + "addProtectedRange": { + "$ref": "AddProtectedRangeResponse", + "description": "A reply from adding a protected range." + }, + "duplicateSheet": { + "$ref": "DuplicateSheetResponse", + "description": "A reply from duplicating a sheet." + }, + "addSlicer": { + "$ref": "AddSlicerResponse", + "description": "A reply from adding a slicer." + }, + "updateEmbeddedObjectPosition": { + "$ref": "UpdateEmbeddedObjectPositionResponse", + "description": "A reply from updating an embedded object's position." + }, + "deleteConditionalFormatRule": { + "description": "A reply from deleting a conditional format rule.", + "$ref": "DeleteConditionalFormatRuleResponse" + }, + "deleteDimensionGroup": { + "description": "A reply from deleting a dimension group.", + "$ref": "DeleteDimensionGroupResponse" + }, + "duplicateFilterView": { + "$ref": "DuplicateFilterViewResponse", + "description": "A reply from duplicating a filter view." + }, + "addDimensionGroup": { + "description": "A reply from adding a dimension group.", + "$ref": "AddDimensionGroupResponse" + }, + "addChart": { + "$ref": "AddChartResponse", + "description": "A reply from adding a chart." + }, + "updateDeveloperMetadata": { + "description": "A reply from updating a developer metadata entry.", + "$ref": "UpdateDeveloperMetadataResponse" + }, + "findReplace": { + "$ref": "FindReplaceResponse", + "description": "A reply from doing a find/replace." + }, + "addSheet": { + "$ref": "AddSheetResponse", + "description": "A reply from adding a sheet." + }, + "updateConditionalFormatRule": { + "$ref": "UpdateConditionalFormatRuleResponse", + "description": "A reply from updating a conditional format rule." + }, + "createDeveloperMetadata": { + "$ref": "CreateDeveloperMetadataResponse", + "description": "A reply from creating a developer metadata entry." + }, + "addNamedRange": { + "$ref": "AddNamedRangeResponse", + "description": "A reply from adding a named range." + } + }, + "id": "Response", + "description": "A single response from an update." + }, + "EmbeddedChart": { + "description": "A chart embedded in a sheet.", + "type": "object", + "properties": { + "chartId": { + "description": "The ID of the chart.", + "format": "int32", + "type": "integer" + }, + "position": { + "$ref": "EmbeddedObjectPosition", + "description": "The position of the chart." + }, + "spec": { + "description": "The specification of the chart.", + "$ref": "ChartSpec" + } + }, + "id": "EmbeddedChart" + }, + "InsertRangeRequest": { + "description": "Inserts cells into a range, shifting the existing cells over or down.", + "type": "object", + "properties": { + "shiftDimension": { + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The dimension which will be shifted when inserting cells.\nIf ROWS, existing cells will be shifted down.\nIf COLUMNS, existing cells will be shifted right.", + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ] + }, + "range": { + "$ref": "GridRange", + "description": "The range to insert new cells into." + } + }, + "id": "InsertRangeRequest" + }, + "AddNamedRangeResponse": { + "type": "object", + "properties": { + "namedRange": { + "$ref": "NamedRange", + "description": "The named range to add." + } + }, + "id": "AddNamedRangeResponse", + "description": "The result of adding a named range." + }, + "AddSheetRequest": { + "description": "Adds a new sheet.\nWhen a sheet is added at a given index,\nall subsequent sheets' indexes are incremented.\nTo add an object sheet, use AddChartRequest instead and specify\nEmbeddedObjectPosition.sheetId or\nEmbeddedObjectPosition.newSheet.", + "type": "object", + "properties": { + "properties": { + "$ref": "SheetProperties", + "description": "The properties the new sheet should have.\nAll properties are optional.\nThe sheetId field is optional; if one is not\nset, an id will be randomly generated. (It is an error to specify the ID\nof a sheet that already exists.)" + } + }, + "id": "AddSheetRequest" + }, + "AddSlicerRequest": { + "description": "Adds a slicer to a sheet in the spreadsheet.", + "type": "object", + "properties": { + "slicer": { + "$ref": "Slicer", + "description": "The slicer that should be added to the spreadsheet, including\nthe position where it should be placed. The slicerId field is optional; if one is not set, an id\nwill be randomly generated. (It is an error to specify the ID\nof a slicer that already exists.)" + } + }, + "id": "AddSlicerRequest" + }, + "DeleteConditionalFormatRuleResponse": { + "id": "DeleteConditionalFormatRuleResponse", + "description": "The result of deleting a conditional format rule.", + "type": "object", + "properties": { + "rule": { + "description": "The rule that was deleted.", + "$ref": "ConditionalFormatRule" + } + } + }, + "GridCoordinate": { + "description": "A coordinate in a sheet.\nAll indexes are zero-based.", + "type": "object", + "properties": { + "rowIndex": { + "type": "integer", + "description": "The row index of the coordinate.", + "format": "int32" + }, + "columnIndex": { + "description": "The column index of the coordinate.", + "format": "int32", + "type": "integer" + }, + "sheetId": { + "type": "integer", + "description": "The sheet this coordinate is on.", + "format": "int32" + } + }, + "id": "GridCoordinate" + }, + "UpdateSheetPropertiesRequest": { + "description": "Updates properties of the sheet with the specified\nsheetId.", + "type": "object", + "properties": { + "properties": { + "description": "The properties to update.", + "$ref": "SheetProperties" + }, + "fields": { + "type": "string", + "description": "The fields that should be updated. At least one field must be specified.\nThe root `properties` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask" + } + }, + "id": "UpdateSheetPropertiesRequest" + }, + "AddSlicerResponse": { + "description": "The result of adding a slicer to a spreadsheet.", + "type": "object", + "properties": { + "slicer": { + "$ref": "Slicer", + "description": "The newly added slicer." + } + }, + "id": "AddSlicerResponse" + }, + "GridProperties": { + "type": "object", + "properties": { + "rowCount": { + "description": "The number of rows in the grid.", + "format": "int32", + "type": "integer" + }, + "hideGridlines": { + "description": "True if the grid isn't showing gridlines in the UI.", + "type": "boolean" + }, + "frozenRowCount": { + "type": "integer", + "description": "The number of rows that are frozen in the grid.", + "format": "int32" + }, + "columnCount": { + "description": "The number of columns in the grid.", + "format": "int32", + "type": "integer" + }, + "frozenColumnCount": { + "description": "The number of columns that are frozen in the grid.", + "format": "int32", + "type": "integer" + }, + "columnGroupControlAfter": { + "type": "boolean", + "description": "True if the column grouping control toggle is shown after the group." + }, + "rowGroupControlAfter": { + "description": "True if the row grouping control toggle is shown after the group.", + "type": "boolean" + } + }, + "id": "GridProperties", + "description": "Properties of a grid." + }, + "Sheet": { + "type": "object", + "properties": { + "properties": { + "$ref": "SheetProperties", + "description": "The properties of the sheet." + }, + "columnGroups": { + "description": "All column groups on this sheet, ordered by increasing range start index,\nthen by group depth.", + "type": "array", + "items": { + "$ref": "DimensionGroup" + } + }, + "conditionalFormats": { + "description": "The conditional format rules in this sheet.", + "type": "array", + "items": { + "$ref": "ConditionalFormatRule" + } + }, + "protectedRanges": { + "description": "The protected ranges in this sheet.", + "type": "array", + "items": { + "$ref": "ProtectedRange" + } + }, + "developerMetadata": { + "description": "The developer metadata associated with a sheet.", + "type": "array", + "items": { + "$ref": "DeveloperMetadata" + } + }, + "basicFilter": { + "$ref": "BasicFilter", + "description": "The filter on this sheet, if any." + }, + "merges": { + "description": "The ranges that are merged together.", + "type": "array", + "items": { + "$ref": "GridRange" + } + }, + "bandedRanges": { + "description": "The banded (alternating colors) ranges on this sheet.", + "type": "array", + "items": { + "$ref": "BandedRange" + } + }, + "charts": { + "description": "The specifications of every chart on this sheet.", + "type": "array", + "items": { + "$ref": "EmbeddedChart" + } + }, + "filterViews": { + "description": "The filter views in this sheet.", + "type": "array", + "items": { + "$ref": "FilterView" + } + }, + "slicers": { + "description": "The slicers on this sheet.", + "type": "array", + "items": { + "$ref": "Slicer" + } + }, + "rowGroups": { + "description": "All row groups on this sheet, ordered by increasing range start index, then\nby group depth.", + "type": "array", + "items": { + "$ref": "DimensionGroup" + } + }, + "data": { + "description": "Data in the grid, if this is a grid sheet.\nThe number of GridData objects returned is dependent on the number of\nranges requested on this sheet. For example, if this is representing\n`Sheet1`, and the spreadsheet was requested with ranges\n`Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a\nstartRow/startColumn of `0`,\nwhile the second one will have `startRow 14` (zero-based row 15),\nand `startColumn 3` (zero-based column D).", + "type": "array", + "items": { + "$ref": "GridData" + } + } + }, + "id": "Sheet", + "description": "A sheet in a spreadsheet." + }, + "FilterCriteria": { + "description": "Criteria for showing/hiding rows in a filter or filter view.", + "type": "object", + "properties": { + "hiddenValues": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Values that should be hidden." + }, + "condition": { + "$ref": "BooleanCondition", + "description": "A condition that must be true for values to be shown.\n(This does not override hidden_values -- if a value is listed there,\n it will still be hidden.)" + }, + "visibleBackgroundColor": { + "$ref": "Color", + "description": "The background fill color to filter by; only cells with this fill color are\nshown. Mutually exclusive with all other filter criteria. Requests to set\nthis field will fail with a 400 error if any other filter criteria field is\nset." + }, + "visibleForegroundColor": { + "description": "The text color to filter by; only cells with this text color are shown.\nMutually exclusive with all other filter criteria. Requests to set this\nfield will fail with a 400 error if any other filter criteria field is set.", + "$ref": "Color" + } + }, + "id": "FilterCriteria" + }, + "PivotGroupValueMetadata": { + "type": "object", + "properties": { + "value": { + "description": "The calculated value the metadata corresponds to.\n(Note that formulaValue is not valid,\n because the values will be calculated.)", + "$ref": "ExtendedValue" + }, + "collapsed": { + "description": "True if the data corresponding to the value is collapsed.", + "type": "boolean" + } + }, + "id": "PivotGroupValueMetadata", + "description": "Metadata about a value in a pivot grouping." + }, + "Editors": { + "id": "Editors", + "description": "The editors of a protected range.", + "type": "object", + "properties": { + "users": { + "description": "The email addresses of users with edit access to the protected range.", + "type": "array", + "items": { + "type": "string" + } + }, + "groups": { + "description": "The email addresses of groups with edit access to the protected range.", + "type": "array", + "items": { + "type": "string" + } + }, + "domainUsersCanEdit": { + "description": "True if anyone in the document's domain has edit access to the protected\nrange. Domain protection is only supported on documents within a domain.", + "type": "boolean" + } + } + }, + "DataValidationRule": { + "description": "A data validation rule.", + "type": "object", + "properties": { + "showCustomUi": { + "description": "True if the UI should be customized based on the kind of condition.\nIf true, \"List\" conditions will show a dropdown.", + "type": "boolean" + }, + "strict": { + "description": "True if invalid data should be rejected.", + "type": "boolean" + }, + "inputMessage": { + "description": "A message to show the user when adding data to the cell.", + "type": "string" + }, + "condition": { + "$ref": "BooleanCondition", + "description": "The condition that data in the cell must match." + } + }, + "id": "DataValidationRule" + }, + "TextRotation": { + "description": "The rotation applied to text in a cell.", + "type": "object", + "properties": { + "angle": { + "description": "The angle between the standard orientation and the desired orientation.\nMeasured in degrees. Valid values are between -90 and 90. Positive\nangles are angled upwards, negative are angled downwards.\n\nNote: For LTR text direction positive angles are in the\ncounterclockwise direction, whereas for RTL they are in the clockwise\ndirection", + "format": "int32", + "type": "integer" + }, + "vertical": { + "description": "If true, text reads top to bottom, but the orientation of individual\ncharacters is unchanged.\nFor example:\n\n | V |\n | e |\n | r |\n | t |\n | i |\n | c |\n | a |\n | l |", + "type": "boolean" + } + }, + "id": "TextRotation" + }, + "DeleteDimensionGroupResponse": { + "type": "object", + "properties": { + "dimensionGroups": { + "description": "All groups of a dimension after deleting a group from that dimension.", + "type": "array", + "items": { + "$ref": "DimensionGroup" + } + } + }, + "id": "DeleteDimensionGroupResponse", + "description": "The result of deleting a group." + }, + "PieChartSpec": { + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/piechart\"\u003epie chart\u003c/a\u003e.", + "type": "object", + "properties": { + "domain": { + "description": "The data that covers the domain of the pie chart.", + "$ref": "ChartData" + }, + "threeDimensional": { + "type": "boolean", + "description": "True if the pie is three dimensional." + }, + "series": { + "description": "The data that covers the one and only series of the pie chart.", + "$ref": "ChartData" + }, + "legendPosition": { + "description": "Where the legend of the pie chart should be drawn.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "The legend is rendered on the bottom of the chart.", + "The legend is rendered on the left of the chart.", + "The legend is rendered on the right of the chart.", + "The legend is rendered on the top of the chart.", + "No legend is rendered.", + "Each pie slice has a label attached to it." + ], + "enum": [ + "PIE_CHART_LEGEND_POSITION_UNSPECIFIED", + "BOTTOM_LEGEND", + "LEFT_LEGEND", + "RIGHT_LEGEND", + "TOP_LEGEND", + "NO_LEGEND", + "LABELED_LEGEND" + ] + }, + "pieHole": { + "type": "number", + "description": "The size of the hole in the pie chart.", + "format": "double" + } + }, + "id": "PieChartSpec" + }, + "UpdateDeveloperMetadataRequest": { + "id": "UpdateDeveloperMetadataRequest", + "description": "A request to update properties of developer metadata.\nUpdates the properties of the developer metadata selected by the filters to\nthe values provided in the DeveloperMetadata resource. Callers must\nspecify the properties they wish to update in the fields parameter, as well\nas specify at least one DataFilter matching the metadata they wish to\nupdate.", + "type": "object", + "properties": { + "dataFilters": { + "type": "array", + "items": { + "$ref": "DataFilter" + }, + "description": "The filters matching the developer metadata entries to update." + }, + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `developerMetadata` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" + }, + "developerMetadata": { + "$ref": "DeveloperMetadata", + "description": "The value that all metadata matched by the data filters will be updated to." + } + } + }, + "UpdateFilterViewRequest": { + "id": "UpdateFilterViewRequest", + "description": "Updates properties of the filter view.", + "type": "object", + "properties": { + "filter": { + "$ref": "FilterView", + "description": "The new properties of the filter view." + }, + "fields": { + "type": "string", + "description": "The fields that should be updated. At least one field must be specified.\nThe root `filter` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask" + } + } + }, + "UpdateSlicerSpecRequest": { + "description": "Updates a slicer’s specifications.\n(This does not move or resize a slicer. To move or resize a slicer use\nUpdateEmbeddedObjectPositionRequest.", + "type": "object", + "properties": { + "spec": { + "$ref": "SlicerSpec", + "description": "The specification to apply to the slicer." + }, + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `SlicerSpec` is implied and should not be specified. A single \"*\"`\ncan be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" + }, + "slicerId": { + "description": "The id of the slicer to update.", + "format": "int32", + "type": "integer" + } + }, + "id": "UpdateSlicerSpecRequest" + }, + "ConditionalFormatRule": { + "description": "A rule describing a conditional format.", + "type": "object", + "properties": { + "ranges": { + "description": "The ranges that are formatted if the condition is true.\nAll the ranges must be on the same grid.", + "type": "array", + "items": { + "$ref": "GridRange" + } + }, + "gradientRule": { + "$ref": "GradientRule", + "description": "The formatting will vary based on the gradients in the rule." + }, + "booleanRule": { + "$ref": "BooleanRule", + "description": "The formatting is either \"on\" or \"off\" according to the rule." + } + }, + "id": "ConditionalFormatRule" + }, + "CopyPasteRequest": { + "id": "CopyPasteRequest", + "description": "Copies data from the source to the destination.", + "type": "object", + "properties": { + "source": { + "$ref": "GridRange", + "description": "The source range to copy." + }, + "pasteType": { + "type": "string", + "enumDescriptions": [ + "Paste values, formulas, formats, and merges.", + "Paste the values ONLY without formats, formulas, or merges.", + "Paste the format and data validation only.", + "Like PASTE_NORMAL but without borders.", + "Paste the formulas only.", + "Paste the data validation only.", + "Paste the conditional formatting rules only." + ], + "enum": [ + "PASTE_NORMAL", + "PASTE_VALUES", + "PASTE_FORMAT", + "PASTE_NO_BORDERS", + "PASTE_FORMULA", + "PASTE_DATA_VALIDATION", + "PASTE_CONDITIONAL_FORMATTING" + ], + "description": "What kind of data to paste." + }, + "destination": { + "description": "The location to paste to. If the range covers a span that's\na multiple of the source's height or width, then the\ndata will be repeated to fill in the destination range.\nIf the range is smaller than the source range, the entire\nsource data will still be copied (beyond the end of the destination range).", + "$ref": "GridRange" + }, + "pasteOrientation": { + "enumDescriptions": [ + "Paste normally.", + "Paste transposed, where all rows become columns and vice versa." + ], + "enum": [ + "NORMAL", + "TRANSPOSE" + ], + "description": "How that data should be oriented when pasting.", + "type": "string" + } + } + }, + "BooleanCondition": { + "description": "A condition that can evaluate to true or false.\nBooleanConditions are used by conditional formatting,\ndata validation, and the criteria in filters.", + "type": "object", + "properties": { + "type": { + "enumDescriptions": [ + "The default value, do not use.", + "The cell's value must be greater than the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be greater than or equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be less than the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be less than or equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be not equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be between the two condition values.\nSupported by data validation, conditional formatting and filters.\nRequires exactly two ConditionValues.", + "The cell's value must not be between the two condition values.\nSupported by data validation, conditional formatting and filters.\nRequires exactly two ConditionValues.", + "The cell's value must contain the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must not contain the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must start with the condition's value.\nSupported by conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must end with the condition's value.\nSupported by conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be exactly the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be a valid email address.\nSupported by data validation.\nRequires no ConditionValues.", + "The cell's value must be a valid URL.\nSupported by data validation.\nRequires no ConditionValues.", + "The cell's value must be the same date as the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be before the date of the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue\nthat may be a relative date.", + "The cell's value must be after the date of the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue\nthat may be a relative date.", + "The cell's value must be on or before the date of the condition's value.\nSupported by data validation.\nRequires a single ConditionValue\nthat may be a relative date.", + "The cell's value must be on or after the date of the condition's value.\nSupported by data validation.\nRequires a single ConditionValue\nthat may be a relative date.", + "The cell's value must be between the dates of the two condition values.\nSupported by data validation.\nRequires exactly two ConditionValues.", + "The cell's value must be outside the dates of the two condition values.\nSupported by data validation.\nRequires exactly two ConditionValues.", + "The cell's value must be a date.\nSupported by data validation.\nRequires no ConditionValues.", + "The cell's value must be listed in the grid in condition value's range.\nSupported by data validation.\nRequires a single ConditionValue,\nand the value must be a valid range in A1 notation.", + "The cell's value must be in the list of condition values.\nSupported by data validation.\nSupports any number of condition values,\none per item in the list.\nFormulas are not supported in the values.", + "The cell's value must be empty.\nSupported by conditional formatting and filters.\nRequires no ConditionValues.", + "The cell's value must not be empty.\nSupported by conditional formatting and filters.\nRequires no ConditionValues.", + "The condition's formula must evaluate to true.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be TRUE/FALSE or in the list of condition values.\nSupported by data validation.\nRenders as a cell checkbox.\nSupports zero, one or two ConditionValues. No\nvalues indicates the cell must be TRUE or FALSE, where TRUE renders as\nchecked and FALSE renders as unchecked. One value indicates the cell\nwill render as checked when it contains that value and unchecked when it\nis blank. Two values indicate that the cell will render as checked when\nit contains the first value and unchecked when it contains the second\nvalue. For example, [\"Yes\",\"No\"] indicates that the cell will render a\nchecked box when it has the value \"Yes\" and an unchecked box when it has\nthe value \"No\"." + ], + "enum": [ + "CONDITION_TYPE_UNSPECIFIED", + "NUMBER_GREATER", + "NUMBER_GREATER_THAN_EQ", + "NUMBER_LESS", + "NUMBER_LESS_THAN_EQ", + "NUMBER_EQ", + "NUMBER_NOT_EQ", + "NUMBER_BETWEEN", + "NUMBER_NOT_BETWEEN", + "TEXT_CONTAINS", + "TEXT_NOT_CONTAINS", + "TEXT_STARTS_WITH", + "TEXT_ENDS_WITH", + "TEXT_EQ", + "TEXT_IS_EMAIL", + "TEXT_IS_URL", + "DATE_EQ", + "DATE_BEFORE", + "DATE_AFTER", + "DATE_ON_OR_BEFORE", + "DATE_ON_OR_AFTER", + "DATE_BETWEEN", + "DATE_NOT_BETWEEN", + "DATE_IS_VALID", + "ONE_OF_RANGE", + "ONE_OF_LIST", + "BLANK", + "NOT_BLANK", + "CUSTOM_FORMULA", + "BOOLEAN" + ], + "description": "The type of condition.", + "type": "string" + }, + "values": { + "type": "array", + "items": { + "$ref": "ConditionValue" + }, + "description": "The values of the condition. The number of supported values depends\non the condition type. Some support zero values,\nothers one or two values,\nand ConditionType.ONE_OF_LIST supports an arbitrary number of values." + } + }, + "id": "BooleanCondition" + }, + "BasicChartSpec": { + "id": "BasicChartSpec", + "description": "The specification for a basic chart. See BasicChartType for the list\nof charts this supports.", + "type": "object", + "properties": { + "headerCount": { + "description": "The number of rows or columns in the data that are \"headers\".\nIf not set, Google Sheets will guess how many rows are headers based\non the data.\n\n(Note that BasicChartAxis.title may override the axis title\n inferred from the header values.)", + "format": "int32", + "type": "integer" + }, + "stackedType": { + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "Series are not stacked.", + "Series values are stacked, each value is rendered vertically beginning\nfrom the top of the value below it.", + "Vertical stacks are stretched to reach the top of the chart, with\nvalues laid out as percentages of each other." + ], + "enum": [ + "BASIC_CHART_STACKED_TYPE_UNSPECIFIED", + "NOT_STACKED", + "STACKED", + "PERCENT_STACKED" + ], + "description": "The stacked type for charts that support vertical stacking.\nApplies to Area, Bar, Column, Combo, and Stepped Area charts." + }, + "threeDimensional": { + "type": "boolean", + "description": "True to make the chart 3D.\nApplies to Bar and Column charts." + }, + "axis": { + "type": "array", + "items": { + "$ref": "BasicChartAxis" + }, + "description": "The axis on the chart." + }, + "chartType": { + "description": "The type of the chart.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "A \u003ca href=\"/chart/interactive/docs/gallery/barchart\"\u003ebar chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/linechart\"\u003eline chart\u003c/a\u003e.", + "An \u003ca href=\"/chart/interactive/docs/gallery/areachart\"\u003earea chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/columnchart\"\u003ecolumn chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/scatterchart\"\u003escatter\nchart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/combochart\"\u003ecombo chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/steppedareachart\"\u003estepped area\nchart\u003c/a\u003e." + ], + "enum": [ + "BASIC_CHART_TYPE_UNSPECIFIED", + "BAR", + "LINE", + "AREA", + "COLUMN", + "SCATTER", + "COMBO", + "STEPPED_AREA" + ] + }, + "interpolateNulls": { + "type": "boolean", + "description": "If some values in a series are missing, gaps may appear in the chart (e.g,\nsegments of lines in a line chart will be missing). To eliminate these\ngaps set this to true.\nApplies to Line, Area, and Combo charts." + }, + "series": { + "type": "array", + "items": { + "$ref": "BasicChartSeries" + }, + "description": "The data this chart is visualizing." + }, + "legendPosition": { + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "The legend is rendered on the bottom of the chart.", + "The legend is rendered on the left of the chart.", + "The legend is rendered on the right of the chart.", + "The legend is rendered on the top of the chart.", + "No legend is rendered." + ], + "enum": [ + "BASIC_CHART_LEGEND_POSITION_UNSPECIFIED", + "BOTTOM_LEGEND", + "LEFT_LEGEND", + "RIGHT_LEGEND", + "TOP_LEGEND", + "NO_LEGEND" + ], + "description": "The position of the chart legend." + }, + "compareMode": { + "enum": [ + "BASIC_CHART_COMPARE_MODE_UNSPECIFIED", + "DATUM", + "CATEGORY" + ], + "description": "The behavior of tooltips and data highlighting when hovering on data and\nchart area.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "Only the focused data element is highlighted and shown in the tooltip.", + "All data elements with the same category (e.g., domain value) are\nhighlighted and shown in the tooltip." + ] + }, + "domains": { + "type": "array", + "items": { + "$ref": "BasicChartDomain" + }, + "description": "The domain of data this is charting.\nOnly a single domain is supported." + }, + "lineSmoothing": { + "description": "Gets whether all lines should be rendered smooth or straight by default.\nApplies to Line charts.", + "type": "boolean" + } + } + }, + "AddDimensionGroupRequest": { + "description": "Creates a group over the specified range.\n\nIf the requested range is a superset of the range of an existing group G,\nthen the depth of G is incremented and this new group G' has the\ndepth of that group. For example, a group [C:D, depth 1] + [B:E] results in\ngroups [B:E, depth 1] and [C:D, depth 2].\nIf the requested range is a subset of the range of an existing group G,\nthen the depth of the new group G' becomes one greater than the depth of G.\nFor example, a group [B:E, depth 1] + [C:D] results in groups [B:E, depth 1]\nand [C:D, depth 2].\nIf the requested range starts before and ends within, or starts within and\nends after, the range of an existing group G, then the range of the existing\ngroup G becomes the union of the ranges, and the new group G' has\ndepth one greater than the depth of G and range as the intersection of the\nranges. For example, a group [B:D, depth 1] + [C:E] results in groups [B:E,\ndepth 1] and [C:D, depth 2].", + "type": "object", + "properties": { + "range": { + "$ref": "DimensionRange", + "description": "The range over which to create a group." + } + }, + "id": "AddDimensionGroupRequest" + }, + "CellData": { + "description": "Data about a specific cell.", + "type": "object", + "properties": { + "hyperlink": { + "type": "string", + "description": "A hyperlink this cell points to, if any.\nThis field is read-only. (To set it, use a `=HYPERLINK` formula\nin the userEnteredValue.formulaValue\nfield.)" + }, + "pivotTable": { + "$ref": "PivotTable", + "description": "A pivot table anchored at this cell. The size of pivot table itself\nis computed dynamically based on its data, grouping, filters, values,\netc. Only the top-left cell of the pivot table contains the pivot table\ndefinition. The other cells will contain the calculated values of the\nresults of the pivot in their effective_value fields." + }, + "userEnteredFormat": { + "$ref": "CellFormat", + "description": "The format the user entered for the cell.\n\nWhen writing, the new format will be merged with the existing format." + }, + "note": { + "description": "Any note on the cell.", + "type": "string" + }, + "effectiveFormat": { + "description": "The effective format being used by the cell.\nThis includes the results of applying any conditional formatting and,\nif the cell contains a formula, the computed number format.\nIf the effective format is the default format, effective format will\nnot be written.\nThis field is read-only.", + "$ref": "CellFormat" + }, + "userEnteredValue": { + "description": "The value the user entered in the cell. e.g, `1234`, `'Hello'`, or `=NOW()`\nNote: Dates, Times and DateTimes are represented as doubles in\nserial number format.", + "$ref": "ExtendedValue" + }, + "dataValidation": { + "$ref": "DataValidationRule", + "description": "A data validation rule on the cell, if any.\n\nWhen writing, the new data validation rule will overwrite any prior rule." + }, + "effectiveValue": { + "description": "The effective value of the cell. For cells with formulas, this is\nthe calculated value. For cells with literals, this is\nthe same as the user_entered_value.\nThis field is read-only.", + "$ref": "ExtendedValue" + }, + "formattedValue": { + "description": "The formatted value of the cell.\nThis is the value as it's shown to the user.\nThis field is read-only.", + "type": "string" + }, + "textFormatRuns": { + "description": "Runs of rich text applied to subsections of the cell. Runs are only valid\non user entered strings, not formulas, bools, or numbers.\nRuns start at specific indexes in the text and continue until the next\nrun. Properties of a run will continue unless explicitly changed\nin a subsequent run (and properties of the first run will continue\nthe properties of the cell unless explicitly changed).\n\nWhen writing, the new runs will overwrite any prior runs. When writing a\nnew user_entered_value, previous runs are erased.", + "type": "array", + "items": { + "$ref": "TextFormatRun" + } + } + }, + "id": "CellData" + }, + "BatchUpdateValuesByDataFilterRequest": { + "description": "The request for updating more than one range of values in a spreadsheet.", + "type": "object", + "properties": { + "includeValuesInResponse": { + "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values. The `updatedData` field within\neach of the BatchUpdateValuesResponse.responses will contain\nthe updated values. If the range to write was larger than than the range\nactually written, the response will include all values in the requested\nrange (excluding trailing empty rows and columns).", + "type": "boolean" + }, + "valueInputOption": { + "description": "How the input data should be interpreted.", + "type": "string", + "enumDescriptions": [ + "Default input value. This value must not be used.", + "The values the user has entered will not be parsed and will be stored\nas-is.", + "The values will be parsed as if the user typed them into the UI.\nNumbers will stay as numbers, but strings may be converted to numbers,\ndates, etc. following the same rules that are applied when entering\ntext into a cell via the Google Sheets UI." + ], + "enum": [ + "INPUT_VALUE_OPTION_UNSPECIFIED", + "RAW", + "USER_ENTERED" + ] + }, + "data": { + "description": "The new values to apply to the spreadsheet. If more than one range is\nmatched by the specified DataFilter the specified values will be\napplied to all of those ranges.", + "type": "array", + "items": { + "$ref": "DataFilterValueRange" + } + }, + "responseDateTimeRenderOption": { + "type": "string", + "enumDescriptions": [ + "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", + "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." + ], + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ], + "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER." + }, + "responseValueRenderOption": { + "type": "string", + "enumDescriptions": [ + "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", + "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", + "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." + ], + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" + ], + "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE." + } + }, + "id": "BatchUpdateValuesByDataFilterRequest" + }, + "UpdateDimensionGroupRequest": { + "type": "object", + "properties": { + "dimensionGroup": { + "$ref": "DimensionGroup", + "description": "The group whose state should be updated. The range and depth of the group\nshould specify a valid group on the sheet, and all other fields updated." + }, + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `dimensionGroup` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" + } + }, + "id": "UpdateDimensionGroupRequest", + "description": "Updates the state of the specified group." + }, + "DeleteDeveloperMetadataResponse": { + "id": "DeleteDeveloperMetadataResponse", + "description": "The response from deleting developer metadata.", + "type": "object", + "properties": { + "deletedDeveloperMetadata": { + "description": "The metadata that was deleted.", + "type": "array", + "items": { + "$ref": "DeveloperMetadata" + } + } + } + }, + "SortRangeRequest": { + "type": "object", + "properties": { + "range": { + "$ref": "GridRange", + "description": "The range to sort." + }, + "sortSpecs": { + "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications.", + "type": "array", + "items": { + "$ref": "SortSpec" + } + } + }, + "id": "SortRangeRequest", + "description": "Sorts data in rows based on a sort order per column." + }, + "MatchedDeveloperMetadata": { + "type": "object", + "properties": { + "dataFilters": { + "description": "All filters matching the returned developer metadata.", + "type": "array", + "items": { + "$ref": "DataFilter" + } + }, + "developerMetadata": { + "$ref": "DeveloperMetadata", + "description": "The developer metadata matching the specified filters." + } + }, + "id": "MatchedDeveloperMetadata", + "description": "A developer metadata entry and the data filters specified in the original\nrequest that matched it." + }, + "MergeCellsRequest": { + "description": "Merges all cells in the range.", + "type": "object", + "properties": { + "range": { + "description": "The range of cells to merge.", + "$ref": "GridRange" + }, + "mergeType": { + "description": "How the cells should be merged.", + "type": "string", + "enumDescriptions": [ + "Create a single merge from the range", + "Create a merge for each column in the range", + "Create a merge for each row in the range" + ], + "enum": [ + "MERGE_ALL", + "MERGE_COLUMNS", + "MERGE_ROWS" + ] + } + }, + "id": "MergeCellsRequest" + }, + "AddProtectedRangeRequest": { + "id": "AddProtectedRangeRequest", + "description": "Adds a new protected range.", + "type": "object", + "properties": { + "protectedRange": { + "description": "The protected range to be added. The\nprotectedRangeId field is optional; if\none is not set, an id will be randomly generated. (It is an error to\nspecify the ID of a range that already exists.)", + "$ref": "ProtectedRange" + } + } + }, + "DuplicateFilterViewResponse": { + "description": "The result of a filter view being duplicated.", + "type": "object", + "properties": { + "filter": { + "$ref": "FilterView", + "description": "The newly created filter." + } + }, + "id": "DuplicateFilterViewResponse" + }, + "DuplicateSheetResponse": { + "type": "object", + "properties": { + "properties": { + "$ref": "SheetProperties", + "description": "The properties of the duplicate sheet." + } + }, + "id": "DuplicateSheetResponse", + "description": "The result of duplicating a sheet." + }, + "BatchUpdateSpreadsheetResponse": { + "type": "object", + "properties": { + "replies": { + "description": "The reply of the updates. This maps 1:1 with the updates, although\nreplies to some requests may be empty.", + "type": "array", + "items": { + "$ref": "Response" + } + }, + "updatedSpreadsheet": { + "description": "The spreadsheet after updates were applied. This is only set if\n[BatchUpdateSpreadsheetRequest.include_spreadsheet_in_response] is `true`.", + "$ref": "Spreadsheet" + }, + "spreadsheetId": { + "type": "string", + "description": "The spreadsheet the updates were applied to." + } + }, + "id": "BatchUpdateSpreadsheetResponse", + "description": "The reply for batch updating a spreadsheet." + }, + "AddFilterViewRequest": { + "id": "AddFilterViewRequest", + "description": "Adds a filter view.", + "type": "object", + "properties": { + "filter": { + "$ref": "FilterView", + "description": "The filter to add. The filterViewId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a filter that already exists.)" + } + } + }, + "DataFilterValueRange": { + "type": "object", + "properties": { + "majorDimension": { + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The major dimension of the values." + }, + "values": { + "description": "The data to be written. If the provided values exceed any of the ranges\nmatched by the data filter then the request will fail. If the provided\nvalues are less than the matched ranges only the specified values will be\nwritten, existing values in the matched ranges will remain unaffected.", + "type": "array", + "items": { + "type": "array", + "items": { + "type": "any" } } + }, + "dataFilter": { + "$ref": "DataFilter", + "description": "The data filter describing the location of the values in the spreadsheet." + } + }, + "id": "DataFilterValueRange", + "description": "A range of values whose location is specified by a DataFilter." + }, + "NumberFormat": { + "id": "NumberFormat", + "description": "The number format of a cell.", + "type": "object", + "properties": { + "pattern": { + "description": "Pattern string used for formatting. If not set, a default pattern based on\nthe user's locale will be used if necessary for the given type.\nSee the [Date and Number Formats guide](/sheets/api/guides/formats) for\nmore information about the supported patterns.", + "type": "string" + }, + "type": { + "description": "The type of the number format.\nWhen writing, this field must be set.", + "type": "string", + "enumDescriptions": [ + "The number format is not specified\nand is based on the contents of the cell.\nDo not explicitly use this.", + "Text formatting, e.g `1000.12`", + "Number formatting, e.g, `1,000.12`", + "Percent formatting, e.g `10.12%`", + "Currency formatting, e.g `$1,000.12`", + "Date formatting, e.g `9/26/2008`", + "Time formatting, e.g `3:59:00 PM`", + "Date+Time formatting, e.g `9/26/08 15:59:00`", + "Scientific number formatting, e.g `1.01E+03`" + ], + "enum": [ + "NUMBER_FORMAT_TYPE_UNSPECIFIED", + "TEXT", + "NUMBER", + "PERCENT", + "CURRENCY", + "DATE", + "TIME", + "DATE_TIME", + "SCIENTIFIC" + ] + } + } + }, + "OrgChartSpec": { + "type": "object", + "properties": { + "parentLabels": { + "$ref": "ChartData", + "description": "The data containing the label of the parent for the corresponding node.\nA blank value indicates that the node has no parent and is a top-level\nnode.\nThis field is optional." + }, + "labels": { + "$ref": "ChartData", + "description": "The data containing the labels for all the nodes in the chart. Labels\nmust be unique." + }, + "nodeSize": { + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "The small org chart node size.", + "The medium org chart node size.", + "The large org chart node size." + ], + "enum": [ + "ORG_CHART_LABEL_SIZE_UNSPECIFIED", + "SMALL", + "MEDIUM", + "LARGE" + ], + "description": "The size of the org chart nodes." + }, + "nodeColor": { + "description": "The color of the org chart nodes.", + "$ref": "Color" + }, + "tooltips": { + "$ref": "ChartData", + "description": "The data containing the tooltip for the corresponding node. A blank value\nresults in no tooltip being displayed for the node.\nThis field is optional." + }, + "selectedNodeColor": { + "$ref": "Color", + "description": "The color of the selected org chart nodes." + } + }, + "id": "OrgChartSpec", + "description": "An \u003ca href=\"/chart/interactive/docs/gallery/orgchart\"\u003eorg chart\u003c/a\u003e.\nOrg charts require a unique set of labels in labels and may\noptionally include parent_labels and tooltips.\nparent_labels contain, for each node, the label identifying the parent\nnode. tooltips contain, for each node, an optional tooltip.\n\nFor example, to describe an OrgChart with Alice as the CEO, Bob as the\nPresident (reporting to Alice) and Cathy as VP of Sales (also reporting to\nAlice), have labels contain \"Alice\", \"Bob\", \"Cathy\",\nparent_labels contain \"\", \"Alice\", \"Alice\" and tooltips contain\n\"CEO\", \"President\", \"VP Sales\"." + }, + "FilterView": { + "description": "A filter view.", + "type": "object", + "properties": { + "namedRangeId": { + "type": "string", + "description": "The named range this filter view is backed by, if any.\n\nWhen writing, only one of range or named_range_id\nmay be set." + }, + "filterViewId": { + "description": "The ID of the filter view.", + "format": "int32", + "type": "integer" + }, + "criteria": { + "additionalProperties": { + "$ref": "FilterCriteria" + }, + "description": "The criteria for showing/hiding values per column.\nThe map's key is the column index, and the value is the criteria for\nthat column.", + "type": "object" + }, + "title": { + "description": "The name of the filter view.", + "type": "string" + }, + "range": { + "$ref": "GridRange", + "description": "The range this filter view covers.\n\nWhen writing, only one of range or named_range_id\nmay be set." + }, + "sortSpecs": { + "type": "array", + "items": { + "$ref": "SortSpec" + }, + "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications." + } + }, + "id": "FilterView" + }, + "Slicer": { + "description": "A slicer in a sheet.", + "type": "object", + "properties": { + "position": { + "description": "The position of the slicer. Note that slicer can be positioned only on\nexisting sheet. Also, width and height of slicer can be automatically\nadjusted to keep it within permitted limits.", + "$ref": "EmbeddedObjectPosition" + }, + "spec": { + "description": "The specification of the slicer.", + "$ref": "SlicerSpec" + }, + "slicerId": { + "description": "The ID of the slicer.", + "format": "int32", + "type": "integer" + } + }, + "id": "Slicer" + }, + "SearchDeveloperMetadataRequest": { + "description": "A request to retrieve all developer metadata matching the set of specified\ncriteria.", + "type": "object", + "properties": { + "dataFilters": { + "type": "array", + "items": { + "$ref": "DataFilter" + }, + "description": "The data filters describing the criteria used to determine which\nDeveloperMetadata entries to return. DeveloperMetadata matching any of the\nspecified filters will be included in the response." + } + }, + "id": "SearchDeveloperMetadataRequest" + }, + "BandingProperties": { + "description": "Properties referring a single dimension (either row or column). If both\nBandedRange.row_properties and BandedRange.column_properties are\nset, the fill colors are applied to cells according to the following rules:\n\n* header_color and footer_color take priority over band colors.\n* first_band_color takes priority over second_band_color.\n* row_properties takes priority over column_properties.\n\nFor example, the first row color takes priority over the first column\ncolor, but the first column color takes priority over the second row color.\nSimilarly, the row header takes priority over the column header in the\ntop left cell, but the column header takes priority over the first row\ncolor if the row header is not set.", + "type": "object", + "properties": { + "headerColor": { + "$ref": "Color", + "description": "The color of the first row or column. If this field is set, the first\nrow or column will be filled with this color and the colors will\nalternate between first_band_color and second_band_color starting\nfrom the second row or column. Otherwise, the first row or column will be\nfilled with first_band_color and the colors will proceed to alternate\nas they normally would." + }, + "firstBandColor": { + "description": "The first color that is alternating. (Required)", + "$ref": "Color" + }, + "secondBandColor": { + "$ref": "Color", + "description": "The second color that is alternating. (Required)" + }, + "footerColor": { + "$ref": "Color", + "description": "The color of the last row or column. If this field is not set, the last\nrow or column will be filled with either first_band_color or\nsecond_band_color, depending on the color of the previous row or\ncolumn." + } + }, + "id": "BandingProperties" + }, + "BasicFilter": { + "id": "BasicFilter", + "description": "The default filter associated with a sheet.", + "type": "object", + "properties": { + "range": { + "$ref": "GridRange", + "description": "The range the filter covers." + }, + "criteria": { + "additionalProperties": { + "$ref": "FilterCriteria" + }, + "description": "The criteria for showing/hiding values per column.\nThe map's key is the column index, and the value is the criteria for\nthat column.", + "type": "object" + }, + "sortSpecs": { + "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications.", + "type": "array", + "items": { + "$ref": "SortSpec" + } + } + } + }, + "AddProtectedRangeResponse": { + "description": "The result of adding a new protected range.", + "type": "object", + "properties": { + "protectedRange": { + "$ref": "ProtectedRange", + "description": "The newly added protected range." + } + }, + "id": "AddProtectedRangeResponse" + }, + "PivotValue": { + "description": "The definition of how a value in a pivot table should be calculated.", + "type": "object", + "properties": { + "sourceColumnOffset": { + "description": "The column offset of the source range that this value reads from.\n\nFor example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`\nmeans this value refers to column `C`, whereas the offset `1` would\nrefer to column `D`.", + "format": "int32", + "type": "integer" + }, + "name": { + "description": "A name to use for the value.", + "type": "string" + }, + "formula": { + "description": "A custom formula to calculate the value. The formula must start\nwith an `=` character.", + "type": "string" + }, + "calculatedDisplayType": { + "enum": [ + "PIVOT_VALUE_CALCULATED_DISPLAY_TYPE_UNSPECIFIED", + "PERCENT_OF_ROW_TOTAL", + "PERCENT_OF_COLUMN_TOTAL", + "PERCENT_OF_GRAND_TOTAL" + ], + "description": "If specified, indicates that pivot values should be displayed as\nthe result of a calculation with another pivot value. For example, if\ncalculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the\npivot values are displayed as the percentage of the grand total. In\nthe Sheets UI, this is referred to as \"Show As\" in the value section of a\npivot table.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "Shows the pivot values as percentage of the row total values.", + "Shows the pivot values as percentage of the column total values.", + "Shows the pivot values as percentage of the grand total values." + ] + }, + "summarizeFunction": { + "enum": [ + "PIVOT_STANDARD_VALUE_FUNCTION_UNSPECIFIED", + "SUM", + "COUNTA", + "COUNT", + "COUNTUNIQUE", + "AVERAGE", + "MAX", + "MIN", + "MEDIAN", + "PRODUCT", + "STDEV", + "STDEVP", + "VAR", + "VARP", + "CUSTOM" + ], + "description": "A function to summarize the value.\nIf formula is set, the only supported values are\nSUM and\nCUSTOM.\nIf sourceColumnOffset is set, then `CUSTOM`\nis not supported.", + "type": "string", + "enumDescriptions": [ + "The default, do not use.", + "Corresponds to the `SUM` function.", + "Corresponds to the `COUNTA` function.", + "Corresponds to the `COUNT` function.", + "Corresponds to the `COUNTUNIQUE` function.", + "Corresponds to the `AVERAGE` function.", + "Corresponds to the `MAX` function.", + "Corresponds to the `MIN` function.", + "Corresponds to the `MEDIAN` function.", + "Corresponds to the `PRODUCT` function.", + "Corresponds to the `STDEV` function.", + "Corresponds to the `STDEVP` function.", + "Corresponds to the `VAR` function.", + "Corresponds to the `VARP` function.", + "Indicates the formula should be used as-is.\nOnly valid if PivotValue.formula was set." + ] + } + }, + "id": "PivotValue" + }, + "ErrorValue": { + "type": "object", + "properties": { + "type": { + "enumDescriptions": [ + "The default error type, do not use this.", + "Corresponds to the `#ERROR!` error.", + "Corresponds to the `#NULL!` error.", + "Corresponds to the `#DIV/0` error.", + "Corresponds to the `#VALUE!` error.", + "Corresponds to the `#REF!` error.", + "Corresponds to the `#NAME?` error.", + "Corresponds to the `#NUM`! error.", + "Corresponds to the `#N/A` error.", + "Corresponds to the `Loading...` state." + ], + "enum": [ + "ERROR_TYPE_UNSPECIFIED", + "ERROR", + "NULL_VALUE", + "DIVIDE_BY_ZERO", + "VALUE", + "REF", + "NAME", + "NUM", + "N_A", + "LOADING" + ], + "description": "The type of error.", + "type": "string" + }, + "message": { + "description": "A message with more information about the error\n(in the spreadsheet's locale).", + "type": "string" + } + }, + "id": "ErrorValue", + "description": "An error in a cell." + }, + "CopySheetToAnotherSpreadsheetRequest": { + "id": "CopySheetToAnotherSpreadsheetRequest", + "description": "The request to copy a sheet across spreadsheets.", + "type": "object", + "properties": { + "destinationSpreadsheetId": { + "description": "The ID of the spreadsheet to copy the sheet to.", + "type": "string" + } + } + }, + "CandlestickChartSpec": { + "id": "CandlestickChartSpec", + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/candlestickchart\"\u003ecandlestick\nchart\u003c/a\u003e.", + "type": "object", + "properties": { + "domain": { + "$ref": "CandlestickDomain", + "description": "The domain data (horizontal axis) for the candlestick chart. String data\nwill be treated as discrete labels, other data will be treated as\ncontinuous values." + }, + "data": { + "description": "The Candlestick chart data.\nOnly one CandlestickData is supported.", + "type": "array", + "items": { + "$ref": "CandlestickData" + } + } + } + }, + "BatchClearValuesByDataFilterResponse": { + "id": "BatchClearValuesByDataFilterResponse", + "description": "The response when clearing a range of values selected with\nDataFilters in a spreadsheet.", + "type": "object", + "properties": { + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", + "type": "string" + }, + "clearedRanges": { + "description": "The ranges that were cleared, in A1 notation.\n(If the requests were for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual ranges\n that were cleared, bounded to the sheet's limits.)", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "TreemapChartColorScale": { + "description": "A color scale for a treemap chart.", + "type": "object", + "properties": { + "minValueColor": { + "$ref": "Color", + "description": "The background color for cells with a color value less than or equal to\nminValue. Defaults to #dc3912 if not\nspecified." + }, + "noDataColor": { + "$ref": "Color", + "description": "The background color for cells that have no color data associated with\nthem. Defaults to #000000 if not specified." + }, + "midValueColor": { + "description": "The background color for cells with a color value at the midpoint between\nminValue and\nmaxValue. Defaults to #efe6dc if not\nspecified.", + "$ref": "Color" + }, + "maxValueColor": { + "$ref": "Color", + "description": "The background color for cells with a color value greater than or equal\nto maxValue. Defaults to #109618 if not\nspecified." + } + }, + "id": "TreemapChartColorScale" + }, + "EmbeddedObjectPosition": { + "type": "object", + "properties": { + "newSheet": { + "type": "boolean", + "description": "If true, the embedded object is put on a new sheet whose ID\nis chosen for you. Used only when writing." + }, + "sheetId": { + "description": "The sheet this is on. Set only if the embedded object\nis on its own sheet. Must be non-negative.", + "format": "int32", + "type": "integer" + }, + "overlayPosition": { + "$ref": "OverlayPosition", + "description": "The position at which the object is overlaid on top of a grid." + } + }, + "id": "EmbeddedObjectPosition", + "description": "The position of an embedded object such as a chart." + }, + "DeveloperMetadataLookup": { + "id": "DeveloperMetadataLookup", + "description": "Selects DeveloperMetadata that matches all of the specified fields. For\nexample, if only a metadata ID is specified this considers the\nDeveloperMetadata with that particular unique ID. If a metadata key is\nspecified, this considers all developer metadata with that key. If a\nkey, visibility, and location type are all specified, this considers all\ndeveloper metadata with that key and visibility that are associated with a\nlocation of that type. In general, this\nselects all DeveloperMetadata that matches the intersection of all the\nspecified fields; any field or combination of fields may be specified.", + "type": "object", + "properties": { + "metadataLocation": { + "description": "Limits the selected developer metadata to those entries associated with\nthe specified location. This field either matches exact locations or all\nintersecting locations according the specified\nlocationMatchingStrategy.", + "$ref": "DeveloperMetadataLocation" + }, + "locationMatchingStrategy": { + "enum": [ + "DEVELOPER_METADATA_LOCATION_MATCHING_STRATEGY_UNSPECIFIED", + "EXACT_LOCATION", + "INTERSECTING_LOCATION" + ], + "description": "Determines how this lookup matches the location. If this field is\nspecified as EXACT, only developer metadata associated on the exact\nlocation specified is matched. If this field is specified to INTERSECTING,\ndeveloper metadata associated on intersecting locations is also\nmatched. If left unspecified, this field assumes a default value of\nINTERSECTING.\nIf this field is specified, a metadataLocation\nmust also be specified.", + "type": "string", + "enumDescriptions": [ + "Default value. This value must not be used.", + "Indicates that a specified location should be matched exactly. For\nexample, if row three were specified as a location this matching strategy\nwould only match developer metadata also associated on row three. Metadata\nassociated on other locations would not be considered.", + "Indicates that a specified location should match that exact location as\nwell as any intersecting locations. For example, if row three were\nspecified as a location this matching strategy would match developer\nmetadata associated on row three as well as metadata associated on\nlocations that intersect row three. If, for instance, there was developer\nmetadata associated on column B, this matching strategy would also match\nthat location because column B intersects row three." + ] + }, + "locationType": { + "description": "Limits the selected developer metadata to those entries which are\nassociated with locations of the specified type. For example, when this\nfield is specified as ROW this lookup\nonly considers developer metadata associated on rows. If the field is left\nunspecified, all location types are considered. This field cannot be\nspecified as SPREADSHEET when\nthe locationMatchingStrategy\nis specified as INTERSECTING or when the\nmetadataLocation is specified as a\nnon-spreadsheet location: spreadsheet metadata cannot intersect any other\ndeveloper metadata location. This field also must be left unspecified when\nthe locationMatchingStrategy\nis specified as EXACT.", + "type": "string", + "enumDescriptions": [ + "Default value.", + "Developer metadata associated on an entire row dimension.", + "Developer metadata associated on an entire column dimension.", + "Developer metadata associated on an entire sheet.", + "Developer metadata associated on the entire spreadsheet." + ], + "enum": [ + "DEVELOPER_METADATA_LOCATION_TYPE_UNSPECIFIED", + "ROW", + "COLUMN", + "SHEET", + "SPREADSHEET" + ] + }, + "metadataKey": { + "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_key.", + "type": "string" + }, + "visibility": { + "type": "string", + "enumDescriptions": [ + "Default value.", + "Document-visible metadata is accessible from any developer project with\naccess to the document.", + "Project-visible metadata is only visible to and accessible by the developer\nproject that created the metadata." + ], + "enum": [ + "DEVELOPER_METADATA_VISIBILITY_UNSPECIFIED", + "DOCUMENT", + "PROJECT" + ], + "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.visibility. If left unspecified, all developer\nmetadata visibile to the requesting project is considered." + }, + "metadataId": { + "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_id.", + "format": "int32", + "type": "integer" + }, + "metadataValue": { + "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_value.", + "type": "string" + } + } + }, + "AutoFillRequest": { + "description": "Fills in more data based on existing data.", + "type": "object", + "properties": { + "range": { + "$ref": "GridRange", + "description": "The range to autofill. This will examine the range and detect\nthe location that has data and automatically fill that data\nin to the rest of the range." + }, + "useAlternateSeries": { + "description": "True if we should generate data with the \"alternate\" series.\nThis differs based on the type and amount of source data.", + "type": "boolean" + }, + "sourceAndDestination": { + "$ref": "SourceAndDestination", + "description": "The source and destination areas to autofill.\nThis explicitly lists the source of the autofill and where to\nextend that data." + } + }, + "id": "AutoFillRequest" + }, + "GradientRule": { + "type": "object", + "properties": { + "midpoint": { + "$ref": "InterpolationPoint", + "description": "An optional midway interpolation point." + }, + "minpoint": { + "$ref": "InterpolationPoint", + "description": "The starting interpolation point." + }, + "maxpoint": { + "$ref": "InterpolationPoint", + "description": "The final interpolation point." + } + }, + "id": "GradientRule", + "description": "A rule that applies a gradient color scale format, based on\nthe interpolation points listed. The format of a cell will vary\nbased on its contents as compared to the values of the interpolation\npoints." + }, + "ClearValuesRequest": { + "description": "The request for clearing a range of values in a spreadsheet.", + "type": "object", + "properties": {}, + "id": "ClearValuesRequest" + }, + "SetBasicFilterRequest": { + "id": "SetBasicFilterRequest", + "description": "Sets the basic filter associated with a sheet.", + "type": "object", + "properties": { + "filter": { + "description": "The filter to set.", + "$ref": "BasicFilter" + } + } + }, + "BatchClearValuesByDataFilterRequest": { + "id": "BatchClearValuesByDataFilterRequest", + "description": "The request for clearing more than one range selected by a\nDataFilter in a spreadsheet.", + "type": "object", + "properties": { + "dataFilters": { + "type": "array", + "items": { + "$ref": "DataFilter" + }, + "description": "The DataFilters used to determine which ranges to clear." + } + } + }, + "GetSpreadsheetByDataFilterRequest": { + "id": "GetSpreadsheetByDataFilterRequest", + "description": "The request for retrieving a Spreadsheet.", + "type": "object", + "properties": { + "includeGridData": { + "description": "True if grid data should be returned.\nThis parameter is ignored if a field mask was set in the request.", + "type": "boolean" + }, + "dataFilters": { + "description": "The DataFilters used to select which ranges to retrieve from\nthe spreadsheet.", + "type": "array", + "items": { + "$ref": "DataFilter" + } + } + } + }, + "DeleteEmbeddedObjectRequest": { + "description": "Deletes the embedded object with the given ID.", + "type": "object", + "properties": { + "objectId": { + "description": "The ID of the embedded object to delete.", + "format": "int32", + "type": "integer" + } + }, + "id": "DeleteEmbeddedObjectRequest" + }, + "UpdateValuesByDataFilterResponse": { + "description": "The response when updating a range of values by a data filter in a\nspreadsheet.", + "type": "object", + "properties": { + "updatedCells": { + "description": "The number of cells updated.", + "format": "int32", + "type": "integer" + }, + "dataFilter": { + "description": "The data filter that selected the range that was updated.", + "$ref": "DataFilter" + }, + "updatedData": { + "description": "The values of the cells in the range matched by the dataFilter after all\nupdates were applied. This is only included if the request's\n`includeValuesInResponse` field was `true`.", + "$ref": "ValueRange" + }, + "updatedRows": { + "description": "The number of rows where at least one cell in the row was updated.", + "format": "int32", + "type": "integer" + }, + "updatedColumns": { + "description": "The number of columns where at least one cell in the column was updated.", + "format": "int32", + "type": "integer" + }, + "updatedRange": { + "description": "The range (in A1 notation) that updates were applied to.", + "type": "string" + } + }, + "id": "UpdateValuesByDataFilterResponse" + }, + "DeleteSheetRequest": { + "type": "object", + "properties": { + "sheetId": { + "type": "integer", + "description": "The ID of the sheet to delete.", + "format": "int32" + } + }, + "id": "DeleteSheetRequest", + "description": "Deletes the requested sheet." + }, + "DeveloperMetadataLocation": { + "type": "object", + "properties": { + "spreadsheet": { + "type": "boolean", + "description": "True when metadata is associated with an entire spreadsheet." + }, + "sheetId": { + "description": "The ID of the sheet when metadata is associated with an entire sheet.", + "format": "int32", + "type": "integer" + }, + "locationType": { + "type": "string", + "enumDescriptions": [ + "Default value.", + "Developer metadata associated on an entire row dimension.", + "Developer metadata associated on an entire column dimension.", + "Developer metadata associated on an entire sheet.", + "Developer metadata associated on the entire spreadsheet." + ], + "enum": [ + "DEVELOPER_METADATA_LOCATION_TYPE_UNSPECIFIED", + "ROW", + "COLUMN", + "SHEET", + "SPREADSHEET" + ], + "description": "The type of location this object represents. This field is read-only." + }, + "dimensionRange": { + "description": "Represents the row or column when metadata is associated with\na dimension. The specified DimensionRange must represent a single row\nor column; it cannot be unbounded or span multiple rows or columns.", + "$ref": "DimensionRange" + } + }, + "id": "DeveloperMetadataLocation", + "description": "A location where metadata may be associated in a spreadsheet." + }, + "MatchedValueRange": { + "description": "A value range that was matched by one or more data filers.", + "type": "object", + "properties": { + "dataFilters": { + "description": "The DataFilters from the request that matched the range of\nvalues.", + "type": "array", + "items": { + "$ref": "DataFilter" + } + }, + "valueRange": { + "description": "The values matched by the DataFilter.", + "$ref": "ValueRange" + } + }, + "id": "MatchedValueRange" + }, + "DuplicateSheetRequest": { + "type": "object", + "properties": { + "newSheetName": { + "description": "The name of the new sheet. If empty, a new name is chosen for you.", + "type": "string" + }, + "sourceSheetId": { + "description": "The sheet to duplicate.", + "format": "int32", + "type": "integer" + }, + "newSheetId": { + "description": "If set, the ID of the new sheet. If not set, an ID is chosen.\nIf set, the ID must not conflict with any existing sheet ID.\nIf set, it must be non-negative.", + "format": "int32", + "type": "integer" + }, + "insertSheetIndex": { + "type": "integer", + "description": "The zero-based index where the new sheet should be inserted.\nThe index of all sheets after this are incremented.", + "format": "int32" + } + }, + "id": "DuplicateSheetRequest", + "description": "Duplicates the contents of a sheet." + }, + "TreemapChartSpec": { + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/treemap\"\u003eTreemap chart\u003c/a\u003e.", + "type": "object", + "properties": { + "headerColor": { + "$ref": "Color", + "description": "The background color for header cells." + }, + "parentLabels": { + "description": "The data the contains the treemap cells' parent labels.", + "$ref": "ChartData" + }, + "labels": { + "$ref": "ChartData", + "description": "The data that contains the treemap cell labels." + }, + "colorData": { + "$ref": "ChartData", + "description": "The data that determines the background color of each treemap data cell.\nThis field is optional. If not specified, size_data is used to\ndetermine background colors. If specified, the data is expected to be\nnumeric. color_scale will determine how the values in this data map to\ndata cell background colors." + }, + "maxValue": { + "type": "number", + "description": "The maximum possible data value. Cells with values greater than this will\nhave the same color as cells with this value. If not specified, defaults\nto the actual maximum value from color_data, or the maximum value from\nsize_data if color_data is not specified.", + "format": "double" + }, + "colorScale": { + "$ref": "TreemapChartColorScale", + "description": "The color scale for data cells in the treemap chart. Data cells are\nassigned colors based on their color values. These color values come from\ncolor_data, or from size_data if color_data is not specified.\nCells with color values less than or equal to min_value will\nhave minValueColor as their\nbackground color. Cells with color values greater than or equal to\nmax_value will have\nmaxValueColor as their background\ncolor. Cells with color values between min_value and max_value will\nhave background colors on a gradient between\nminValueColor and\nmaxValueColor, the midpoint of\nthe gradient being midValueColor.\nCells with missing or non-numeric color values will have\nnoDataColor as their background\ncolor." + }, + "hideTooltips": { + "description": "True to hide tooltips.", + "type": "boolean" + }, + "hintedLevels": { + "description": "The number of additional data levels beyond the labeled levels to be shown\non the treemap chart. These levels are not interactive and are shown\nwithout their labels. Defaults to 0 if not specified.", + "format": "int32", + "type": "integer" + }, + "levels": { + "description": "The number of data levels to show on the treemap chart. These levels are\ninteractive and are shown with their labels. Defaults to 2 if not\nspecified.", + "format": "int32", + "type": "integer" + }, + "minValue": { + "type": "number", + "description": "The minimum possible data value. Cells with values less than this will\nhave the same color as cells with this value. If not specified, defaults\nto the actual minimum value from color_data, or the minimum value from\nsize_data if color_data is not specified.", + "format": "double" + }, + "sizeData": { + "$ref": "ChartData", + "description": "The data that determines the size of each treemap data cell. This data is\nexpected to be numeric. The cells corresponding to non-numeric or missing\ndata will not be rendered. If color_data is not specified, this data\nis used to determine data cell background colors as well." + }, + "textFormat": { + "$ref": "TextFormat", + "description": "The text format for all labels on the chart." + } + }, + "id": "TreemapChartSpec" + }, + "ExtendedValue": { + "type": "object", + "properties": { + "errorValue": { + "description": "Represents an error.\nThis field is read-only.", + "$ref": "ErrorValue" + }, + "stringValue": { + "description": "Represents a string value.\nLeading single quotes are not included. For example, if the user typed\n`'123` into the UI, this would be represented as a `stringValue` of\n`\"123\"`.", + "type": "string" + }, + "boolValue": { + "description": "Represents a boolean value.", + "type": "boolean" + }, + "formulaValue": { + "type": "string", + "description": "Represents a formula." + }, + "numberValue": { + "type": "number", + "description": "Represents a double value.\nNote: Dates, Times and DateTimes are represented as doubles in\n\"serial number\" format.", + "format": "double" + } + }, + "id": "ExtendedValue", + "description": "The kinds of value that a cell in a spreadsheet can have." + }, + "BatchClearValuesResponse": { + "description": "The response when clearing a range of values in a spreadsheet.", + "type": "object", + "properties": { + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", + "type": "string" + }, + "clearedRanges": { + "description": "The ranges that were cleared, in A1 notation.\n(If the requests were for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual ranges\n that were cleared, bounded to the sheet's limits.)", + "type": "array", + "items": { + "type": "string" + } + } + }, + "id": "BatchClearValuesResponse" + }, + "DataFilter": { + "id": "DataFilter", + "description": "Filter that describes what data should be selected or returned from a\nrequest.", + "type": "object", + "properties": { + "gridRange": { + "$ref": "GridRange", + "description": "Selects data that matches the range described by the GridRange." + }, + "developerMetadataLookup": { + "description": "Selects data associated with the developer metadata matching the criteria\ndescribed by this DeveloperMetadataLookup.", + "$ref": "DeveloperMetadataLookup" + }, + "a1Range": { + "description": "Selects data that matches the specified A1 range.", + "type": "string" + } + } + }, + "TextFormat": { + "description": "The format of a run of text in a cell.\nAbsent values indicate that the field isn't specified.", + "type": "object", + "properties": { + "strikethrough": { + "description": "True if the text has a strikethrough.", + "type": "boolean" + }, + "italic": { + "description": "True if the text is italicized.", + "type": "boolean" + }, + "fontSize": { + "type": "integer", + "description": "The size of the font.", + "format": "int32" + }, + "underline": { + "type": "boolean", + "description": "True if the text is underlined." + }, + "bold": { + "description": "True if the text is bold.", + "type": "boolean" + }, + "foregroundColor": { + "description": "The foreground color of the text.", + "$ref": "Color" + }, + "fontFamily": { + "description": "The font family.", + "type": "string" + } + }, + "id": "TextFormat" + }, + "DeleteDuplicatesRequest": { + "id": "DeleteDuplicatesRequest", + "description": "Removes rows within this range that contain values in the specified columns\nthat are duplicates of values in any previous row. Rows with identical values\nbut different letter cases, formatting, or formulas are considered to be\nduplicates.\n\nThis request also removes duplicate rows hidden from view (for example, due\nto a filter). When removing duplicates, the first instance of each duplicate\nrow scanning from the top downwards is kept in the resulting range. Content\noutside of the specified range isn't removed, and rows considered duplicates\ndo not have to be adjacent to each other in the range.", + "type": "object", + "properties": { + "range": { + "$ref": "GridRange", + "description": "The range to remove duplicates rows from." + }, + "comparisonColumns": { + "description": "The columns in the range to analyze for duplicate values. If no columns are\nselected then all columns are analyzed for duplicates.", + "type": "array", + "items": { + "$ref": "DimensionRange" + } + } + } + }, + "RepeatCellRequest": { + "description": "Updates all cells in the range to the values in the given Cell object.\nOnly the fields listed in the fields field are updated; others are\nunchanged.\n\nIf writing a cell with a formula, the formula's ranges will automatically\nincrement for each field in the range.\nFor example, if writing a cell with formula `=A1` into range B2:C4,\nB2 would be `=A1`, B3 would be `=A2`, B4 would be `=A3`,\nC2 would be `=B1`, C3 would be `=B2`, C4 would be `=B3`.\n\nTo keep the formula's ranges static, use the `$` indicator.\nFor example, use the formula `=$A$1` to prevent both the row and the\ncolumn from incrementing.", + "type": "object", + "properties": { + "range": { + "$ref": "GridRange", + "description": "The range to repeat the cell in." + }, + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `cell` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" + }, + "cell": { + "$ref": "CellData", + "description": "The data to write." + } + }, + "id": "RepeatCellRequest" + }, + "UpdateSpreadsheetPropertiesRequest": { + "description": "Updates properties of a spreadsheet.", + "type": "object", + "properties": { + "properties": { + "$ref": "SpreadsheetProperties", + "description": "The properties to update." + }, + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root 'properties' is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" + } + }, + "id": "UpdateSpreadsheetPropertiesRequest" + }, + "ProtectedRange": { + "type": "object", + "properties": { + "protectedRangeId": { + "description": "The ID of the protected range.\nThis field is read-only.", + "format": "int32", + "type": "integer" + }, + "warningOnly": { + "description": "True if this protected range will show a warning when editing.\nWarning-based protection means that every user can edit data in the\nprotected range, except editing will prompt a warning asking the user\nto confirm the edit.\n\nWhen writing: if this field is true, then editors is ignored.\nAdditionally, if this field is changed from true to false and the\n`editors` field is not set (nor included in the field mask), then\nthe editors will be set to all the editors in the document.", + "type": "boolean" + }, + "requestingUserCanEdit": { + "description": "True if the user who requested this protected range can edit the\nprotected area.\nThis field is read-only.", + "type": "boolean" + }, + "editors": { + "$ref": "Editors", + "description": "The users and groups with edit access to the protected range.\nThis field is only visible to users with edit access to the protected\nrange and the document.\nEditors are not supported with warning_only protection." + }, + "range": { + "$ref": "GridRange", + "description": "The range that is being protected.\nThe range may be fully unbounded, in which case this is considered\na protected sheet.\n\nWhen writing, only one of range or named_range_id\nmay be set." + }, + "description": { + "description": "The description of this protected range.", + "type": "string" + }, + "unprotectedRanges": { + "description": "The list of unprotected ranges within a protected sheet.\nUnprotected ranges are only supported on protected sheets.", + "type": "array", + "items": { + "$ref": "GridRange" + } + }, + "namedRangeId": { + "description": "The named range this protected range is backed by, if any.\n\nWhen writing, only one of range or named_range_id\nmay be set.", + "type": "string" + } + }, + "id": "ProtectedRange", + "description": "A protected range." + }, + "DimensionProperties": { + "type": "object", + "properties": { + "developerMetadata": { + "description": "The developer metadata associated with a single row or column.", + "type": "array", + "items": { + "$ref": "DeveloperMetadata" + } + }, + "pixelSize": { + "type": "integer", + "description": "The height (if a row) or width (if a column) of the dimension in pixels.", + "format": "int32" + }, + "hiddenByFilter": { + "type": "boolean", + "description": "True if this dimension is being filtered.\nThis field is read-only." + }, + "hiddenByUser": { + "description": "True if this dimension is explicitly hidden.", + "type": "boolean" + } + }, + "id": "DimensionProperties", + "description": "Properties about a dimension." + }, + "DimensionRange": { + "description": "A range along a single dimension on a sheet.\nAll indexes are zero-based.\nIndexes are half open: the start index is inclusive\nand the end index is exclusive.\nMissing indexes indicate the range is unbounded on that side.", + "type": "object", + "properties": { + "dimension": { + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The dimension of the span.", + "type": "string" + }, + "startIndex": { + "description": "The start (inclusive) of the span, or not set if unbounded.", + "format": "int32", + "type": "integer" + }, + "endIndex": { + "description": "The end (exclusive) of the span, or not set if unbounded.", + "format": "int32", + "type": "integer" + }, + "sheetId": { + "description": "The sheet this span is on.", + "format": "int32", + "type": "integer" + } + }, + "id": "DimensionRange" + }, + "NamedRange": { + "id": "NamedRange", + "description": "A named range.", + "type": "object", + "properties": { + "name": { + "description": "The name of the named range.", + "type": "string" + }, + "namedRangeId": { + "description": "The ID of the named range.", + "type": "string" + }, + "range": { + "description": "The range this represents.", + "$ref": "GridRange" + } + } + }, + "ChartCustomNumberFormatOptions": { + "type": "object", + "properties": { + "prefix": { + "type": "string", + "description": "Custom prefix to be prepended to the chart attribute.\nThis field is optional." + }, + "suffix": { + "description": "Custom suffix to be appended to the chart attribute.\nThis field is optional.", + "type": "string" + } + }, + "id": "ChartCustomNumberFormatOptions", + "description": "Custom number formatting options for chart attributes." + }, + "Borders": { + "type": "object", + "properties": { + "bottom": { + "$ref": "Border", + "description": "The bottom border of the cell." + }, + "top": { + "$ref": "Border", + "description": "The top border of the cell." + }, + "left": { + "$ref": "Border", + "description": "The left border of the cell." + }, + "right": { + "description": "The right border of the cell.", + "$ref": "Border" + } + }, + "id": "Borders", + "description": "The borders of the cell." + }, + "ManualRule": { + "description": "Allows you to manually organize the values in a source data column into\nbuckets with names of your choosing. For example, a pivot table that\naggregates population by state:\n\n +-------+-------------------+\n | State | SUM of Population |\n +-------+-------------------+\n | AK | 0.7 |\n | AL | 4.8 |\n | AR | 2.9 |\n ...\n +-------+-------------------+\ncould be turned into a pivot table that aggregates population by time zone\nby providing a list of groups (for example, groupName = 'Central',\nitems = ['AL', 'AR', 'IA', ...]) to a manual group rule.\nNote that a similar effect could be achieved by adding a time zone column\nto the source data and adjusting the pivot table.\n\n +-----------+-------------------+\n | Time Zone | SUM of Population |\n +-----------+-------------------+\n | Central | 106.3 |\n | Eastern | 151.9 |\n | Mountain | 17.4 |\n ...\n +-----------+-------------------+", + "type": "object", + "properties": { + "groups": { + "type": "array", + "items": { + "$ref": "ManualRuleGroup" + }, + "description": "The list of group names and the corresponding items from the source data\nthat map to each group name." + } + }, + "id": "ManualRule" + }, + "DeleteConditionalFormatRuleRequest": { + "description": "Deletes a conditional format rule at the given index.\nAll subsequent rules' indexes are decremented.", + "type": "object", + "properties": { + "sheetId": { + "description": "The sheet the rule is being deleted from.", + "format": "int32", + "type": "integer" + }, + "index": { + "type": "integer", + "description": "The zero-based index of the rule to be deleted.", + "format": "int32" + } + }, + "id": "DeleteConditionalFormatRuleRequest" + }, + "AddBandingResponse": { + "id": "AddBandingResponse", + "description": "The result of adding a banded range.", + "type": "object", + "properties": { + "bandedRange": { + "description": "The banded range that was added.", + "$ref": "BandedRange" + } + } + }, + "DeleteNamedRangeRequest": { + "description": "Removes the named range with the given ID from the spreadsheet.", + "type": "object", + "properties": { + "namedRangeId": { + "description": "The ID of the named range to delete.", + "type": "string" + } + }, + "id": "DeleteNamedRangeRequest" + }, + "AddDimensionGroupResponse": { + "type": "object", + "properties": { + "dimensionGroups": { + "description": "All groups of a dimension after adding a group to that dimension.", + "type": "array", + "items": { + "$ref": "DimensionGroup" + } + } + }, + "id": "AddDimensionGroupResponse", + "description": "The result of adding a group." + }, + "PivotGroup": { + "id": "PivotGroup", + "description": "A single grouping (either row or column) in a pivot table.", + "type": "object", + "properties": { + "repeatHeadings": { + "type": "boolean", + "description": "True if the headings in this pivot group should be repeated.\nThis is only valid for row groupings and is ignored by columns.\n\nBy default, we minimize repitition of headings by not showing higher\nlevel headings where they are the same. For example, even though the\nthird row below corresponds to \"Q1 Mar\", \"Q1\" is not shown because\nit is redundant with previous rows. Setting repeat_headings to true\nwould cause \"Q1\" to be repeated for \"Feb\" and \"Mar\".\n\n +--------------+\n | Q1 | Jan |\n | | Feb |\n | | Mar |\n +--------+-----+\n | Q1 Total |\n +--------------+" + }, + "sourceColumnOffset": { + "type": "integer", + "description": "The column offset of the source range that this grouping is based on.\n\nFor example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`\nmeans this group refers to column `C`, whereas the offset `1` would refer\nto column `D`.", + "format": "int32" + }, + "sortOrder": { + "enum": [ + "SORT_ORDER_UNSPECIFIED", + "ASCENDING", + "DESCENDING" + ], + "description": "The order the values in this group should be sorted.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use this.", + "Sort ascending.", + "Sort descending." + ] + }, + "valueBucket": { + "$ref": "PivotGroupSortValueBucket", + "description": "The bucket of the opposite pivot group to sort by.\nIf not specified, sorting is alphabetical by this group's values." + }, + "showTotals": { + "description": "True if the pivot table should include the totals for this grouping.", + "type": "boolean" + }, + "valueMetadata": { + "description": "Metadata about values in the grouping.", + "type": "array", + "items": { + "$ref": "PivotGroupValueMetadata" + } + }, + "groupRule": { + "$ref": "PivotGroupRule", + "description": "The group rule to apply to this row/column group." + }, + "label": { + "description": "The labels to use for the row/column groups which can be customized. For\nexample, in the following pivot table, the row label is `Region` (which\ncould be renamed to `State`) and the column label is `Product` (which\ncould be renamed `Item`). Pivot tables created before December 2017 do\nnot have header labels. If you'd like to add header labels to an existing\npivot table, please delete the existing pivot table and then create a new\npivot table with same parameters.\n\n +--------------+---------+-------+\n | SUM of Units | Product | |\n | Region | Pen | Paper |\n +--------------+---------+-------+\n | New York | 345 | 98 |\n | Oregon | 234 | 123 |\n | Tennessee | 531 | 415 |\n +--------------+---------+-------+\n | Grand Total | 1110 | 636 |\n +--------------+---------+-------+", + "type": "string" + } + } + }, + "ManualRuleGroup": { + "description": "A group name and a list of items from the source data that should be placed\nin the group with this name.", + "type": "object", + "properties": { + "items": { + "description": "The items in the source data that should be placed into this group. Each\nitem may be a string, number, or boolean. Items may appear in at most one\ngroup within a given ManualRule. Items that do not appear in any\ngroup will appear on their own.", + "type": "array", + "items": { + "$ref": "ExtendedValue" + } + }, + "groupName": { + "$ref": "ExtendedValue", + "description": "The group name, which must be a string. Each group in a given\nManualRule must have a unique group name." + } + }, + "id": "ManualRuleGroup" + }, + "TrimWhitespaceResponse": { + "description": "The result of trimming whitespace in cells.", + "type": "object", + "properties": { + "cellsChangedCount": { + "description": "The number of cells that were trimmed of whitespace.", + "format": "int32", + "type": "integer" + } + }, + "id": "TrimWhitespaceResponse" + }, + "PivotTable": { + "description": "A pivot table.", + "type": "object", + "properties": { + "criteria": { + "additionalProperties": { + "$ref": "PivotFilterCriteria" + }, + "description": "An optional mapping of filters per source column offset.\n\nThe filters are applied before aggregating data into the pivot table.\nThe map's key is the column offset of the source range that you want to\nfilter, and the value is the criteria for that column.\n\nFor example, if the source was `C10:E15`, a key of `0` will have the filter\nfor column `C`, whereas the key `1` is for column `D`.", + "type": "object" + }, + "rows": { + "description": "Each row grouping in the pivot table.", + "type": "array", + "items": { + "$ref": "PivotGroup" + } + }, + "valueLayout": { + "enumDescriptions": [ + "Values are laid out horizontally (as columns).", + "Values are laid out vertically (as rows)." + ], + "enum": [ + "HORIZONTAL", + "VERTICAL" + ], + "description": "Whether values should be listed horizontally (as columns)\nor vertically (as rows).", + "type": "string" + }, + "source": { + "$ref": "GridRange", + "description": "The range the pivot table is reading data from." + }, + "columns": { + "description": "Each column grouping in the pivot table.", + "type": "array", + "items": { + "$ref": "PivotGroup" + } + }, + "values": { + "description": "A list of values to include in the pivot table.", + "type": "array", + "items": { + "$ref": "PivotValue" + } + } + }, + "id": "PivotTable" + }, + "SearchDeveloperMetadataResponse": { + "type": "object", + "properties": { + "matchedDeveloperMetadata": { + "description": "The metadata matching the criteria of the search request.", + "type": "array", + "items": { + "$ref": "MatchedDeveloperMetadata" + } + } + }, + "id": "SearchDeveloperMetadataResponse", + "description": "A reply to a developer metadata search request." + }, + "AppendCellsRequest": { + "id": "AppendCellsRequest", + "description": "Adds new cells after the last row with data in a sheet,\ninserting new rows into the sheet if necessary.", + "type": "object", + "properties": { + "rows": { + "description": "The data to append.", + "type": "array", + "items": { + "$ref": "RowData" + } + }, + "fields": { + "description": "The fields of CellData that should be updated.\nAt least one field must be specified.\nThe root is the CellData; 'row.values.' should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" + }, + "sheetId": { + "type": "integer", + "description": "The sheet ID to append the data to.", + "format": "int32" + } + } + }, + "TextFormatRun": { + "description": "A run of a text format. The format of this run continues until the start\nindex of the next run.\nWhen updating, all fields must be set.", + "type": "object", + "properties": { + "startIndex": { + "type": "integer", + "description": "The character index where this run starts.", + "format": "int32" + }, + "format": { + "$ref": "TextFormat", + "description": "The format of this run. Absent values inherit the cell's format." + } + }, + "id": "TextFormatRun" + }, + "BatchUpdateValuesByDataFilterResponse": { + "description": "The response when updating a range of values in a spreadsheet.", + "type": "object", + "properties": { + "totalUpdatedRows": { + "description": "The total number of rows where at least one cell in the row was updated.", + "format": "int32", + "type": "integer" + }, + "responses": { + "description": "The response for each range updated.", + "type": "array", + "items": { + "$ref": "UpdateValuesByDataFilterResponse" + } + }, + "totalUpdatedSheets": { + "description": "The total number of sheets where at least one cell in the sheet was\nupdated.", + "format": "int32", + "type": "integer" + }, + "totalUpdatedCells": { + "description": "The total number of cells updated.", + "format": "int32", + "type": "integer" + }, + "totalUpdatedColumns": { + "description": "The total number of columns where at least one cell in the column was\nupdated.", + "format": "int32", + "type": "integer" + }, + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", + "type": "string" + } + }, + "id": "BatchUpdateValuesByDataFilterResponse" + }, + "RowData": { + "description": "Data about each cell in a row.", + "type": "object", + "properties": { + "values": { + "description": "The values in the row, one per column.", + "type": "array", + "items": { + "$ref": "CellData" + } + } + }, + "id": "RowData" + }, + "Border": { + "type": "object", + "properties": { + "color": { + "$ref": "Color", + "description": "The color of the border." + }, + "width": { + "description": "The width of the border, in pixels.\nDeprecated; the width is determined by the \"style\" field.", + "format": "int32", + "type": "integer" + }, + "style": { + "type": "string", + "enumDescriptions": [ + "The style is not specified. Do not use this.", + "The border is dotted.", + "The border is dashed.", + "The border is a thin solid line.", + "The border is a medium solid line.", + "The border is a thick solid line.", + "No border.\nUsed only when updating a border in order to erase it.", + "The border is two solid lines." + ], + "enum": [ + "STYLE_UNSPECIFIED", + "DOTTED", + "DASHED", + "SOLID", + "SOLID_MEDIUM", + "SOLID_THICK", + "NONE", + "DOUBLE" + ], + "description": "The style of the border." + } + }, + "id": "Border", + "description": "A border along a cell." + }, + "GridData": { + "description": "Data in the grid, as well as metadata about the dimensions.", + "type": "object", + "properties": { + "rowMetadata": { + "description": "Metadata about the requested rows in the grid, starting with the row\nin start_row.", + "type": "array", + "items": { + "$ref": "DimensionProperties" + } + }, + "rowData": { + "description": "The data in the grid, one entry per row,\nstarting with the row in startRow.\nThe values in RowData will correspond to columns starting\nat start_column.", + "type": "array", + "items": { + "$ref": "RowData" + } + }, + "startRow": { + "description": "The first row this GridData refers to, zero-based.", + "format": "int32", + "type": "integer" + }, + "columnMetadata": { + "type": "array", + "items": { + "$ref": "DimensionProperties" + }, + "description": "Metadata about the requested columns in the grid, starting with the column\nin start_column." + }, + "startColumn": { + "description": "The first column this GridData refers to, zero-based.", + "format": "int32", + "type": "integer" + } + }, + "id": "GridData" + }, + "UpdateNamedRangeRequest": { + "description": "Updates properties of the named range with the specified\nnamedRangeId.", + "type": "object", + "properties": { + "namedRange": { + "$ref": "NamedRange", + "description": "The named range to update with the new properties." + }, + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `namedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" + } + }, + "id": "UpdateNamedRangeRequest" + }, + "FindReplaceRequest": { + "description": "Finds and replaces data in cells over a range, sheet, or all sheets.", + "type": "object", + "properties": { + "range": { + "$ref": "GridRange", + "description": "The range to find/replace over." + }, + "sheetId": { + "description": "The sheet to find/replace over.", + "format": "int32", + "type": "integer" + }, + "allSheets": { + "description": "True to find/replace over all sheets.", + "type": "boolean" + }, + "matchCase": { + "type": "boolean", + "description": "True if the search is case sensitive." + }, + "includeFormulas": { + "description": "True if the search should include cells with formulas.\nFalse to skip cells with formulas.", + "type": "boolean" + }, + "matchEntireCell": { + "description": "True if the find value should match the entire cell.", + "type": "boolean" + }, + "searchByRegex": { + "description": "True if the find value is a regex.\nThe regular expression and replacement should follow Java regex rules\nat https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html.\nThe replacement string is allowed to refer to capturing groups.\nFor example, if one cell has the contents `\"Google Sheets\"` and another\nhas `\"Google Docs\"`, then searching for `\"o.* (.*)\"` with a replacement of\n`\"$1 Rocks\"` would change the contents of the cells to\n`\"GSheets Rocks\"` and `\"GDocs Rocks\"` respectively.", + "type": "boolean" + }, + "find": { + "description": "The value to search.", + "type": "string" + }, + "replacement": { + "description": "The value to use as the replacement.", + "type": "string" + } + }, + "id": "FindReplaceRequest" + }, + "UpdateCellsRequest": { + "description": "Updates all cells in a range with new data.", + "type": "object", + "properties": { + "range": { + "$ref": "GridRange", + "description": "The range to write data to.\n\nIf the data in rows does not cover the entire requested range,\nthe fields matching those set in fields will be cleared." + }, + "rows": { + "description": "The data to write.", + "type": "array", + "items": { + "$ref": "RowData" + } + }, + "fields": { + "description": "The fields of CellData that should be updated.\nAt least one field must be specified.\nThe root is the CellData; 'row.values.' should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" + }, + "start": { + "$ref": "GridCoordinate", + "description": "The coordinate to start writing data at.\nAny number of rows and columns (including a different number of\ncolumns per row) may be written." + } + }, + "id": "UpdateCellsRequest" + }, + "RandomizeRangeRequest": { + "description": "Randomizes the order of the rows in a range.", + "type": "object", + "properties": { + "range": { + "description": "The range to randomize.", + "$ref": "GridRange" + } + }, + "id": "RandomizeRangeRequest" + }, + "DeleteRangeRequest": { + "id": "DeleteRangeRequest", + "description": "Deletes a range of cells, shifting other cells into the deleted area.", + "type": "object", + "properties": { + "range": { + "$ref": "GridRange", + "description": "The range of cells to delete." + }, + "shiftDimension": { + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The dimension from which deleted cells will be replaced with.\nIf ROWS, existing cells will be shifted upward to\nreplace the deleted cells. If COLUMNS, existing cells\nwill be shifted left to replace the deleted cells." + } + } + }, + "DeleteDuplicatesResponse": { + "id": "DeleteDuplicatesResponse", + "description": "The result of removing duplicates in a range.", + "type": "object", + "properties": { + "duplicatesRemovedCount": { + "description": "The number of duplicate rows removed.", + "format": "int32", + "type": "integer" + } + } + }, + "UnmergeCellsRequest": { + "description": "Unmerges cells in the given range.", + "type": "object", + "properties": { + "range": { + "$ref": "GridRange", + "description": "The range within which all cells should be unmerged.\nIf the range spans multiple merges, all will be unmerged.\nThe range must not partially span any merge." + } + }, + "id": "UnmergeCellsRequest" + }, + "SortSpec": { + "type": "object", + "properties": { + "foregroundColor": { + "description": "The text color to sort by. Mutually exclusive with sorting by background\nfill color. Requests to set this field will fail with a 400 error if\nbackground color is also set.", + "$ref": "Color" + }, + "dimensionIndex": { + "description": "The dimension the sort should be applied to.", + "format": "int32", + "type": "integer" + }, + "backgroundColor": { + "$ref": "Color", + "description": "The background fill color to sort by. Mutually exclusive with sorting by\ntext color. Requests to set this field will fail with a 400 error if\nforeground color is also set." + }, + "sortOrder": { + "enumDescriptions": [ + "Default value, do not use this.", + "Sort ascending.", + "Sort descending." + ], + "enum": [ + "SORT_ORDER_UNSPECIFIED", + "ASCENDING", + "DESCENDING" + ], + "description": "The order data should be sorted.", + "type": "string" + } + }, + "id": "SortSpec", + "description": "A sort order associated with a specific column or row." + }, + "UpdateEmbeddedObjectPositionResponse": { + "description": "The result of updating an embedded object's position.", + "type": "object", + "properties": { + "position": { + "description": "The new position of the embedded object.", + "$ref": "EmbeddedObjectPosition" + } + }, + "id": "UpdateEmbeddedObjectPositionResponse" + }, + "BooleanRule": { + "description": "A rule that may or may not match, depending on the condition.", + "type": "object", + "properties": { + "format": { + "$ref": "CellFormat", + "description": "The format to apply.\nConditional formatting can only apply a subset of formatting:\nbold, italic,\nstrikethrough,\nforeground color &\nbackground color." + }, + "condition": { + "description": "The condition of the rule. If the condition evaluates to true,\nthe format is applied.", + "$ref": "BooleanCondition" + } + }, + "id": "BooleanRule" + }, + "WaterfallChartSpec": { + "description": "A waterfall chart.", + "type": "object", + "properties": { + "firstValueIsTotal": { + "description": "True to interpret the first value as a total.", + "type": "boolean" + }, + "stackedType": { + "enum": [ + "WATERFALL_STACKED_TYPE_UNSPECIFIED", + "STACKED", + "SEQUENTIAL" + ], + "description": "The stacked type.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "Values corresponding to the same domain (horizontal axis) value will be\nstacked vertically.", + "Series will spread out along the horizontal axis." + ] + }, + "hideConnectorLines": { + "description": "True to hide connector lines between columns.", + "type": "boolean" + }, + "series": { + "description": "The data this waterfall chart is visualizing.", + "type": "array", + "items": { + "$ref": "WaterfallChartSeries" + } + }, + "connectorLineStyle": { + "$ref": "LineStyle", + "description": "The line style for the connector lines." + }, + "domain": { + "description": "The domain data (horizontal axis) for the waterfall chart.", + "$ref": "WaterfallChartDomain" + } + }, + "id": "WaterfallChartSpec" + }, + "UpdateConditionalFormatRuleRequest": { + "description": "Updates a conditional format rule at the given index,\nor moves a conditional format rule to another index.", + "type": "object", + "properties": { + "rule": { + "description": "The rule that should replace the rule at the given index.", + "$ref": "ConditionalFormatRule" + }, + "index": { + "description": "The zero-based index of the rule that should be replaced or moved.", + "format": "int32", + "type": "integer" + }, + "sheetId": { + "description": "The sheet of the rule to move. Required if new_index is set,\nunused otherwise.", + "format": "int32", + "type": "integer" + }, + "newIndex": { + "description": "The zero-based new index the rule should end up at.", + "format": "int32", + "type": "integer" + } + }, + "id": "UpdateConditionalFormatRuleRequest" + }, + "BasicChartDomain": { + "description": "The domain of a chart.\nFor example, if charting stock prices over time, this would be the date.", + "type": "object", + "properties": { + "domain": { + "$ref": "ChartData", + "description": "The data of the domain. For example, if charting stock prices over time,\nthis is the data representing the dates." + }, + "reversed": { + "description": "True to reverse the order of the domain values (horizontal axis).", + "type": "boolean" + } + }, + "id": "BasicChartDomain" + }, + "PasteDataRequest": { + "type": "object", + "properties": { + "type": { + "enumDescriptions": [ + "Paste values, formulas, formats, and merges.", + "Paste the values ONLY without formats, formulas, or merges.", + "Paste the format and data validation only.", + "Like PASTE_NORMAL but without borders.", + "Paste the formulas only.", + "Paste the data validation only.", + "Paste the conditional formatting rules only." + ], + "enum": [ + "PASTE_NORMAL", + "PASTE_VALUES", + "PASTE_FORMAT", + "PASTE_NO_BORDERS", + "PASTE_FORMULA", + "PASTE_DATA_VALIDATION", + "PASTE_CONDITIONAL_FORMATTING" + ], + "description": "How the data should be pasted.", + "type": "string" + }, + "html": { + "description": "True if the data is HTML.", + "type": "boolean" + }, + "coordinate": { + "$ref": "GridCoordinate", + "description": "The coordinate at which the data should start being inserted." + }, + "data": { + "description": "The data to insert.", + "type": "string" + }, + "delimiter": { + "description": "The delimiter in the data.", + "type": "string" + } + }, + "id": "PasteDataRequest", + "description": "Inserts data into the spreadsheet starting at the specified coordinate." + }, + "UpdateDeveloperMetadataResponse": { + "description": "The response from updating developer metadata.", + "type": "object", + "properties": { + "developerMetadata": { + "description": "The updated developer metadata.", + "type": "array", + "items": { + "$ref": "DeveloperMetadata" + } + } + }, + "id": "UpdateDeveloperMetadataResponse" + }, + "AppendDimensionRequest": { + "description": "Appends rows or columns to the end of a sheet.", + "type": "object", + "properties": { + "dimension": { + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "Whether rows or columns should be appended." + }, + "length": { + "description": "The number of rows or columns to append.", + "format": "int32", + "type": "integer" + }, + "sheetId": { + "type": "integer", + "description": "The sheet to append rows or columns to.", + "format": "int32" + } + }, + "id": "AppendDimensionRequest" + }, + "AddNamedRangeRequest": { + "description": "Adds a named range to the spreadsheet.", + "type": "object", + "properties": { + "namedRange": { + "description": "The named range to add. The namedRangeId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a range that already exists.)", + "$ref": "NamedRange" + } + }, + "id": "AddNamedRangeRequest" + }, + "CreateDeveloperMetadataResponse": { + "type": "object", + "properties": { + "developerMetadata": { + "$ref": "DeveloperMetadata", + "description": "The developer metadata that was created." + } + }, + "id": "CreateDeveloperMetadataResponse", + "description": "The response from creating developer metadata." + }, + "UpdateEmbeddedObjectPositionRequest": { + "description": "Update an embedded object's position (such as a moving or resizing a\nchart or image).", + "type": "object", + "properties": { + "fields": { + "description": "The fields of OverlayPosition\nthat should be updated when setting a new position. Used only if\nnewPosition.overlayPosition\nis set, in which case at least one field must\nbe specified. The root `newPosition.overlayPosition` is implied and\nshould not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" + }, + "objectId": { + "type": "integer", + "description": "The ID of the object to moved.", + "format": "int32" + }, + "newPosition": { + "$ref": "EmbeddedObjectPosition", + "description": "An explicit position to move the embedded object to.\nIf newPosition.sheetId is set,\na new sheet with that ID will be created.\nIf newPosition.newSheet is set to true,\na new sheet will be created with an ID that will be chosen for you." + } + }, + "id": "UpdateEmbeddedObjectPositionRequest" + }, + "WaterfallChartColumnStyle": { + "description": "Styles for a waterfall chart column.", + "type": "object", + "properties": { + "label": { + "description": "The label of the column's legend.", + "type": "string" + }, + "color": { + "$ref": "Color", + "description": "The color of the column." + } + }, + "id": "WaterfallChartColumnStyle" + }, + "Request": { + "id": "Request", + "description": "A single kind of update to apply to a spreadsheet.", + "type": "object", + "properties": { + "deleteEmbeddedObject": { + "$ref": "DeleteEmbeddedObjectRequest", + "description": "Deletes an embedded object (e.g, chart, image) in a sheet." + }, + "updateFilterView": { + "$ref": "UpdateFilterViewRequest", + "description": "Updates the properties of a filter view." + }, + "addBanding": { + "description": "Adds a new banded range", + "$ref": "AddBandingRequest" + }, + "appendCells": { + "$ref": "AppendCellsRequest", + "description": "Appends cells after the last row with data in a sheet." + }, + "autoResizeDimensions": { + "description": "Automatically resizes one or more dimensions based on the contents\nof the cells in that dimension.", + "$ref": "AutoResizeDimensionsRequest" + }, + "cutPaste": { + "$ref": "CutPasteRequest", + "description": "Cuts data from one area and pastes it to another." + }, + "mergeCells": { + "$ref": "MergeCellsRequest", + "description": "Merges cells together." + }, + "updateNamedRange": { + "description": "Updates a named range.", + "$ref": "UpdateNamedRangeRequest" + }, + "updateSheetProperties": { + "$ref": "UpdateSheetPropertiesRequest", + "description": "Updates a sheet's properties." + }, + "deleteDimension": { + "$ref": "DeleteDimensionRequest", + "description": "Deletes rows or columns in a sheet." + }, + "autoFill": { + "description": "Automatically fills in more data based on existing data.", + "$ref": "AutoFillRequest" + }, + "addSlicer": { + "$ref": "AddSlicerRequest", + "description": "Adds a slicer." + }, + "sortRange": { + "$ref": "SortRangeRequest", + "description": "Sorts data in a range." + }, + "deleteDimensionGroup": { + "$ref": "DeleteDimensionGroupRequest", + "description": "Deletes a group over the specified range." + }, + "deleteProtectedRange": { + "$ref": "DeleteProtectedRangeRequest", + "description": "Deletes a protected range." + }, + "duplicateFilterView": { + "$ref": "DuplicateFilterViewRequest", + "description": "Duplicates a filter view." + }, + "addChart": { + "$ref": "AddChartRequest", + "description": "Adds a chart." + }, + "findReplace": { + "description": "Finds and replaces occurrences of some text with other text.", + "$ref": "FindReplaceRequest" + }, + "updateChartSpec": { + "$ref": "UpdateChartSpecRequest", + "description": "Updates a chart's specifications." + }, + "textToColumns": { + "$ref": "TextToColumnsRequest", + "description": "Converts a column of text into many columns of text." + }, + "updateProtectedRange": { + "$ref": "UpdateProtectedRangeRequest", + "description": "Updates a protected range." + }, + "addSheet": { + "description": "Adds a sheet.", + "$ref": "AddSheetRequest" + }, + "copyPaste": { + "description": "Copies data from one area and pastes it to another.", + "$ref": "CopyPasteRequest" + }, + "deleteFilterView": { + "description": "Deletes a filter view from a sheet.", + "$ref": "DeleteFilterViewRequest" + }, + "insertDimension": { + "$ref": "InsertDimensionRequest", + "description": "Inserts new rows or columns in a sheet." + }, + "deleteRange": { + "$ref": "DeleteRangeRequest", + "description": "Deletes a range of cells from a sheet, shifting the remaining cells." + }, + "deleteBanding": { + "$ref": "DeleteBandingRequest", + "description": "Removes a banded range" + }, + "addFilterView": { + "$ref": "AddFilterViewRequest", + "description": "Adds a filter view." + }, + "deleteDuplicates": { + "$ref": "DeleteDuplicatesRequest", + "description": "Removes rows containing duplicate values in specified columns of a cell\nrange." + }, + "setDataValidation": { + "$ref": "SetDataValidationRequest", + "description": "Sets data validation for one or more cells." + }, + "updateBorders": { + "$ref": "UpdateBordersRequest", + "description": "Updates the borders in a range of cells." + }, + "deleteConditionalFormatRule": { + "$ref": "DeleteConditionalFormatRuleRequest", + "description": "Deletes an existing conditional format rule." + }, + "repeatCell": { + "$ref": "RepeatCellRequest", + "description": "Repeats a single cell across a range." + }, + "clearBasicFilter": { + "$ref": "ClearBasicFilterRequest", + "description": "Clears the basic filter on a sheet." + }, + "appendDimension": { + "$ref": "AppendDimensionRequest", + "description": "Appends dimensions to the end of a sheet." + }, + "updateSlicerSpec": { + "$ref": "UpdateSlicerSpecRequest", + "description": "Updates a slicer's specifications." + }, + "createDeveloperMetadata": { + "$ref": "CreateDeveloperMetadataRequest", + "description": "Creates new developer metadata" + }, + "updateConditionalFormatRule": { + "$ref": "UpdateConditionalFormatRuleRequest", + "description": "Updates an existing conditional format rule." + }, + "insertRange": { + "$ref": "InsertRangeRequest", + "description": "Inserts new cells in a sheet, shifting the existing cells." + }, + "moveDimension": { + "description": "Moves rows or columns to another location in a sheet.", + "$ref": "MoveDimensionRequest" + }, + "deleteDeveloperMetadata": { + "$ref": "DeleteDeveloperMetadataRequest", + "description": "Deletes developer metadata" + }, + "randomizeRange": { + "$ref": "RandomizeRangeRequest", + "description": "Randomizes the order of the rows in a range." + }, + "updateBanding": { + "$ref": "UpdateBandingRequest", + "description": "Updates a banded range" + }, + "addProtectedRange": { + "$ref": "AddProtectedRangeRequest", + "description": "Adds a protected range." + }, + "deleteNamedRange": { + "$ref": "DeleteNamedRangeRequest", + "description": "Deletes a named range." + }, + "duplicateSheet": { + "$ref": "DuplicateSheetRequest", + "description": "Duplicates a sheet." + }, + "deleteSheet": { + "$ref": "DeleteSheetRequest", + "description": "Deletes a sheet." + }, + "unmergeCells": { + "$ref": "UnmergeCellsRequest", + "description": "Unmerges merged cells." + }, + "updateEmbeddedObjectPosition": { + "$ref": "UpdateEmbeddedObjectPositionRequest", + "description": "Updates an embedded object's (e.g. chart, image) position." + }, + "addDimensionGroup": { + "$ref": "AddDimensionGroupRequest", + "description": "Creates a group over the specified range." + }, + "updateDimensionProperties": { + "$ref": "UpdateDimensionPropertiesRequest", + "description": "Updates dimensions' properties." + }, + "updateDeveloperMetadata": { + "description": "Updates an existing developer metadata entry", + "$ref": "UpdateDeveloperMetadataRequest" + }, + "updateDimensionGroup": { + "$ref": "UpdateDimensionGroupRequest", + "description": "Updates the state of the specified group." + }, + "pasteData": { + "$ref": "PasteDataRequest", + "description": "Pastes data (HTML or delimited) into a sheet." + }, + "setBasicFilter": { + "$ref": "SetBasicFilterRequest", + "description": "Sets the basic filter on a sheet." + }, + "addConditionalFormatRule": { + "description": "Adds a new conditional format rule.", + "$ref": "AddConditionalFormatRuleRequest" + }, + "updateCells": { + "description": "Updates many cells at once.", + "$ref": "UpdateCellsRequest" + }, + "addNamedRange": { + "description": "Adds a named range.", + "$ref": "AddNamedRangeRequest" + }, + "updateSpreadsheetProperties": { + "$ref": "UpdateSpreadsheetPropertiesRequest", + "description": "Updates the spreadsheet's properties." + }, + "trimWhitespace": { + "$ref": "TrimWhitespaceRequest", + "description": "Trims cells of whitespace (such as spaces, tabs, or new lines)." + } + } + }, + "GridRange": { + "id": "GridRange", + "description": "A range on a sheet.\nAll indexes are zero-based.\nIndexes are half open, e.g the start index is inclusive\nand the end index is exclusive -- [start_index, end_index).\nMissing indexes indicate the range is unbounded on that side.\n\nFor example, if `\"Sheet1\"` is sheet ID 0, then:\n\n `Sheet1!A1:A1 == sheet_id: 0,\n start_row_index: 0, end_row_index: 1,\n start_column_index: 0, end_column_index: 1`\n\n `Sheet1!A3:B4 == sheet_id: 0,\n start_row_index: 2, end_row_index: 4,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1!A:B == sheet_id: 0,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1!A5:B == sheet_id: 0,\n start_row_index: 4,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1 == sheet_id:0`\n\nThe start index must always be less than or equal to the end index.\nIf the start index equals the end index, then the range is empty.\nEmpty ranges are typically not meaningful and are usually rendered in the\nUI as `#REF!`.", + "type": "object", + "properties": { + "startRowIndex": { + "description": "The start row (inclusive) of the range, or not set if unbounded.", + "format": "int32", + "type": "integer" + }, + "startColumnIndex": { + "description": "The start column (inclusive) of the range, or not set if unbounded.", + "format": "int32", + "type": "integer" + }, + "sheetId": { + "type": "integer", + "description": "The sheet this range is on.", + "format": "int32" + }, + "endRowIndex": { + "type": "integer", + "description": "The end row (exclusive) of the range, or not set if unbounded.", + "format": "int32" + }, + "endColumnIndex": { + "description": "The end column (exclusive) of the range, or not set if unbounded.", + "format": "int32", + "type": "integer" + } + } + }, + "WaterfallChartDomain": { + "id": "WaterfallChartDomain", + "description": "The domain of a waterfall chart.", + "type": "object", + "properties": { + "reversed": { + "description": "True to reverse the order of the domain values (horizontal axis).", + "type": "boolean" + }, + "data": { + "$ref": "ChartData", + "description": "The data of the WaterfallChartDomain." + } + } + }, + "DeleteDimensionGroupRequest": { + "type": "object", + "properties": { + "range": { + "$ref": "DimensionRange", + "description": "The range of the group to be deleted." + } + }, + "id": "DeleteDimensionGroupRequest", + "description": "Deletes a group over the specified range by decrementing the depth of the\ndimensions in the range.\n\nFor example, assume the sheet has a depth-1 group over B:E and a depth-2\ngroup over C:D. Deleting a group over D:E leaves the sheet with a\ndepth-1 group over B:D and a depth-2 group over C:C." + }, + "SetDataValidationRequest": { + "type": "object", + "properties": { + "rule": { + "$ref": "DataValidationRule", + "description": "The data validation rule to set on each cell in the range,\nor empty to clear the data validation in the range." + }, + "range": { + "description": "The range the data validation rule should apply to.", + "$ref": "GridRange" + } + }, + "id": "SetDataValidationRequest", + "description": "Sets a data validation rule to every cell in the range.\nTo clear validation in a range, call this with no rule specified." + }, + "BubbleChartSpec": { + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/bubblechart\"\u003ebubble chart\u003c/a\u003e.", + "type": "object", + "properties": { + "bubbleOpacity": { + "description": "The opacity of the bubbles between 0 and 1.0.\n0 is fully transparent and 1 is fully opaque.", + "format": "float", + "type": "number" + }, + "bubbleSizes": { + "description": "The data contianing the bubble sizes. Bubble sizes are used to draw\nthe bubbles at different sizes relative to each other.\nIf specified, group_ids must also be specified. This field is\noptional.", + "$ref": "ChartData" + }, + "domain": { + "$ref": "ChartData", + "description": "The data containing the bubble x-values. These values locate the bubbles\nin the chart horizontally." + }, + "bubbleBorderColor": { + "$ref": "Color", + "description": "The bubble border color." + }, + "bubbleTextStyle": { + "description": "The format of the text inside the bubbles.\nUnderline and Strikethrough are not supported.", + "$ref": "TextFormat" + }, + "groupIds": { + "$ref": "ChartData", + "description": "The data containing the bubble group IDs. All bubbles with the same group\nID are drawn in the same color. If bubble_sizes is specified then\nthis field must also be specified but may contain blank values.\nThis field is optional." + }, + "bubbleLabels": { + "$ref": "ChartData", + "description": "The data containing the bubble labels. These do not need to be unique." + }, + "bubbleMinRadiusSize": { + "description": "The minimum radius size of the bubbles, in pixels.\nIf specific, the field must be a positive value.", + "format": "int32", + "type": "integer" + }, + "bubbleMaxRadiusSize": { + "type": "integer", + "description": "The max radius size of the bubbles, in pixels.\nIf specified, the field must be a positive value.", + "format": "int32" + }, + "series": { + "$ref": "ChartData", + "description": "The data contianing the bubble y-values. These values locate the bubbles\nin the chart vertically." + }, + "legendPosition": { + "enumDescriptions": [ + "Default value, do not use.", + "The legend is rendered on the bottom of the chart.", + "The legend is rendered on the left of the chart.", + "The legend is rendered on the right of the chart.", + "The legend is rendered on the top of the chart.", + "No legend is rendered.", + "The legend is rendered inside the chart area." + ], + "enum": [ + "BUBBLE_CHART_LEGEND_POSITION_UNSPECIFIED", + "BOTTOM_LEGEND", + "LEFT_LEGEND", + "RIGHT_LEGEND", + "TOP_LEGEND", + "NO_LEGEND", + "INSIDE_LEGEND" + ], + "description": "Where the legend of the chart should be drawn.", + "type": "string" + } + }, + "id": "BubbleChartSpec" + }, + "TextPosition": { + "type": "object", + "properties": { + "horizontalAlignment": { + "type": "string", + "enumDescriptions": [ + "The horizontal alignment is not specified. Do not use this.", + "The text is explicitly aligned to the left of the cell.", + "The text is explicitly aligned to the center of the cell.", + "The text is explicitly aligned to the right of the cell." + ], + "enum": [ + "HORIZONTAL_ALIGN_UNSPECIFIED", + "LEFT", + "CENTER", + "RIGHT" + ], + "description": "Horizontal alignment setting for the piece of text." + } + }, + "id": "TextPosition", + "description": "Position settings for text." + }, + "BatchUpdateSpreadsheetRequest": { + "type": "object", + "properties": { + "includeSpreadsheetInResponse": { + "type": "boolean", + "description": "Determines if the update response should include the spreadsheet\nresource." + }, + "responseRanges": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Limits the ranges included in the response spreadsheet.\nMeaningful only if include_spreadsheet_response is 'true'." + }, + "responseIncludeGridData": { + "description": "True if grid data should be returned. Meaningful only if\nif include_spreadsheet_in_response is 'true'.\nThis parameter is ignored if a field mask was set in the request.", + "type": "boolean" + }, + "requests": { + "description": "A list of updates to apply to the spreadsheet.\nRequests will be applied in the order they are specified.\nIf any request is not valid, no requests will be applied.", + "type": "array", + "items": { + "$ref": "Request" + } + } + }, + "id": "BatchUpdateSpreadsheetRequest", + "description": "The request for updating any aspect of a spreadsheet." + }, + "Padding": { + "id": "Padding", + "description": "The amount of padding around the cell, in pixels.\nWhen updating padding, every field must be specified.", + "type": "object", + "properties": { + "right": { + "description": "The right padding of the cell.", + "format": "int32", + "type": "integer" + }, + "bottom": { + "description": "The bottom padding of the cell.", + "format": "int32", + "type": "integer" + }, + "top": { + "description": "The top padding of the cell.", + "format": "int32", + "type": "integer" + }, + "left": { + "description": "The left padding of the cell.", + "format": "int32", + "type": "integer" + } + } + }, + "BasicChartAxis": { + "description": "An axis of the chart.\nA chart may not have more than one axis per\naxis position.", + "type": "object", + "properties": { + "position": { + "enumDescriptions": [ + "Default value, do not use.", + "The axis rendered at the bottom of a chart.\nFor most charts, this is the standard major axis.\nFor bar charts, this is a minor axis.", + "The axis rendered at the left of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is the standard major axis.", + "The axis rendered at the right of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is an unusual major axis." + ], + "enum": [ + "BASIC_CHART_AXIS_POSITION_UNSPECIFIED", + "BOTTOM_AXIS", + "LEFT_AXIS", + "RIGHT_AXIS" + ], + "description": "The position of this axis.", + "type": "string" + }, + "title": { + "description": "The title of this axis. If set, this overrides any title inferred\nfrom headers of the data.", + "type": "string" + }, + "titleTextPosition": { + "description": "The axis title text position.", + "$ref": "TextPosition" + }, + "format": { + "$ref": "TextFormat", + "description": "The format of the title.\nOnly valid if the axis is not associated with the domain." + }, + "viewWindowOptions": { + "description": "The view window options for this axis.", + "$ref": "ChartAxisViewWindowOptions" + } + }, + "id": "BasicChartAxis" + }, + "DeleteDimensionRequest": { + "description": "Deletes the dimensions from the sheet.", + "type": "object", + "properties": { + "range": { + "$ref": "DimensionRange", + "description": "The dimensions to delete from the sheet." + } + }, + "id": "DeleteDimensionRequest" + }, + "UpdateChartSpecRequest": { + "description": "Updates a chart's specifications.\n(This does not move or resize a chart. To move or resize a chart, use\n UpdateEmbeddedObjectPositionRequest.)", + "type": "object", + "properties": { + "chartId": { + "type": "integer", + "description": "The ID of the chart to update.", + "format": "int32" + }, + "spec": { + "$ref": "ChartSpec", + "description": "The specification to apply to the chart." + } + }, + "id": "UpdateChartSpecRequest" + }, + "DeleteFilterViewRequest": { + "description": "Deletes a particular filter view.", + "type": "object", + "properties": { + "filterId": { + "description": "The ID of the filter to delete.", + "format": "int32", + "type": "integer" + } + }, + "id": "DeleteFilterViewRequest" + }, + "BatchGetValuesByDataFilterRequest": { + "description": "The request for retrieving a range of values in a spreadsheet selected by a\nset of DataFilters.", + "type": "object", + "properties": { + "majorDimension": { + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen a request that selects that range and sets `majorDimension=ROWS` will\nreturn `[[1,2],[3,4]]`,\nwhereas a request that sets `majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`." + }, + "dataFilters": { + "type": "array", + "items": { + "$ref": "DataFilter" + }, + "description": "The data filters used to match the ranges of values to retrieve. Ranges\nthat match any of the specified data filters will be included in the\nresponse." + }, + "valueRenderOption": { + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" + ], + "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", + "type": "string", + "enumDescriptions": [ + "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", + "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", + "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." + ] + }, + "dateTimeRenderOption": { + "enumDescriptions": [ + "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", + "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." + ], + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ], + "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", + "type": "string" + } + }, + "id": "BatchGetValuesByDataFilterRequest" + }, + "BatchUpdateValuesResponse": { + "description": "The response when updating a range of values in a spreadsheet.", + "type": "object", + "properties": { + "totalUpdatedRows": { + "type": "integer", + "description": "The total number of rows where at least one cell in the row was updated.", + "format": "int32" + }, + "responses": { + "type": "array", + "items": { + "$ref": "UpdateValuesResponse" + }, + "description": "One UpdateValuesResponse per requested range, in the same order as\nthe requests appeared." + }, + "totalUpdatedSheets": { + "description": "The total number of sheets where at least one cell in the sheet was\nupdated.", + "format": "int32", + "type": "integer" + }, + "totalUpdatedCells": { + "description": "The total number of cells updated.", + "format": "int32", + "type": "integer" + }, + "totalUpdatedColumns": { + "description": "The total number of columns where at least one cell in the column was\nupdated.", + "format": "int32", + "type": "integer" + }, + "spreadsheetId": { + "type": "string", + "description": "The spreadsheet the updates were applied to." + } + }, + "id": "BatchUpdateValuesResponse" + }, + "KeyValueFormat": { + "description": "Formatting options for key value.", + "type": "object", + "properties": { + "position": { + "$ref": "TextPosition", + "description": "Specifies the horizontal text positioning of key value.\nThis field is optional. If not specified, default positioning is used." + }, + "textFormat": { + "description": "Text formatting options for key value.", + "$ref": "TextFormat" + } + }, + "id": "KeyValueFormat" + }, + "BatchClearValuesRequest": { + "type": "object", + "properties": { + "ranges": { + "description": "The ranges to clear, in A1 notation.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "id": "BatchClearValuesRequest", + "description": "The request for clearing more than one range of values in a spreadsheet." + }, + "DeveloperMetadata": { + "description": "Developer metadata associated with a location or object in a spreadsheet.\nDeveloper metadata may be used to associate arbitrary data with various\nparts of a spreadsheet and will remain associated at those locations as they\nmove around and the spreadsheet is edited. For example, if developer\nmetadata is associated with row 5 and another row is then subsequently\ninserted above row 5, that original metadata will still be associated with\nthe row it was first associated with (what is now row 6). If the associated\nobject is deleted its metadata is deleted too.", + "type": "object", + "properties": { + "metadataKey": { + "description": "The metadata key. There may be multiple metadata in a spreadsheet with the\nsame key. Developer metadata must always have a key specified.", + "type": "string" + }, + "metadataId": { + "type": "integer", + "description": "The spreadsheet-scoped unique ID that identifies the metadata. IDs may be\nspecified when metadata is created, otherwise one will be randomly\ngenerated and assigned. Must be positive.", + "format": "int32" + }, + "location": { + "$ref": "DeveloperMetadataLocation", + "description": "The location where the metadata is associated." + }, + "visibility": { + "enumDescriptions": [ + "Default value.", + "Document-visible metadata is accessible from any developer project with\naccess to the document.", + "Project-visible metadata is only visible to and accessible by the developer\nproject that created the metadata." + ], + "enum": [ + "DEVELOPER_METADATA_VISIBILITY_UNSPECIFIED", + "DOCUMENT", + "PROJECT" + ], + "description": "The metadata visibility. Developer metadata must always have a visibility\nspecified.", + "type": "string" + }, + "metadataValue": { + "description": "Data associated with the metadata's key.", + "type": "string" + } + }, + "id": "DeveloperMetadata" + }, + "BaselineValueFormat": { + "description": "Formatting options for baseline value.", + "type": "object", + "properties": { + "textFormat": { + "$ref": "TextFormat", + "description": "Text formatting options for baseline value." + }, + "description": { + "type": "string", + "description": "Description which is appended after the baseline value.\nThis field is optional." + }, + "negativeColor": { + "$ref": "Color", + "description": "Color to be used, in case baseline value represents a negative change for\nkey value. This field is optional." + }, + "comparisonType": { + "enum": [ + "COMPARISON_TYPE_UNDEFINED", + "ABSOLUTE_DIFFERENCE", + "PERCENTAGE_DIFFERENCE" + ], + "description": "The comparison type of key value with baseline value.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "Use absolute difference between key and baseline value.", + "Use percentage difference between key and baseline value." + ] + }, + "position": { + "$ref": "TextPosition", + "description": "Specifies the horizontal text positioning of baseline value.\nThis field is optional. If not specified, default positioning is used." + }, + "positiveColor": { + "$ref": "Color", + "description": "Color to be used, in case baseline value represents a positive change for\nkey value. This field is optional." + } + }, + "id": "BaselineValueFormat" + }, + "TextToColumnsRequest": { + "description": "Splits a column of text into multiple columns,\nbased on a delimiter in each cell.", + "type": "object", + "properties": { + "delimiter": { + "description": "The delimiter to use. Used only if delimiterType is\nCUSTOM.", + "type": "string" + }, + "source": { + "description": "The source data range. This must span exactly one column.", + "$ref": "GridRange" + }, + "delimiterType": { + "type": "string", + "enumDescriptions": [ + "Default value. This value must not be used.", + "\",\"", + "\";\"", + "\".\"", + "\" \"", + "A custom value as defined in delimiter.", + "Automatically detect columns." + ], + "enum": [ + "DELIMITER_TYPE_UNSPECIFIED", + "COMMA", + "SEMICOLON", + "PERIOD", + "SPACE", + "CUSTOM", + "AUTODETECT" + ], + "description": "The delimiter type to use." + } + }, + "id": "TextToColumnsRequest" + }, + "ClearBasicFilterRequest": { + "type": "object", + "properties": { + "sheetId": { + "description": "The sheet ID on which the basic filter should be cleared.", + "format": "int32", + "type": "integer" + } + }, + "id": "ClearBasicFilterRequest", + "description": "Clears the basic filter, if any exists on the sheet." + }, + "DimensionGroup": { + "type": "object", + "properties": { + "collapsed": { + "description": "This field is true if this group is collapsed. A collapsed group remains\ncollapsed if an overlapping group at a shallower depth is expanded.\n\nA true value does not imply that all dimensions within the group are\nhidden, since a dimension's visibility can change independently from this\ngroup property. However, when this property is updated, all dimensions\nwithin it are set to hidden if this field is true, or set to visible if\nthis field is false.", + "type": "boolean" + }, + "range": { + "$ref": "DimensionRange", + "description": "The range over which this group exists." + }, + "depth": { + "type": "integer", + "description": "The depth of the group, representing how many groups have a range that\nwholly contains the range of this group.", + "format": "int32" + } + }, + "id": "DimensionGroup", + "description": "A group over an interval of rows or columns on a sheet, which can contain or\nbe contained within other groups. A group can be collapsed or expanded as a\nunit on the sheet." + }, + "DeleteBandingRequest": { + "description": "Removes the banded range with the given ID from the spreadsheet.", + "type": "object", + "properties": { + "bandedRangeId": { + "description": "The ID of the banded range to delete.", + "format": "int32", + "type": "integer" + } + }, + "id": "DeleteBandingRequest" + }, + "AppendValuesResponse": { + "id": "AppendValuesResponse", + "description": "The response when updating a range of values in a spreadsheet.", + "type": "object", + "properties": { + "updates": { + "$ref": "UpdateValuesResponse", + "description": "Information about the updates that were applied." + }, + "tableRange": { + "description": "The range (in A1 notation) of the table that values are being appended to\n(before the values were appended).\nEmpty if no table was found.", + "type": "string" + }, + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", + "type": "string" + } + } + }, + "MoveDimensionRequest": { + "type": "object", + "properties": { + "destinationIndex": { + "description": "The zero-based start index of where to move the source data to,\nbased on the coordinates *before* the source data is removed\nfrom the grid. Existing data will be shifted down or right\n(depending on the dimension) to make room for the moved dimensions.\nThe source dimensions are removed from the grid, so the\nthe data may end up in a different index than specified.\n\nFor example, given `A1..A5` of `0, 1, 2, 3, 4` and wanting to move\n`\"1\"` and `\"2\"` to between `\"3\"` and `\"4\"`, the source would be\n`ROWS [1..3)`,and the destination index would be `\"4\"`\n(the zero-based index of row 5).\nThe end result would be `A1..A5` of `0, 3, 1, 2, 4`.", + "format": "int32", + "type": "integer" + }, + "source": { + "$ref": "DimensionRange", + "description": "The source dimensions to move." + } + }, + "id": "MoveDimensionRequest", + "description": "Moves one or more rows or columns." + }, + "PivotFilterCriteria": { + "type": "object", + "properties": { + "visibleValues": { + "description": "Values that should be included. Values not listed here are excluded.", + "type": "array", + "items": { + "type": "string" + } + } + }, + "id": "PivotFilterCriteria", + "description": "Criteria for showing/hiding rows in a pivot table." + }, + "AddConditionalFormatRuleRequest": { + "description": "Adds a new conditional format rule at the given index.\nAll subsequent rules' indexes are incremented.", + "type": "object", + "properties": { + "rule": { + "$ref": "ConditionalFormatRule", + "description": "The rule to add." + }, + "index": { + "description": "The zero-based index where the rule should be inserted.", + "format": "int32", + "type": "integer" + } + }, + "id": "AddConditionalFormatRuleRequest" + }, + "CreateDeveloperMetadataRequest": { + "description": "A request to create developer metadata.", + "type": "object", + "properties": { + "developerMetadata": { + "description": "The developer metadata to create.", + "$ref": "DeveloperMetadata" + } + }, + "id": "CreateDeveloperMetadataRequest" + }, + "ChartSpec": { + "id": "ChartSpec", + "description": "The specifications of a chart.", + "type": "object", + "properties": { + "title": { + "description": "The title of the chart.", + "type": "string" + }, + "altText": { + "description": "The alternative text that describes the chart. This is often used\nfor accessibility.", + "type": "string" + }, + "titleTextPosition": { + "$ref": "TextPosition", + "description": "The title text position.\nThis field is optional." + }, + "histogramChart": { + "$ref": "HistogramChartSpec", + "description": "A histogram chart specification." + }, + "candlestickChart": { + "$ref": "CandlestickChartSpec", + "description": "A candlestick chart specification." + }, + "bubbleChart": { + "$ref": "BubbleChartSpec", + "description": "A bubble chart specification." + }, + "waterfallChart": { + "$ref": "WaterfallChartSpec", + "description": "A waterfall chart specification." + }, + "fontName": { + "description": "The name of the font to use by default for all chart text (e.g. title,\naxis labels, legend). If a font is specified for a specific part of the\nchart it will override this font name.", + "type": "string" + }, + "maximized": { + "description": "True to make a chart fill the entire space in which it's rendered with\nminimum padding. False to use the default padding.\n(Not applicable to Geo and Org charts.)", + "type": "boolean" + }, + "treemapChart": { + "$ref": "TreemapChartSpec", + "description": "A treemap chart specification." + }, + "hiddenDimensionStrategy": { + "enumDescriptions": [ + "Default value, do not use.", + "Charts will skip hidden rows and columns.", + "Charts will skip hidden rows only.", + "Charts will skip hidden columns only.", + "Charts will not skip any hidden rows or columns." + ], + "enum": [ + "CHART_HIDDEN_DIMENSION_STRATEGY_UNSPECIFIED", + "SKIP_HIDDEN_ROWS_AND_COLUMNS", + "SKIP_HIDDEN_ROWS", + "SKIP_HIDDEN_COLUMNS", + "SHOW_ALL" + ], + "description": "Determines how the charts will use hidden rows or columns.", + "type": "string" + }, + "subtitleTextFormat": { + "$ref": "TextFormat", + "description": "The subtitle text format.\nStrikethrough and underline are not supported." + }, + "subtitle": { + "description": "The subtitle of the chart.", + "type": "string" + }, + "backgroundColor": { + "description": "The background color of the entire chart.\nNot applicable to Org charts.", + "$ref": "Color" + }, + "subtitleTextPosition": { + "description": "The subtitle text position.\nThis field is optional.", + "$ref": "TextPosition" + }, + "basicChart": { + "$ref": "BasicChartSpec", + "description": "A basic chart specification, can be one of many kinds of charts.\nSee BasicChartType for the list of all\ncharts this supports." + }, + "orgChart": { + "$ref": "OrgChartSpec", + "description": "An org chart specification." + }, + "scorecardChart": { + "description": "A scorecard chart specification.", + "$ref": "ScorecardChartSpec" + }, + "pieChart": { + "$ref": "PieChartSpec", + "description": "A pie chart specification." + }, + "titleTextFormat": { + "$ref": "TextFormat", + "description": "The title text format.\nStrikethrough and underline are not supported." + } + } + }, + "BatchGetValuesByDataFilterResponse": { + "id": "BatchGetValuesByDataFilterResponse", + "description": "The response when retrieving more than one range of values in a spreadsheet\nselected by DataFilters.", + "type": "object", + "properties": { + "valueRanges": { + "description": "The requested values with the list of data filters that matched them.", + "type": "array", + "items": { + "$ref": "MatchedValueRange" + } + }, + "spreadsheetId": { + "description": "The ID of the spreadsheet the data was retrieved from.", + "type": "string" + } + } + }, + "LineStyle": { + "description": "Properties that describe the style of a line.", + "type": "object", + "properties": { + "type": { + "enumDescriptions": [ + "Default value, do not use.", + "No dash type, which is equivalent to a non-visible line.", + "A custom dash for a line. Modifying the exact custom dash style is\ncurrently unsupported.", + "A solid line.", + "A dotted line.", + "A dashed line where the dashes have \"medium\" length.", + "A line that alternates between a \"medium\" dash and a dot.", + "A dashed line where the dashes have \"long\" length.", + "A line that alternates between a \"long\" dash and a dot." + ], + "enum": [ + "LINE_DASH_TYPE_UNSPECIFIED", + "INVISIBLE", + "CUSTOM", + "SOLID", + "DOTTED", + "MEDIUM_DASHED", + "MEDIUM_DASHED_DOTTED", + "LONG_DASHED", + "LONG_DASHED_DOTTED" + ], + "description": "The dash type of the line.", + "type": "string" + }, + "width": { + "type": "integer", + "description": "The thickness of the line, in px.", + "format": "int32" + } + }, + "id": "LineStyle" + }, + "CandlestickDomain": { + "type": "object", + "properties": { + "data": { + "$ref": "ChartData", + "description": "The data of the CandlestickDomain." + }, + "reversed": { + "type": "boolean", + "description": "True to reverse the order of the domain values (horizontal axis)." + } + }, + "id": "CandlestickDomain", + "description": "The domain of a CandlestickChart." + }, + "SheetProperties": { + "description": "Properties of a sheet.", + "type": "object", + "properties": { + "hidden": { + "description": "True if the sheet is hidden in the UI, false if it's visible.", + "type": "boolean" + }, + "sheetType": { + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "The sheet is a grid.", + "The sheet has no grid and instead has an object like a chart or image." + ], + "enum": [ + "SHEET_TYPE_UNSPECIFIED", + "GRID", + "OBJECT" + ], + "description": "The type of sheet. Defaults to GRID.\nThis field cannot be changed once set." + }, + "gridProperties": { + "$ref": "GridProperties", + "description": "Additional properties of the sheet if this sheet is a grid.\n(If the sheet is an object sheet, containing a chart or image, then\nthis field will be absent.)\nWhen writing it is an error to set any grid properties on non-grid sheets." + }, + "title": { + "type": "string", + "description": "The name of the sheet." + }, + "index": { + "description": "The index of the sheet within the spreadsheet.\nWhen adding or updating sheet properties, if this field\nis excluded then the sheet is added or moved to the end\nof the sheet list. When updating sheet indices or inserting\nsheets, movement is considered in \"before the move\" indexes.\nFor example, if there were 3 sheets (S1, S2, S3) in order to\nmove S1 ahead of S2 the index would have to be set to 2. A sheet\nindex update request is ignored if the requested index is\nidentical to the sheets current index or if the requested new\nindex is equal to the current sheet index + 1.", + "format": "int32", + "type": "integer" + }, + "tabColor": { + "description": "The color of the tab in the UI.", + "$ref": "Color" + }, + "sheetId": { + "description": "The ID of the sheet. Must be non-negative.\nThis field cannot be changed once set.", + "format": "int32", + "type": "integer" + }, + "rightToLeft": { + "type": "boolean", + "description": "True if the sheet is an RTL sheet instead of an LTR sheet." + } + }, + "id": "SheetProperties" + }, + "UpdateDimensionPropertiesRequest": { + "description": "Updates properties of dimensions within the specified range.", + "type": "object", + "properties": { + "range": { + "$ref": "DimensionRange", + "description": "The rows or columns to update." + }, + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `properties` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" + }, + "properties": { + "description": "Properties to update.", + "$ref": "DimensionProperties" + } + }, + "id": "UpdateDimensionPropertiesRequest" + }, + "SourceAndDestination": { + "description": "A combination of a source range and how to extend that source.", + "type": "object", + "properties": { + "source": { + "$ref": "GridRange", + "description": "The location of the data to use as the source of the autofill." + }, + "dimension": { + "description": "The dimension that data should be filled into.", + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ] + }, + "fillLength": { + "description": "The number of rows or columns that data should be filled into.\nPositive numbers expand beyond the last row or last column\nof the source. Negative numbers expand before the first row\nor first column of the source.", + "format": "int32", + "type": "integer" + } + }, + "id": "SourceAndDestination" + }, + "SlicerSpec": { + "description": "The specifications of a slicer.", + "type": "object", + "properties": { + "backgroundColor": { + "description": "The background color of the slicer.", + "$ref": "Color" + }, + "filterCriteria": { + "description": "The filtering criteria of the slicer.", + "$ref": "FilterCriteria" + }, + "dataRange": { + "$ref": "GridRange", + "description": "The data range of the slicer." + }, + "applyToPivotTables": { + "description": "True if the filter should apply to pivot tables.\nIf not set, default to `True`.", + "type": "boolean" + }, + "columnIndex": { + "type": "integer", + "description": "The column index in the data table on which the filter is applied to.", + "format": "int32" + }, + "title": { + "description": "The title of the slicer.", + "type": "string" + }, + "horizontalAlignment": { + "type": "string", + "enumDescriptions": [ + "The horizontal alignment is not specified. Do not use this.", + "The text is explicitly aligned to the left of the cell.", + "The text is explicitly aligned to the center of the cell.", + "The text is explicitly aligned to the right of the cell." + ], + "enum": [ + "HORIZONTAL_ALIGN_UNSPECIFIED", + "LEFT", + "CENTER", + "RIGHT" + ], + "description": "The horizontal alignment of title in the slicer.\nIf unspecified, defaults to `LEFT`" + }, + "textFormat": { + "$ref": "TextFormat", + "description": "The text format of title in the slicer." + } + }, + "id": "SlicerSpec" + }, + "CandlestickSeries": { + "type": "object", + "properties": { + "data": { + "$ref": "ChartData", + "description": "The data of the CandlestickSeries." + } + }, + "id": "CandlestickSeries", + "description": "The series of a CandlestickData." + }, + "HistogramChartSpec": { + "type": "object", + "properties": { + "bucketSize": { + "description": "By default the bucket size (the range of values stacked in a single\ncolumn) is chosen automatically, but it may be overridden here.\nE.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc.\nCannot be negative.\nThis field is optional.", + "format": "double", + "type": "number" + }, + "outlierPercentile": { + "description": "The outlier percentile is used to ensure that outliers do not adversely\naffect the calculation of bucket sizes. For example, setting an outlier\npercentile of 0.05 indicates that the top and bottom 5% of values when\ncalculating buckets. The values are still included in the chart, they will\nbe added to the first or last buckets instead of their own buckets.\nMust be between 0.0 and 0.5.", + "format": "double", + "type": "number" + }, + "showItemDividers": { + "type": "boolean", + "description": "Whether horizontal divider lines should be displayed between items in each\ncolumn." + }, + "series": { + "type": "array", + "items": { + "$ref": "HistogramSeries" + }, + "description": "The series for a histogram may be either a single series of values to be\nbucketed or multiple series, each of the same length, containing the name\nof the series followed by the values to be bucketed for that series." + }, + "legendPosition": { + "enumDescriptions": [ + "Default value, do not use.", + "The legend is rendered on the bottom of the chart.", + "The legend is rendered on the left of the chart.", + "The legend is rendered on the right of the chart.", + "The legend is rendered on the top of the chart.", + "No legend is rendered.", + "The legend is rendered inside the chart area." + ], + "enum": [ + "HISTOGRAM_CHART_LEGEND_POSITION_UNSPECIFIED", + "BOTTOM_LEGEND", + "LEFT_LEGEND", + "RIGHT_LEGEND", + "TOP_LEGEND", + "NO_LEGEND", + "INSIDE_LEGEND" + ], + "description": "The position of the chart legend.", + "type": "string" + } + }, + "id": "HistogramChartSpec", + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/histogram\"\u003ehistogram chart\u003c/a\u003e.\nA histogram chart groups data items into bins, displaying each bin as a\ncolumn of stacked items. Histograms are used to display the distribution\nof a dataset. Each column of items represents a range into which those\nitems fall. The number of bins can be chosen automatically or specified\nexplicitly." + }, + "UpdateValuesResponse": { + "description": "The response when updating a range of values in a spreadsheet.", + "type": "object", + "properties": { + "updatedData": { + "$ref": "ValueRange", + "description": "The values of the cells after updates were applied.\nThis is only included if the request's `includeValuesInResponse` field\nwas `true`." + }, + "updatedRows": { + "description": "The number of rows where at least one cell in the row was updated.", + "format": "int32", + "type": "integer" + }, + "updatedColumns": { + "description": "The number of columns where at least one cell in the column was updated.", + "format": "int32", + "type": "integer" + }, + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", + "type": "string" + }, + "updatedRange": { + "description": "The range (in A1 notation) that updates were applied to.", + "type": "string" + }, + "updatedCells": { + "description": "The number of cells updated.", + "format": "int32", + "type": "integer" + } + }, + "id": "UpdateValuesResponse" + }, + "WaterfallChartSeries": { + "description": "A single series of data for a waterfall chart.", + "type": "object", + "properties": { + "customSubtotals": { + "description": "Custom subtotal columns appearing in this series. The order in which\nsubtotals are defined is not significant. Only one subtotal may be\ndefined for each data point.", + "type": "array", + "items": { + "$ref": "WaterfallChartCustomSubtotal" + } + }, + "subtotalColumnsStyle": { + "$ref": "WaterfallChartColumnStyle", + "description": "Styles for all subtotal columns in this series." + }, + "positiveColumnsStyle": { + "$ref": "WaterfallChartColumnStyle", + "description": "Styles for all columns in this series with positive values." + }, + "hideTrailingSubtotal": { + "description": "True to hide the subtotal column from the end of the series. By default,\na subtotal column will appear at the end of each series. Setting this\nfield to true will hide that subtotal column for this series.", + "type": "boolean" + }, + "data": { + "$ref": "ChartData", + "description": "The data being visualized in this series." + }, + "negativeColumnsStyle": { + "$ref": "WaterfallChartColumnStyle", + "description": "Styles for all columns in this series with negative values." } - } - } - }, - "parameters": { - "callback": { - "location": "query", - "description": "JSONP", - "type": "string" + }, + "id": "WaterfallChartSeries" }, - "oauth_token": { - "description": "OAuth 2.0 token for the current user.", - "type": "string", - "location": "query" + "PivotGroupSortValueBucket": { + "description": "Information about which values in a pivot group should be used for sorting.", + "type": "object", + "properties": { + "valuesIndex": { + "description": "The offset in the PivotTable.values list which the values in this\ngrouping should be sorted by.", + "format": "int32", + "type": "integer" + }, + "buckets": { + "description": "Determines the bucket from which values are chosen to sort.\n\nFor example, in a pivot table with one row group & two column groups,\nthe row group can list up to two values. The first value corresponds\nto a value within the first column group, and the second value\ncorresponds to a value in the second column group. If no values\nare listed, this would indicate that the row should be sorted according\nto the \"Grand Total\" over the column groups. If a single value is listed,\nthis would correspond to using the \"Total\" of that bucket.", + "type": "array", + "items": { + "$ref": "ExtendedValue" + } + } + }, + "id": "PivotGroupSortValueBucket" }, - "$.xgafv": { - "type": "string", - "enumDescriptions": [ - "v1 error format", - "v2 error format" - ], - "location": "query", - "enum": [ - "1", - "2" - ], - "description": "V1 error format." + "DeleteDeveloperMetadataRequest": { + "type": "object", + "properties": { + "dataFilter": { + "description": "The data filter describing the criteria used to select which developer\nmetadata entry to delete.", + "$ref": "DataFilter" + } + }, + "id": "DeleteDeveloperMetadataRequest", + "description": "A request to delete developer metadata." }, - "alt": { - "default": "json", - "enum": [ - "json", - "media", - "proto" - ], - "type": "string", - "enumDescriptions": [ - "Responses with Content-Type of application/json", - "Media download with context-dependent Content-Type", - "Responses with Content-Type of application/x-protobuf" - ], - "location": "query", - "description": "Data format for response." + "CandlestickData": { + "description": "The Candlestick chart data, each containing the low, open, close, and high\nvalues for a series.", + "type": "object", + "properties": { + "highSeries": { + "$ref": "CandlestickSeries", + "description": "The range data (vertical axis) for the high/maximum value for each\ncandle. This is the top of the candle's center line." + }, + "lowSeries": { + "$ref": "CandlestickSeries", + "description": "The range data (vertical axis) for the low/minimum value for each candle.\nThis is the bottom of the candle's center line." + }, + "closeSeries": { + "description": "The range data (vertical axis) for the close/final value for each candle.\nThis is the top of the candle body. If greater than the open value the\ncandle will be filled. Otherwise the candle will be hollow.", + "$ref": "CandlestickSeries" + }, + "openSeries": { + "description": "The range data (vertical axis) for the open/initial value for each\ncandle. This is the bottom of the candle body. If less than the close\nvalue the candle will be filled. Otherwise the candle will be hollow.", + "$ref": "CandlestickSeries" + } + }, + "id": "CandlestickData" + }, + "DeleteProtectedRangeRequest": { + "description": "Deletes the protected range with the given ID.", + "type": "object", + "properties": { + "protectedRangeId": { + "description": "The ID of the protected range to delete.", + "format": "int32", + "type": "integer" + } + }, + "id": "DeleteProtectedRangeRequest" + }, + "InterpolationPoint": { + "description": "A single interpolation point on a gradient conditional format.\nThese pin the gradient color scale according to the color,\ntype and value chosen.", + "type": "object", + "properties": { + "color": { + "$ref": "Color", + "description": "The color this interpolation point should use." + }, + "type": { + "enumDescriptions": [ + "The default value, do not use.", + "The interpolation point uses the minimum value in the\ncells over the range of the conditional format.", + "The interpolation point uses the maximum value in the\ncells over the range of the conditional format.", + "The interpolation point uses exactly the value in\nInterpolationPoint.value.", + "The interpolation point is the given percentage over\nall the cells in the range of the conditional format.\nThis is equivalent to NUMBER if the value was:\n`=(MAX(FLATTEN(range)) * (value / 100))\n + (MIN(FLATTEN(range)) * (1 - (value / 100)))`\n(where errors in the range are ignored when flattening).", + "The interpolation point is the given percentile\nover all the cells in the range of the conditional format.\nThis is equivalent to NUMBER if the value was:\n`=PERCENTILE(FLATTEN(range), value / 100)`\n(where errors in the range are ignored when flattening)." + ], + "enum": [ + "INTERPOLATION_POINT_TYPE_UNSPECIFIED", + "MIN", + "MAX", + "NUMBER", + "PERCENT", + "PERCENTILE" + ], + "description": "How the value should be interpreted.", + "type": "string" + }, + "value": { + "type": "string", + "description": "The value this interpolation point uses. May be a formula.\nUnused if type is MIN or\nMAX." + } + }, + "id": "InterpolationPoint" + }, + "FindReplaceResponse": { + "type": "object", + "properties": { + "rowsChanged": { + "description": "The number of rows changed.", + "format": "int32", + "type": "integer" + }, + "sheetsChanged": { + "description": "The number of sheets changed.", + "format": "int32", + "type": "integer" + }, + "formulasChanged": { + "description": "The number of formula cells changed.", + "format": "int32", + "type": "integer" + }, + "valuesChanged": { + "description": "The number of non-formula cells changed.", + "format": "int32", + "type": "integer" + }, + "occurrencesChanged": { + "description": "The number of occurrences (possibly multiple within a cell) changed.\nFor example, if replacing `\"e\"` with `\"o\"` in `\"Google Sheets\"`, this would\nbe `\"3\"` because `\"Google Sheets\"` -\u003e `\"Googlo Shoots\"`.", + "format": "int32", + "type": "integer" + } + }, + "id": "FindReplaceResponse", + "description": "The result of the find/replace." + }, + "DuplicateFilterViewRequest": { + "type": "object", + "properties": { + "filterId": { + "description": "The ID of the filter being duplicated.", + "format": "int32", + "type": "integer" + } + }, + "id": "DuplicateFilterViewRequest", + "description": "Duplicates a particular filter view." + }, + "UpdateConditionalFormatRuleResponse": { + "description": "The result of updating a conditional format rule.", + "type": "object", + "properties": { + "oldIndex": { + "description": "The old index of the rule. Not set if a rule was replaced\n(because it is the same as new_index).", + "format": "int32", + "type": "integer" + }, + "newRule": { + "description": "The new rule that replaced the old rule (if replacing),\nor the rule that was moved (if moved)", + "$ref": "ConditionalFormatRule" + }, + "oldRule": { + "description": "The old (deleted) rule. Not set if a rule was moved\n(because it is the same as new_rule).", + "$ref": "ConditionalFormatRule" + }, + "newIndex": { + "description": "The index of the new rule.", + "format": "int32", + "type": "integer" + } + }, + "id": "UpdateConditionalFormatRuleResponse" }, - "access_token": { - "description": "OAuth access token.", - "type": "string", - "location": "query" + "ConditionValue": { + "description": "The value of the condition.", + "type": "object", + "properties": { + "relativeDate": { + "enumDescriptions": [ + "Default value, do not use.", + "The value is one year before today.", + "The value is one month before today.", + "The value is one week before today.", + "The value is yesterday.", + "The value is today.", + "The value is tomorrow." + ], + "enum": [ + "RELATIVE_DATE_UNSPECIFIED", + "PAST_YEAR", + "PAST_MONTH", + "PAST_WEEK", + "YESTERDAY", + "TODAY", + "TOMORROW" + ], + "description": "A relative date (based on the current date).\nValid only if the type is\nDATE_BEFORE,\nDATE_AFTER,\nDATE_ON_OR_BEFORE or\nDATE_ON_OR_AFTER.\n\nRelative dates are not supported in data validation.\nThey are supported only in conditional formatting and\nconditional filters.", + "type": "string" + }, + "userEnteredValue": { + "description": "A value the condition is based on.\nThe value is parsed as if the user typed into a cell.\nFormulas are supported (and must begin with an `=` or a '+').", + "type": "string" + } + }, + "id": "ConditionValue" }, - "key": { - "type": "string", - "location": "query", - "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token." + "DateTimeRule": { + "description": "Allows you to organize the date-time values in a source data column into\nbuckets based on selected parts of their date or time values. For example,\nconsider a pivot table showing sales transactions by date:\n\n +----------+--------------+\n | Date | SUM of Sales |\n +----------+--------------+\n | 1/1/2017 | $621.14 |\n | 2/3/2017 | $708.84 |\n | 5/8/2017 | $326.84 |\n ...\n +----------+--------------+\nApplying a date-time group rule with a DateTimeRuleType of YEAR_MONTH\nresults in the following pivot table.\n\n +--------------+--------------+\n | Grouped Date | SUM of Sales |\n +--------------+--------------+\n | 2017-Jan | $53,731.78 |\n | 2017-Feb | $83,475.32 |\n | 2017-Mar | $94,385.05 |\n ...\n +--------------+--------------+", + "type": "object", + "properties": { + "type": { + "type": "string", + "enumDescriptions": [ + "The default type, do not use.", + "Group dates by second, from 0 to 59.", + "Group dates by minute, from 0 to 59.", + "Group dates by hour using a 24-hour system, from 0 to 23.", + "Group dates by hour and minute using a 24-hour system, for example 19:45.", + "Group dates by hour and minute using a 12-hour system, for example 7:45\nPM. The AM/PM designation is translated based on the spreadsheet\nlocale.", + "Group dates by day of week, for example Sunday. The days of the week will\nbe translated based on the spreadsheet locale.", + "Group dates by day of year, from 1 to 366. Note that dates after Feb. 29\nfall in different buckets in leap years than in non-leap years.", + "Group dates by day of month, from 1 to 31.", + "Group dates by day and month, for example 22-Nov. The month is\ntranslated based on the spreadsheet locale.", + "Group dates by month, for example Nov. The month is translated based\non the spreadsheet locale.", + "Group dates by quarter, for example Q1 (which represents Jan-Mar).", + "Group dates by year, for example 2008.", + "Group dates by year and month, for example 2008-Nov. The month is\ntranslated based on the spreadsheet locale.", + "Group dates by year and quarter, for example 2008 Q4.", + "Group dates by year, month, and day, for example 2008-11-22." + ], + "enum": [ + "DATE_TIME_RULE_TYPE_UNSPECIFIED", + "SECOND", + "MINUTE", + "HOUR", + "HOUR_MINUTE", + "HOUR_MINUTE_AMPM", + "DAY_OF_WEEK", + "DAY_OF_YEAR", + "DAY_OF_MONTH", + "DAY_MONTH", + "MONTH", + "QUARTER", + "YEAR", + "YEAR_MONTH", + "YEAR_QUARTER", + "YEAR_MONTH_DAY" + ], + "description": "The type of date-time grouping to apply." + } + }, + "id": "DateTimeRule" }, - "upload_protocol": { - "location": "query", - "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").", - "type": "string" + "HistogramSeries": { + "id": "HistogramSeries", + "description": "A histogram series containing the series color and data.", + "type": "object", + "properties": { + "barColor": { + "description": "The color of the column representing this series in each bucket.\nThis field is optional.", + "$ref": "Color" + }, + "data": { + "$ref": "ChartData", + "description": "The data for this histogram series." + } + } }, - "quotaUser": { - "location": "query", - "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.", - "type": "string" + "Spreadsheet": { + "id": "Spreadsheet", + "description": "Resource that represents a spreadsheet.", + "type": "object", + "properties": { + "properties": { + "$ref": "SpreadsheetProperties", + "description": "Overall properties of a spreadsheet." + }, + "spreadsheetId": { + "type": "string", + "description": "The ID of the spreadsheet.\nThis field is read-only." + }, + "namedRanges": { + "description": "The named ranges defined in a spreadsheet.", + "type": "array", + "items": { + "$ref": "NamedRange" + } + }, + "developerMetadata": { + "description": "The developer metadata associated with a spreadsheet.", + "type": "array", + "items": { + "$ref": "DeveloperMetadata" + } + }, + "sheets": { + "description": "The sheets that are part of a spreadsheet.", + "type": "array", + "items": { + "$ref": "Sheet" + } + }, + "spreadsheetUrl": { + "type": "string", + "description": "The url of the spreadsheet.\nThis field is read-only." + } + } }, - "prettyPrint": { - "type": "boolean", - "default": "true", - "location": "query", - "description": "Returns response with indentations and line breaks." + "BandedRange": { + "description": "A banded (alternating colors) range in a sheet.", + "type": "object", + "properties": { + "rowProperties": { + "$ref": "BandingProperties", + "description": "Properties for row bands. These properties are applied on a row-by-row\nbasis throughout all the rows in the range. At least one of\nrow_properties or column_properties must be specified." + }, + "columnProperties": { + "$ref": "BandingProperties", + "description": "Properties for column bands. These properties are applied on a column-\nby-column basis throughout all the columns in the range. At least one of\nrow_properties or column_properties must be specified." + }, + "range": { + "$ref": "GridRange", + "description": "The range over which these properties are applied." + }, + "bandedRangeId": { + "description": "The id of the banded range.", + "format": "int32", + "type": "integer" + } + }, + "id": "BandedRange" }, - "fields": { - "description": "Selector specifying which fields to include in a partial response.", - "type": "string", - "location": "query" + "AddChartRequest": { + "description": "Adds a chart to a sheet in the spreadsheet.", + "type": "object", + "properties": { + "chart": { + "$ref": "EmbeddedChart", + "description": "The chart that should be added to the spreadsheet, including the position\nwhere it should be placed. The chartId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of an embedded object that already exists.)" + } + }, + "id": "AddChartRequest" }, - "uploadType": { - "type": "string", - "location": "query", - "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\")." + "HistogramRule": { + "type": "object", + "properties": { + "start": { + "description": "The minimum value at which items are placed into buckets\nof constant size. Values below start are lumped into a single bucket.\nThis field is optional.", + "format": "double", + "type": "number" + }, + "end": { + "description": "The maximum value at which items are placed into buckets\nof constant size. Values above end are lumped into a single bucket.\nThis field is optional.", + "format": "double", + "type": "number" + }, + "interval": { + "type": "number", + "description": "The size of the buckets that are created. Must be positive.", + "format": "double" + } + }, + "id": "HistogramRule", + "description": "Allows you to organize the numeric values in a source data column into\nbuckets of a constant size. All values from HistogramRule.start to\nHistogramRule.end are placed into groups of size\nHistogramRule.interval. In addition, all values below\nHistogramRule.start are placed in one group, and all values above\nHistogramRule.end are placed in another. Only\nHistogramRule.interval is required, though if HistogramRule.start\nand HistogramRule.end are both provided, HistogramRule.start must\nbe less than HistogramRule.end. For example, a pivot table showing\naverage purchase amount by age that has 50+ rows:\n\n +-----+-------------------+\n | Age | AVERAGE of Amount |\n +-----+-------------------+\n | 16 | $27.13 |\n | 17 | $5.24 |\n | 18 | $20.15 |\n ...\n +-----+-------------------+\ncould be turned into a pivot table that looks like the one below by\napplying a histogram group rule with a HistogramRule.start of 25,\nan HistogramRule.interval of 20, and an HistogramRule.end\nof 65.\n\n +-------------+-------------------+\n | Grouped Age | AVERAGE of Amount |\n +-------------+-------------------+\n | \u003c 25 | $19.34 |\n | 25-45 | $31.43 |\n | 45-65 | $35.87 |\n | \u003e 65 | $27.55 |\n +-------------+-------------------+\n | Grand Total | $29.12 |\n +-------------+-------------------+" + }, + "UpdateProtectedRangeRequest": { + "id": "UpdateProtectedRangeRequest", + "description": "Updates an existing protected range with the specified\nprotectedRangeId.", + "type": "object", + "properties": { + "protectedRange": { + "description": "The protected range to update with the new properties.", + "$ref": "ProtectedRange" + }, + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `protectedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" + } + } } }, - "version": "v4", - "baseUrl": "https://sheets.googleapis.com/", - "kind": "discovery#restDescription", - "description": "Reads and writes Google Sheets.", - "servicePath": "", - "basePath": "", - "id": "sheets:v4", - "documentationLink": "https://developers.google.com/sheets/", - "revision": "20191105", - "discoveryVersion": "v1" + "protocol": "rest", + "icons": { + "x32": "http://www.google.com/images/icons/product/search-32.gif", + "x16": "http://www.google.com/images/icons/product/search-16.gif" + }, + "canonicalName": "Sheets", + "auth": { + "oauth2": { + "scopes": { + "https://www.googleapis.com/auth/drive": { + "description": "See, edit, create, and delete all of your Google Drive files" + }, + "https://www.googleapis.com/auth/drive.readonly": { + "description": "See and download all your Google Drive files" + }, + "https://www.googleapis.com/auth/spreadsheets.readonly": { + "description": "View your Google Spreadsheets" + }, + "https://www.googleapis.com/auth/spreadsheets": { + "description": "See, edit, create, and delete your spreadsheets in Google Drive" + }, + "https://www.googleapis.com/auth/drive.file": { + "description": "View and manage Google Drive files and folders that you have opened or created with this app" + } + } + } + }, + "rootUrl": "https://sheets.googleapis.com/" } From 4121f39ba66ffbaeab9bf7c4bdc5a2264040e6ba Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Wed, 20 Nov 2019 17:02:28 -0800 Subject: [PATCH 08/28] Make some "tidy" schemas available as internal data --- R/sysdata.rda | Bin 42127 -> 42693 bytes data-raw/discovery-doc-prep.R | 23 +++++++++++++++- data-raw/schema-rectangling.R | 50 ++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 data-raw/schema-rectangling.R diff --git a/R/sysdata.rda b/R/sysdata.rda index 9cb1e51989b49ef08e486194ba401e3ea7000dbf..c88295fa2a509d0a17c9afdc3b801d501e706496 100644 GIT binary patch literal 42693 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 literal 42127 zcmV)MK)Am`T4*^jL0KkKSphbF&jDnY|NsC0|NsC0|NsC0|NsC0|Nnh`-~avX@2G$O zTHl$bsVm^^{`bnaTI_2+A5Z`Q2KRcOeBsgsCZ0I%&A#;3_gl2S-DR#dy8CHww&t_m zf$qFmy_?%rK6ky|@Mu(pTM?|_4Gwi(ue^Z|RClj^uK`s--GhyT2W?Z)uT3;&*1$gP z*)+AS0c#lm+YgXFj+O7bTm?`XZD)DT>AuqNoIdb|=^X9V?HE(Vnt< z*y%25w@v^64=oBB9_!Eng03xgtOSZQG7a_|o!@uf`CZny_jL(hd)^+p9nDHQ9Xf9F zz7=0!^-XI)05`L$A6*WgG>liz09~_5x7)hwhc?uUZ)aT3Yr5bGS3B%?p1#iHwG8#U zHm#NDZrA|y0*r`5vn_Rpyz%u&s``C%n|2u6D_yel#~RhmiZ!o$yU%+rXnETt8u9no z^`7fG%Q$W{cSQTz-iakQm!R%BI-&sEZ?3DTY)l%^001dlyPS3JdEMPf)npShUAy3q zI3f+DvrBJa8=226?-a0YVVjp+U6@x6l7t8&yB!1XYucy`<*8 z%{}hwv=j}q000e>4WCRwCt+j*S3B(}Qj!!>O1))KTesWYzN_jp>#AKI-Oin_vX`J4 zDya7L)4SKZxDR?)y_?S2r3P*9cK~|PhPZa+Sg4~ zGz7u`Oa#fJBR~xR4HE=3X_1f(CIX+R!e|0*O{qUndZS_*Pf7ZK(J*N=)6~E;XlR)| zG}L-%2~7eBK?D(`WCUdyG*462JQVbrX^3JlGyu?O4FMPth-72{3?={xf*6=4011K^ zn3`cAkqAu?k*TTbc&DlDRDMcm#LXINHWO26Fq=S|NYf#qgkT83fG`MP2*3a)A*KMD zX^?5A2*3~_D3TJVlPROoDe7-cD9P#SjMUjpG3uU?>TO4;(?HWe05lC64H_7k00000 z00000000001Sv=fga~L6h{)A9sXQZ6c~kOXPbQ|(qJ#AhNP4HHOo^FK)fmtbv=9IQ z003xc8W;(P#40000000000?K=2?;OeAdC6Xjnv{gjc3XLcr1t~%SNFt;22pv!r#gG&Xi=d-% z5E}rh(ui8X0+tk1&fYnPqRJK_; zARy;CQ9(A!gNF`L13AhdM5@1~xA#H&PGPAOF#XA2o%$bpN1Mt03UEJ2Mm&DMfz_E6 z@lY1wisPmRK~$9>86}DWlA!(a26mc*JVvr1%uI-*#VMLbG*Cp8P@80=_8}Dafc%I~ zpnkCfXL1IJ9FQpj5b&U8s;Q`i4I&2phk6@z6kf>PH4TlUB1yIuMu?gkLWrU%BC1)I zD4M2)qL!i)_bW3+6Dd&4)9>QQgm_~$ui$I7Uwgelj5Z#qcjyNP`!srs>Z-oNziTkm0!jDKOR<3$mStO0Z z>KTSfB1zy-RozutUL<4*nOMqrWv((LJX)m0_LWyq)0#ce&7(2t!z5uOx$fRBH@Z`v zO=~&hl-edob*^M_z=Fxbu*{|v$n1+aIJvgm+}pO6Ska6QN|dQ2?1YmmUYVHN0Yf%s zR#20>tZL3g4Q zdWlMJ7^;NnQW_!G^uxLm%6H>)fmUJOrW7-ZF(x-Zy8A0DUpFGo-JItaaEBo~_P)!d zbRjGJv6-DHmv_}qciKDJ<+X|`7tw%++{G;%xoE%WmEf1YIL#tEy&dsq;ipU6ikTfJ zdvCyQX03DYRlusP>pAHDreN`{^7=h|*E5ee$!7OGt8c5_#LP!|sKaJoNj7r7r1#dQ zhx}Td8>cQw-i2RK325cM-1-$9_L*_xcqn7aNSoeJZ4T097f&h z-SL;|rXAj`@Q|Yr_?&U)S9Fv3?r+{(;2h!{Q_SpCFhcGpZ&X)pnuJ@f|IGY*Zn@(; zaQq47;ueH<8Eu2 zGFM`2>71pe0rI|ja}ys=j(%&~)4Xpo_awuWt;{6-t}FLyV-cu>CJL1|DRy8Yls*hJ z+?0~vomw&Ohk$kh7b&B(JXVk0a7+j#Kl4wy+g7@XESID}{7iAx8HkbP{xNDF%{e{y zY@^M$(>^=N)W02Z!`Bke?)bZcGM!;&0w&0Kc#jrEdfzcZg)sK{D2;v8D%G2(lfeJe zUc#$5`X?1n*B95l_gtr_?-Sfj)eD2P@xuX|#!+Q33sE?KqT0PH_+*)O?{IU|uP^u3 z(&;`Qm?W7{u~9SZCYSaK9$n?t^HjU%1?OJL_Lj=AY3`;(rFwqzgS3@T#*S}(y|G-X z*UOsUzGCO`d)IeQB8YP=yC|bd8|BS({oVVnpwDYyJi-DVSgvqeVuVDwVlbHoIAL{> z0wC<&nsp#RB5jdT(2c>qn+V%fVvNEvDl!y&5+a0TNG*dcv*M_q5~!YV=~?8Qq{;^g zO^~V~C_)Udg{?%~g-WuJv|E1Jx!sZ7!OeiSKNvq4e>5U43>Xy;qEUG9!XdU5QHc=| z+W-I#?vRyRl+}k>`q?r`lTFy%`4mEl-HD`{7g|S$ubnbVU zVk-KotBH$K@s4=MYU1;h{AM!`JzXx9MZ1bQcf_%!du7$zf>ruW`b@(&BtcUI&ayVj z$kdWBY?D@*GL!T2CxgN3BV%-gkp;Dq%(A?iVRZF%BxSIpqih*rY_71Zmn|4G7(gYF zjkcQ=9VOp5cbPTXt4WB}u|un1FyoQOkWu59^zKNSlQJ2praEfd9D#KM6V#fpj;A#W z>sZ8Ak~a_+*6N|;XV-Ub@TklQQA6Z+xY7qo+iR5@k7VKplc>65P0ud(mu}4kYiC4r zCT$zJeBrj?>gkH76zJBA5hjfVvu^a-_3Li$A~FT&=GrW06LWKwjWKg$mbG)cmrZR& z8#@@)pxbX)-b87JK#oSp?39FrY=j-Q!VHAl8-_G(ZWl3}?ZWWZ<;t3%NSXxrKtF=X znQX9i1PO2YDC`IGtNj*!Smd4EGLz=d5xLN!^_z z$$2VJXblHD(M z60a(XyPfYPTTD^J_7Wa|gGi6K2hxOi!W$tpvR8xwwgku>Py<0l1r$(?3Ft^P2kvl( z1buj3o_P%PCzmkQiH{i?9Nh|5w~*6mo~P*B$o01`ZS|r^sEU|sstTg23W%hNr7EL% zyrY7LA}RQTaAnG716R z5P4uos9bbLQbz)PuY>GD+!sB8VW+h@hTWf`EiT{e%v%RKh=0C{VS;h1IExg&}tS%vTB4n`P#JQMN7bYoi;QPGcVq}xUA#U#a%J`=L6{N| zk}pC8iG)ZH6x6{&c>s>xdyqR2Fnw$NjdB#=fqeU)CMPEh@~jGJM1vU!GDOV;L={m5 zMAA^DF$6S{1rbRyU7S%+QK3v)oZ^gFZU(~@Fwt0Xf}$dtD64+MKn5gsDsT%!5F^>@ zAyic=L_9Z8Adol+g@qm%04}IpR^pi`cTg;NInJ)HS0WOz5zrX^oXa4REKw@8kLzE; zktC4r*4hZT_hfsZj6e#CJ$;qZfsV8YiVZQbH=`_RN5|NBQNfEv$L)E87#9)yet#5i zeV^yunAfX+0AiRMDq{^ZX5#Lol1miL384M@;k>r5P+i8tnF+UyUYW>s{atoIzJYCo zK!s)3?`^hltdUX9cy!C|Y=E7(`7M)@Qb|P_b?f_+0Fp+FSD9R420kWKrG4@iTnkeO zmq5zOB`VQ%VS%J8k;sgQNF}v$^q0^O637`Kjbe39oZ>v)Ih~sKb0(f0xOei~YMx$~ zYxQR`i21m2`F^js`={H}9sOxg>KV}xz68(0&b8;BIBe<9sYe8YH&wBdA&mlf$VQYv z?hWiAWDO806QvQyaxJfXR#?vamo`P>yJ@~AjG>Zd+YSSXkcAc2zkct#&sYlLU}whLS}Bo-dYM$(+HM~6_nd+m{FaYd3QIjpdvBA zB`~2rG6QC`sxyGV-%Qt1zJ0MT9+dRJV!8D=V$)haUoX4s``<5~!|$Tv@Mv#1{iGf` zuHGTn;)%aS@9IXragA^H@Y)8C&ETdW=EF`P&>9pr=K<0%>p@zrNh55ov`AVvThM|9 z8Qvgn%{@4Qp6$siy~m+$L4>8J$nSI8Nys@puJ1Z|c4P>lIU&f`InHg9V-6yL)oO^V z#e1=Ppr;~`rK$qr25~t9Ve&NBGDsSYM3jY5LwuAUfi_eri2|~A_Y`1M=n#i!VAT+U z1C_K!^IYh)Ru?cSGsc$VkCZO+&M?&J}c@U*8{2$Q#ZR6)566#?+PQ!6|z6G+|-wt4B)3F`}*e7eiIThDz%X5WkrC zYcAM|B%GecOJE}Qtrj3ne=1pT-Y>lO<;lT1kgXtB5pXsJn$y8-R^-NZHKePVUSc^H zF4HMu)h{Kih86}Rq~@OAQK50#DZ9f#Xqm!7t>2a}68=9ny`1^?ZQp~%Ngsg{y94)7 z?+O?WjeS2Ho&P-BCCGxH#5r+AS3C#rh!NiXLdc9|#x@gcbGR&_M~n#-a)3qwAnX2|j5T zKm}w745LFWm1rXn*u*y(HNG`#sY4Bh<%%Mt99|I$x ze=HP0Q_!LSjEsVUg&+{1h=KX?3Hs3(5G0T$6=_jQ0avn%i4lSrfF)K05nlWtppWK+ zXvze_Q3WXiY)L>?098pv01w#lzLnAe4)H@mg-{B!3rZxg zpdcar%p#$hf-pd(6h6csdFG$mVZPR~NPbd@-LzqI=qU0_%cA-SrJ*4|CRgl!9@}GM zX{v3sk?|j^{Xt`=>If(*ixIJdH^<%Q3M;vN;`-0WLzTefAJRoPb8^YaYnH}LOnu?{ z&HA_bO+9#TJd%cLywdlR4Rjt;f@K37$8Vb3IWAIo73{Cn?a*uimi(-30q#SOsi!QEcj}JnhyE#=Ku_II606E0kD( z-n-?!XKBz!C2fQk|4TVtSshNY+vl`#{e8H%hN(E?rK& z+U{p%#C`RUPmz^H6Cg=|0ErO@Bt6t+5Ec0#6as(%C;^EAAxc7oS`v|YDEFjm{Lkm6)Cp$3qrKRNZaPl-W>l?Z*C1`_}-wgem&*cs3B;_N4 zfW<~XM-syP`S8!5rptiG=i+rER%WDSDhB!qNeif7o8N%r^O+m&bLLXlRo?f3zfBB9jwBB)4OFfdMe8y5U|4<+xdvOWEnPX;sxW3>Cpw zh?v60VM5&FAT0(9HH;XnLj6U!yv^7<_pD#BTep4GFs-rHNM;r42uVD$Tb5a48`8pA zWtK90rymxT1BB&VOqy$NNpAOm=6pC$EOZ*Oh&Qwb%cD1oPBo8 zS;^7Goe(~>{|g!Op#baNv+hZy3Rr zwQ}o>+HZuMq9~eltHELxKZw3mDd}z)zVX!D{qmY~oDm8%0xd0i=#~#L5ED zkmzWE_*ixU&AV2W5Y>Y(luAfgQ3-;mB&*^unyI40i?T~`+#OlICqmZY<@MZiP3ks5 z8kOC{WhUZ8T(e>e7H}>vJG^Lo;m3%AbQ2lQT&hOZs1=+Lt#s63VFOZa5oRupcBYxf zXg!=D5qovjwPc@$BMwiSX`i3ea~7A&IA&iLZu}1>PGEvH=2{rEr_Rq5FlIy^ zoIMJ>oQ*+*Dj0;;%S_#_4ktHlG<#=ZAINC&yERQ(wgPc!OwQG?ri=-vuNT-f1c&f; zE|7VPbCGK^zl(Mby3e{EZYc8fX>9D@Y%vE$_AS(*d~Xob#p0H=WF`W=+9Dd;o}67~64&r?H@qq8=^|BIsn|E%+uoitq{dv87 zJ3`5h+{75sjt6XrY;}4bh0s1WhIOXFp@8u$2k+=_2gAG z<#y+YeBo;E+p4Qw{!T+Nb#^L8Z!6+qYlvPriC7_^Vd2s_3z^7$y#n#R&W2>Ws>z)u z0y@Vl=rIU03G)tYNfIQbdQ|%JzauKoz8kc&9bjp*0$jOa1G|seI#AfxSo4OnxT86h zU1Jh}PUab*Hv*7nbUD_of|5;fU$UMLqq0opJr}V#=#`;lwwE1AVMkRcV3QZM+kHYw_Pp-KM*57`{&DwMWb~7nc}mdG@wITI`4v^AH`K`AlU7(9s%$!r7eBFZJ=l z8JqVF>*lK|nAbAAX(fp0%~gq}$V9MVgFNPftXv+v<(ZDzaPisLZ0CM_Od2!6A^w2>u>IK}#ycZta{l8^e zh&^rBKMI=R5AE={Ei^Sp6#e&%TjdOeZXNBZj`sW*CmPM?Dy7y5Y>33_N}=3828lvG z&xgT)x$c;?y}!`+zpis`)!c5_F6{Qa?yGCkA41X~{%6sZhNj^tn~#@9fM7U2{Y~RF zU3L)%sqi}OUg6*N{8sAR`GN#)H+*6H@M{h!3D#|>7jFhkY{J%-r=A^<>4tq(naAOr zEG}t`P&)96tBOcTgqNi1T|a);SiHhoZ>~}B^PIowT#>`Z_I|_cY6}y4WcJXLVBWF9hmp6EMdk$ZR(g< zn?{voG<#1Ob(nWaiAiT$5)?B66`rw>;##4!Gw!@3ibl-#a&FHD21r9GuJZQo2(BXy zC2;0g^AS^SUR-db*kCN<0=;q3&Y17R;Tc8-k+m|=ZTtNQjNiC3;ib<^@3Jq$S%?wt zEQy=KXCz>BnS;II&Xl&jPQ|!$Pd!`Scqlg-zAUKurbI41(Rwj^*@GM+rxx=%rlb$L1X8}@%1KIb6$T3UPJ}bezxuqhWZBsKJi)76mOGgat$$Vm9H_LbWHm;mEyF++x zVo4^rg%k_Z5^0N1r+N(N;DPN39igzA@_yf$Z=pM|D^9kX5#(m^co$u>FvQo-zylD# zPNko3-VAe{Mw~-wyKLF<#I|zI7?WoB<6JM%u;+aDa$M6|;}@oF9n$ut9T=@ay&)<{ zP85u%5Fk$tg}b*30OSW`4f~5;9s5H0?de4v`+ULl9I1njMHA(@GC#LeUYyA{m*C7# z)6FXl4EK57X`~v2XN2oHOmLWNcaORWGj1O+S%)VseY8z>w$H4PTkn~?_tCY3Uk^Z+ z6d}U~-S#P{BksDlHn2mrI?$EpW8UZY3cx2tA$qVO33JG+_EsY$JJgVKBUM zIqDG4ET6>L&HFuK7PR{uxR)F z*3tU(#R9FGg%XWg2NLnmqdN{}B4sl?{dsvWkr%huyLGk!BY%CvG|6o> z3tBUwv1i;cdPvgS84YLL6nBF6!2@OZ5rIp0`|JbXfgQSMFrJlELnbx5Qsm`Ho| zZd>npE7HeDf7a*mDNXZTyLx+iSMOHzk57TVWwObG0kN&KCxtp3o9-%3wx}I4#rjT* zc4XSDN&5uTq}C4A^*HIEe+R@Lzf}E z{a8MU*R+_Wt1RKN&kQCdH^OBexz`J&9qiU$i{=kw7GV;pnOq3`I+gd~#}BA-ce-qn z?riTrd*?%WzAvx6dhy0|-1Oq(w!B9+P&%)-n&{$#j2Z3vtOqz{3!GXWvv-C9sKje6 zXKyx~Yua?|ReHoMHBoq|xxC8Lgou$2<07F`LPFomCI(2l)y8eBkPu%69*NrpQe_NC z#Rz-t1@NY!B+xqmr1mJ1C0PtVu``wJCperlU|MfHM*?(&tY-V?$G)!242D34=@ABM z8E`wDo-xc7ID_h2bsCHF&H}@exkWB&We>Cr*(*}rWu*iFJ<#GToqklc3? zNVIS~;$MZ{F5@?I#<|L0gGY=Mc6Mt`Xu{<)rj)EgVV=ly;%2(2K9g6%7Zmw^=#Par z)WmJ3hH0z>_Kzkr=U054r}YtoE?y7?Y~mSWQ!?-*i7bEBxG zS!pdh5+?c$4K_)h$W&hGEfUSvuzVo@r^h+ry4y3D#7-6#DO>{Z*$s4RR<|<$aY@2${h#0A=;Zkp+pD9t-TRk4*M~j1Kjw0FgP|qOolXvP}&S(QZo7|k&l`V=-Dkw8_r>% zNRyPO)amxyr5yDUh3a3{8Z^Nv9Q+}pd2=0vtkWaLX zA<_tB%>yXmR-G<^iwkB5LmhzhkE?&R#ZjF6^Y-$2!#dJ@C|VeSgOA$37R@+}A3rV5 zUw&=A{)P>*2t1~4NC=o|dw+s1Sr_@f&NWVeK$*wEA6LgvU)pmrk(lB&nGv2-v$xK) z*-e(h(gyWlf_9|mmAtn3U2&pZDKO#`X)8>zcxh9!md$6FoH6l2qssj0i9>t+j0RIL zIBT*G6!Y4gc5(bCLROUGqpSMRd!s3E=@U+QmqSCDV|De~FCTmOUkDlr@~=Zc(@nc! z;0ihpO`><9thG+LMejkbj~ks#;W@9v(%$6UK761(nI0(KIVlwL@RZb!`JwCbv~Zut zq6w1PB=aaW?M(*otE_bc0KZ%MU(5O|2L>`fwwMTxSPyWtb9c)D?!ag8{C@378AwOP z20^9UJ;Z8Zyj4Bq zbmxzfh(^#1^gwL^U{(bjYc3#a@{B=i?-+YwX#r6&F;FT2F-|kNinjxaY5FKxAUca- zpH9G5+)$T&XU}I3TX7rD6<#%T&7LHrhB*4!yKxY|Dja$v#yy+WjXOW-M^(1I; z2Y76-9l7o(7p$MnHPXX z5rPO!4T7X@@$o|fVUosisv!fTGea^hJ(^n58@IL$@2`pGGmC-La=-tz^SE>)sx}H<54c^k$IYa-TT+K zIt?KauHfy2!l~&FxIzaya1v&23oZ$0uTcbT(&^izLn9(Hu&s7SCez-or)p_4t;M&y zYbt(~5p?217#n^XtUR9-OKY8WRE8Ckmm3U`AX~$gP77yPqgg3QfJWVz<~UKI&SQj` z8IjP|+*f)mRb%mkwX`@+X@Kh|O|BN5&XU0VW4CQ`Uh{z9a;RKIBoWmEam{p#Yg;h% zXs&41A066x%$hMq8z`pFP;$A$>qI+o8OHIvw_HKa->f4&MOMX!byTg!q!U`h-1S+5 z2N~38%a{xH%rIWVLs=U}M|Vxq89St)c!*rl_2Bv}w~#p2vQs6_{HME@GrEFxMPaPG~H)d?wZ^BlOb+LT2ln%<{zvA9U%N1_VA42wcNtZ|mu+yfTUDlvH51&2v zJ|hJ?=O$wz51nVWKs8hT8+0n<+HaMpWyYhCGkoxR${sD||d7l{xRtbAlkOG@Oi z2Q0>BJFfpjonqoX=gUA;13)|Tbg|ige)S!Qru`_dv{D$ya~8gw;mX<7ltv6cLk`}D zXU2Z?614G`Xrz)ug&Ge(xPhy4cq_L{+9fn5!Z1``ZRO}?Z3ucD+j$ye1EEvnu?^^n zU=fDzyr^5L*@C$~mIhz~(O?YZ5<&ue(7^{eBfy4t<|#PZ*pRs)y#slf;KVnIaiXT@ zIJVA#2oki=1EhnQT|{F<M&Ta-ZT;kUws$CSgXuzJNEnWHg&#1N}V6&UL!AX6S-_C)=S$%59306ZPnIopaqb~c-;WUEC;O17u z>u1`{y!e^=aNOkqEHBG0Mk`2TO7?M5s6acRHk5ZQ#veZ&IZ!$fIyv+9R&xIsCnD4z zb74AQ9f{1%^sJ#Ri)0nz%u7tb^blkOSLpNe{9JndluILv-`(l&+eqnFTwZU-xgbv)G{>Q}=@z2=O#5@|Jntr&555Hg&xeSnqKNv&s{S+~q zY+HjTT&8>m^KBDTUtbPN33CDO!s08tjL>%xne69H#+G(8OWKYFLt6t{8j4s*rDT{| zu8CwFMW$>L*ar@=avIzzAK88zuTCc5{bjnnd zr+Jui!vPiuLQ3VL&_U*j%`eeN7>T3vH&uf2Y*s2$+ zYi&&XkN z_2hwWI9DB@&%fwYB1=_GH86-XTf>48CCZEVl*ezAjoC9{koe`fl8ulic!9{Xa8?lZ zg{N*X&oA;umK3tuet#eRx(Cl~>2CY*$E~tXp2kJ@;-oB?1Y1BW1H2D*eDs_W-f_ zP);!)vi`6zFqIi0N9T$@uV=VlPYmX~2hwjpgZ+Qw7;!Uo-< z!iDedo3;y`j9WSzEljiHZsNR6MkOIW|>0FpFfLmbNK%R@^HTr+q}lILb=lX zsiI~C*jB#$DurIq*~U9~c)Lm5OB{61z>F|Njd{F}2zaNi_ zB@5r0;}>h!m?2uIb5`S`Eza=b5?>6ztiCYb${uI!&wWdF!*3*(r8{4Ks+Czj-pGN65E0cfvnX{wqA!Kb}fCr%5w# z|4MvvcXfu{J(@pN|6*<7+Sm**A2tKi(#&rk9H|>eU9A%9hgpRfU&dM5tLvD!YKQ-_ z@i~6nMt;fGJ7332i(oXsbM<4xzRtfsHAl94##c}4xe*(Debo1%Oal9Ms zXSO^1B78rY*3p;k1bN~O+=_^X1C|4gPA5^81MK#V<7tl)?7iLkPw%*ie~xztoO`c* za~46FxVh;0<`=0gbBc97FU~1*$?psUuo)E|#v*2dXKyUzBg|_JCygU;nu}#`Gc#!$ z-9OBQC~5qvvT>Zi(uW}A3?xRyuZ^ikIrLh?wL~+3|XAEDo0Eil}uY5PR{czB_C{fy5ZdY{(kQR#j)G-aFh zP|h`tBowD_5;hrW=k3Lbdi?8p@vqHXs(tQ%0qx&d`C!I$Tlv9LRL9sD_o$#hz65C3g&U}|0^?%GTxxhz;`99@w-Sz zt&QJ~&2!(t(WQ#Sn2lr3O{zNS`JB12K^Hpt&_~hvJ|mhcQf-g1$k8YLZcF@Ep1x7R zuLg)+XPlS7i%7m}UIqMyO6{Kk?bD2%f(%+2^AMz;%i`-~=F{Ux69_|Mpe?!)9Q%6kXSo3cZ=fU~ z5*qBFASB|*MlW&!zHZ8Uutcupu%5J1c&Q<-*#vcF5LgM;9D#I)jad_nl})tdog8`t zfYC}stl2s<)B| z?4d+gn+~TWpt%J*7pW8gQ$;pg;N<4ljLe(C$?zuOIATwe7|ETMRxv8jiX)!yVW*`z zd9xC>`Roe&3IhP^6#S&-h|)abeocK=eGzmMG()3wD_zvcM)j{QvkBhg#ZQG0uySA`|i)6sW=g`!& z*L1Q_Ay|Y&^x?E{ z9an_Gdt8u|S@>&oq4Upr!tQv58i%;SXV-F4?J ziurTE&>raD=wZ7dzi-j$ryG>G*T>rX^}xoUUbW)rKKYI;;b>LZ6`d3oV^BsSl?sY#gU$xYfG3 zxr_@g4gnT38vZlp#h5cBdI;t)L@0SA@K{#va4rQJcG?=PJ808G?0GqOvHLYYUezs3 zXc-3B`|^*ez{JAef68z@?p1z2M2W-_)WQ2ODF;-2*+PfnPt^i^zomJVJnYJw6M4jZ zU>P9ti7tT(5`v6-oZy#0%oEp0d<-2&WHSdz#(w}ZK+V4!Y1V1h$z!f#&`IT#o=0n? z*5PU2=KB8BFndx$8r@%m{(PS|%i!r~$C@t0wY8Tt5qp9VsYBI&Pjy=fdS1xGxLh8 zDBA8+dnVdL1(u-vW1E;=;eXmUk0R)!+-!uKb#prX69V_92<1`}F$Of#Xmu}NKifJF z9|6rffK69%(g(jMrM^4?<}F3h z_4(fqqd0LI`bma4$pY3^my6^1hgAap5I=fu+A;Pc`8Z$#_eS+CP@X9hFXqqc&b~`{ z=Yh)&Qt#PM zPMn>4RJ%Jc+@*@SE1tYn%Ui{`S^bqd&QqIwKr0N&I`v)R>6$n2G7~Vk(Vw)lEjg(i-6rfKlGLT zMEx2cR^P$CG7lqnMEfrKe`N+_Nexy}3HBZ4nQdbk?rNTiiQ_EtPcutA(@!MRx{2xV zdUy1&*2-iZR%RKFK+Vx5AN>hpI|CQ1imN9?wZ6Ebs=9VTwHW4Yas-|5a4nxctp8O z#Kv_A>tAJDyPIH@g42VDcN{_^*j%$s2MvR+!rT#q#vts@HusqX!zPT9#PWC?JzgpU z@;{c19ZnVcZ+GpV)d!>?KwwS8i9kQF7O^11mzjb3;ka#&%MVqDG`f8^3t@xs2h={8 zCfqq{L>3n{ZWc0~W3MfFOT}9XDa6X~uTXC$;@jQm@U=0dqodX>-^JYal1Ns=?xXKl z|ITo~H2sUe#2J5Qs&Wkj(;DUx`iHV2NCX+Zvd7~SXf4X-tyN&X;bCdS zR(YQty$E<+?rG9dl$tP+B3^S%7{(l8|3mfVms?3;8~inn6Inb5eX4V8`GRhU)&|PIRat+ z{~xErb0=rXj4FDgPe(G(4Q$TfURA~J+>gFXA|slM`W zXmBlH?&B87Bx>;nm)GpULt;qik(6CcJ+B3k=H_{@*F1F}9U56kVW2ug8v*s{G>I|; zwe9QvLj~@6&jPDsna+dI{Ni?roFkedz=;urA%d?WfbD|;0E=)0UY_3mMc>oy%l8A? z`@#EmM5FOB#5>Y`{|KthRWSuLfyH?T)d*>-trb4o^dDd9I!|AR^FP(poJK~PsY04* zYKjU$;rC<4Egz8BQ1T6TF z3tPNp2~<0~FgqVpN9lg2(ZuWRV)7qD=V$HghnZ*r&^5t`Hxvx4=NL!(m-^W zKrm*oor4u$#Nh%tOBr+`cpe{CM5zeQ#dM5jKn10o!#~ZTa|Xb#92|HYE(-2bK;!rD zeL@+FF~L5ONxYinktG3A6dZ2%M`P9FJG|#ljk)F94ka&Y%0?RqWF|_<;x1W*^hJ!V zDk4l?voObIS2%T=2O#QpSvb!5jYHA({fSSih7kGS1wo>apfy2FFLA4}i@&bg0PQ@C zQp7Yd6jDL_T>ryI{T(u5Xk!QWhM63KXa2wT(zY>vfaqfIeR}*W&uwL+N392G&L^w6 z`FZ+v(mP9rydFQ1z32GC`vRF3vvR7(L|D7wV;xR<+ndve4*nq*X=J1S2$2dxD_BG=4h5Rj*DOk5H+f?sa>87rV;hQ0| zl=2}eD)Mbsw9J@bs-qVny#Hqm={XLAV`<4J@t95=-i*_)N08U8Y$?(}162blIzpcz z+hEb88uu@zfZuQV%5FLGyR`pL()_uN1v@wUe(#5+@T0VJ@jh0I*M%k-c)kz0<@eX) zpH!&+Yx8{FT!aNdonLM?p(|G1d|5=OF(X=3Nosov^_UWsO|V+7AS4arA_~_Q;d!o! zNJ%*2z|L7N10E{hxr+ZCch@*1TwM=d3YGIv92wVRnY`Q5!c52-vpG{GTgUkrHRKW( zf`FoncF01LNp`RIW>O)T$HvWe+zkjo+k^sPSLQyBm)YDti$*kqnn0n!F@qsk*hb=K zWJ{MQxni3+?dtRa?nC7GX|QI2pzh=Vq7mRP09S;#lEDd()gghhP7oOoc}o@dHVTAV z7)LV0=0h^)rODmbw2JpG7e`tp`e{$55E9t&dI{9{WA`dm1rUMUKbDSu#n8$n-qA4b z?#_+S?y1>?%>Ih=f>6}v93h(k{J&WNN&_VUofLFTP9{S!QKD!Fj|wAYS`DOtYyn9j z3_;g)Tc^%?ectXzJF*66^C8N<&BrJ)D+w$1DMW&BvPD4J3cG=AC;)=2Dvc?^p4lQn zP+$t_Ru__Cglt_&itK9Lt`sr=juhk~s$gs^@gsLixbMLHgX|}`fZgOab^R;^gm+mw2VHq;(%U9h7i~Ji%rmJ3mVx0E z%d_n7>g3{X^UO3bgA@?9Jl-E}#ly|Tk~TM)cjth)V7NyvD(6(iW-g19pe*G8zn^Ah zYm904@%~EhFI9Ed%U+a=QBgxM+n=qKV9MTZR5_|3<2OlrYgI)@y6N<*?mjmdQV~|h zeV6(0QM(Ap#(p0wO$FCu>|j&_`h6WaftWc1Ge43s7%=gR#Zun)_WxH7w+oH^`BG6? zlQ7t*v&v_8WXza4#worPa{DmeM@8vQpV^|Oa}~wY&lg*g8$3Nr zCx>_m#PLSg2)D*n)j`H09XgB7E;i(5vM1;;3?S}~kha0=$X02oOf^qm<=1l4NYHmC zoSCPKi?uN+wC+_s>Z2LGQp70Dj+Q9GBNRm30i>d0b{aFhk)nr;u8Gcq1I|E8^*+Df z`A83$h56p!#k+ym)Wm)XK>t^1wedrtCyASS{svt={BcE7+NiW~k$h1|#_HMzp9c?L z#TW2Ks)|NX%xEqmg6+uL_k%M98LXqhxM~ zdq}NwZCPe9kF{b|D27UK;0HndHNibatD&UPVD^U(vxLWRaaa3eGlwwf~T>O+1p*M zVzWXU(5PkElpG4(P|N2(S{Q-}fs~{inOTEK#AJ|BVKm&Y zH^J2OdeGA9?&&SEt|xpN8ek`p%4?GyMDx(;d*Qh@vR|_l98C$#GiIu&WVRf32J2)6 zaYXSC5>za;RybHlv3U;z+kT?KyItZP1&y^kN;filK`M!Gh&W!NNLB__Jn(4GJV`2= zYofPFJ!$lXZJV9#^&x#Da5h@-#RS0I6(o(?{ogC%o;;ZvhsQNfM%8}x7d%~U`%Ne5 zcVU^y&Dz z-=AZz|F2SS%vuJu@deEA=D`G5ES-@VcQIaAyJEze5+{?)C< zj*st6@6`S8?8*JV#*-Vu`+sMv{Br)23*6;+S+{r!_r1OO-?NpIz_n+Q{{Q&*kN4Kw ze-3{4nb0o>(F|bQha3E?eQtN-?y?TQ)l7X;A$EVu^L2AQJbYg|Z>jseztqrKeFprm z$^Q?p`hR;rzEjxn`C8}QDzPGHmGS^iRQwCUzS8Eydg3 z-hBJMZ###~`d?>pvHU|H8x*a^`mQeD5BRO`yqKMz#QbX=g}pua|KIka9m%H2(`&Dt z+|1`t^2X%ZSfFAuI69DziKXjedlJcW+4}f-Qs?beV{v}wnLotu-iPxwH~zB!Pmx}! zIZgc5Y3ALMIMR7~;7xq;IR0)9<*(!LDe2+taz78dsnI9R+lRcGE2oEQ&(_Pgy6kZ> zaryQ4$Jj8=A>`(B_B-+QJk7t1ejZN@#`oyOy;sBB*{3d^7l-?Qhs(qdxExKkMQQW5D z1pl;`<^4hBo7|ml+s%(-O?WG+oqs<^=l&}ECCgj>Ut8;F|Gs`-cV3UjeeUPpgM-;uY6*za3S3PpD=QLaOp8?Jx6G=@Lp z+#ES9Ji+^0w|;kLIw!m@%J9WB7i~(WUNZF7y6q{{RcGw41X3>Qbwa5kQHEfy%na-w zkOh99!|g-U^Qr#N2ixRqo^}hjxL!V|uiV%88zYh99TW!?@%ou$&GQf(p1&W_lZWD< zH^KcZgle)$Z2!~kZ4{$|ji0rs^~!b_;=rGAZTMq3fv_OjIw0l@cmuonlSTW-{~P~F z^7qBz5BJpi=Ym|fIBLrVPJV)5#GZ1nq^#&++;)2p355X`9+Dq7J^C%c!g_n+|1p2s zKOsJ!t@D=FEvHqWB8shOjkT5;+7KYfZu1}yJvYeV`dJx^JWORnFzSWT!%4e(lb{Lz z#nFgjN{uDXRhexqoT-uhPb?Xkkh4Ai^|j4zs2-YAtaQifZLyV1cCRM^qk+U>j}okI z#16ujA0eu-_dH+jtv`S`g46<`K>cN7xdS+=!&n$V{3LO<4Osy3f=|i`$F9S)96`89 z{D72xd{TY?`y*>h?~2#MUnt9UrO5P>(?ZUrJA)sKG_LQ#;KAQ*17_0c0zI%p|BGsz z`xrxJ>W8Zn%)m%_!vtm-#&_Z<6H%t$olaAydGVpS9+8YdG_#(Bmt zOlnys?bYaG^S>NUg*`rqOoUO@mFTW~g)svm2>>C8EPj-UF(Zj@=)Ag#oE5{mqTHOk z49#zUvu^|2A=d&=+#v$PLE&x?jYifF6({OPPs=m6I9QS}$g}V2C*nZHOlD}C37KXV zguYn3OoTro2Tl{WQQC^l6stTHy*;_}+r`f9Lsg3SpYoBl_bI1|T$O68^jO@{fMo#% z4`4wfiFf_J085*POIZ!phnc$6pBnzB@J{iX-Lw2gcyUoZ$9+KMI5(G6G4*=foT0uC6MH+>Ia1Z5Hyhlw95I898lpLPLY*lAUR|RXcn0Lc3lMl5`aLSSwv_K z+LSy9#L?Ij4;WJdp7;+Zjtfy9V9F48#0!T^`Sk|a-fI-rLr%*{(tS~(1qG%zG71AJ z<+XgbYC_+f6Y$wpE=30C8d3P8t_hIJeoRau&&3Xae2$=DO)puP==C6B2e1yq6%Vw5 z0BiP85YYt{RZ@rEj5}YB0*VSrgpv?Va>0YR33MV4>OiA*Ps9|6^}?8@->dvhi_#xa z1HI0G`>G5qAaPX(U>gt2KP&eK^+Gg0*|1-t^x%a_OnugOtIi}R3Q9gg{3XCeBwDWo z6|Q6sqd)Q)&a&A02{CD2r_f38Bqw?FB{}RC7yq(Uc(m=u)$KOETM_Y$Li}7Vp z`3ng4Kt8BS1vI1i5rhQ>(g65PtGy$9jiZE9BnizPM8KBQ?~(&qjzA?eMN>sG1VR$U zLO@eYOh`zdF#tqThLi(CK#8CONEn191_{C$)KxJA5o;hS%tnJHY_KvPccI~W)3EDL zQ=o1Q@W@U~hh#Xu+xcOg%IW+;BFDHsFx;WS0*X+oUsy?tB)R5J^Zf0hj>u9pQk&^mjQ2q5L8SMi_<=G`zI~cY0+Dr>BoZ zZiKmp86jA~5a(_V5e0;ep_t~A3Vei&L5?Q2DvP&_nxnypj*xm`IP!c*@PO(ErH>@u zlL*mexRXY}&_V%CN_`vbxbGK>a-f)wA}3sg$mQu$z+6H^Gic%iz~j#qX;Os8T8y3% z4%jAWWcVtZ=7IItD#9uO#31N2z>8ub#^fQmWEymG0|;Cs_`3&aibDe`R5?ol)?OpB z0j_s$Z265;B+XULs@VX+v_s%vIRMffNKoUq>7SkoX(*wUlAtDn2&##gq9~#&2!e#F z5GYCzWC;c&8U>^Xl?Z@RBq&-`p&()aprJxiXb4h*%K?We?NJa}HX-GNdZJ_O9)=xP{5X=Tm##4gw6L5Ku_lCBtu%k$V(oq%H zrX?B&F$?S#kbJ}+I6kjWqQWS^f?l(;$8f*nhX}l5O2-_5U z@WY0RdzZD;ECJxXhB0u_!=LieQ;?w8pv)qK1#ngvGn{ZW0lSGZOI2)-L`W{^lj%y^2JDIS7H7R#3_o5?!IAv=jDrQ3gN)M7SS#r@TSxKOYgW zYa1pULzx2Rcu4XNGq{u*G-fEc1vM!1ZIkly*DOkxjcdSj1TIcW55e-Hh8?#yLDEO? zm;>P%mJLV|_MlHt*yjB$QjvfK&kRof?-zja+sl`VAalvhML?=Nh#n(N5omjY6><`h zZ$1xT0jf_-h8>Fw>y+1N9>O3sVlS^?+%rH=p_`B?f4$;j$Jq_L5{iIpSFHj^a3!)5 zf`urhj}9N9+q*>Ba27)^!2t7_K;i-gB~lS2gu(>1GcZd^9S-&c`W0Wnk~Y4aX|~3E z`4mcX2#`BjX}C(Dj9H$~EVOQLqBV%dM+0n+<%n$eH-a4CNMscDNVrO;n}R!&fNrP; z5(eAV8sEZYX;&EvC5GQzMbw9nPZ+PWP3(^hM8aIGWDce{>Y#m7Sv-jg6rws5m3 z<}Ub7h&2}|0gNOAf+^W<0;1+&<`k(Z0#8k(PSchMqwAu|yt+SMdHr_aJa9husK9z> z)yx6$uptuB1WPfX^zu-1w(pitNI|OjN|z=3Ij=xY^DbmfZMDsvwv!yyRkiECs_`-v z_x-~YNbjngEjgpfJ^%p$sruAb}*37z8D#1_J_=@!^E_Aen*1)lk~lzX!pA z%a;TRL-uDPDNBlqW)NnE1J8sFg(0Qp%hU;AQION~UFNx9p_7C}Jl{O>E{4O~9tJTQ z1D6YPhZN?)4Fn-e43S#W@&VAE+Z7YiKRt0g*&i(=*Mv2JTVXVW`&d)=d#yMq!yoUp?8J{JTaI~|^T^!Mj#e9F=VKA;~Y zNK2#|GqIp^pM7(3($Fb|J@OmY>){{1ULZ$}5w3@b@hR*XLg|nVh4{rMV6>nhqYYG| zsp;0Zuv<@Tn^4%?hXf7?V55?&pl=uw3J}`!2Dt_f#gWC$Mu?zDrUF};)7V!)uXaF! zV1yzvS*SF21mnyhw+99e29!KNkkT9osuOm|XNXLyOacT3Ms7xwRU(B9979xu zAC1t-bP3oA-nRgiI35Q8pvvN+Ai6VhDngf}o-V7mq5d}(d--M>%`%=D02Pa9_^#H1p766c-A(0Xj+7C{MJfIZSECDe98v_)`852QA z6R)r^9+@BVKFqu!*(I6P_eJP=z2!mM_advNvB09Z(bzCy7_iY~7=U;hGwaF--v^ z?@XnPFl`(GC{D}67!rya8b=yqJlsufmwlhHkTV|1?*Y_;A`rwqon{WHLWYKwq<)ef zp!OZ#uf~i>p&-uKN*Icpeat!4++pwceJo6JJ6hMY>hfx)|v)D!YtGV zNPuYLfIi~D`~lLY#1m|YQYlEVMrctXv^AG0h9H{}M^m~kL9)OT#n35A{bY#x2nW05 z*VlkCnwn+`!;3PUh${dy7gu3$J~vB|j#1Mk%qyk5LlbF~;>UQA z*;BcOZ2@yy`%ek|uW4T7&$62esCLqxaJCLmZ-*`%+)8|9u%ONr^%_BhNXfLew3AA9 zaY$3TN_B^u`DU?82z8B*Mb|7qg5YhPW&@38U}s|vG{-j3&Bpm5o1_>RB#j+-6s;UF zByv0U3yZ9s--ki5UY%gHa;b)s5Wwuom@t@EIXW!icEN`drC~He_liEc?P$Ef9`51n zEYBux^3k>eH&Sa8#CGw?zI!ecY}1`6+BMD%^uTl@NG>QA6A-jS8f@3YS3zOIb#h(| z^{n8Z9ddA57{0-_)(j(*z;f;}fekA-r1OqP(i31{&A2qC%K(5Vhuz5|OF?!iU9zAz z#L8%-1a*Lv!A*HDXGYHu!Gy=Tr)W$<8356Y-Euh zl&0{A#SLYKBAP%r6`9Li*@iZlqzzmURzrl4!mUGccXk+iEbW|m%`q0$h>Q*TVxnTEi*%K+o^#^kigZk?xDhcU8%%W4A0 zXTE5FYh=Wri8O1_G9Ch))tuLRQ^H!e#-L;I3(hZQQRJM?$Dq>jx~GR)JhR2oQV%T% z-0aqJXg1Jckj4Xn1~iVcAl1oS!dp_BgfAC37yJ~tV|AQD^^y*7O$mhwrv?l|v^Iv} z>4S;}4Gn?mGiG*fAs*gt1P~1k$?K7BFt@x~(tHfp9s?pgboi<6j#~IQJ*OECr!>N( z9nyXb=1eDU-KEEHOEZw3(l9_+Y7Vl@Qf(oSG6BtaiI+6bN(W(_oy{cgR7zSf_jhx0ypvcp<_N;(+3(;DqpwO5!Nz zIu{>POGmBlbLa5UBjG4b*%G8;b=N8$8$>*ai6o`j7qr+RB$4Tkopjj1s!tFomd4rH z-1D4ggT7XC4N0tMZ6?<3vDQd8j{F>=E45EV+kw|xfs=C4yhO)(Z;jJYBS|jxo^=_t z;^o7h$Gr44iw3fwJvZ;SLfh_c&yZd4V5xk>$~#gp3`58%cN^;tR-tXA2#Qjl(vbmSu!! zqf5oCZLKp|lpH1KHKIO)88>7_#&7-#5r8yI7K`lG?K)qDsw{tc1+(cR4Q5N|lYh%hu-=sv}GW@cO;2ntf+^ zmz!uNL)IF<}Q2H8KuGlrn+sUM%WKf;c9PM zsy!F{$k-_>hfI`p3k@={}7#oHICnz5DBB6Hf!IhS*2|kWe>4KhTS|C6N;>RJ20VXUH zXfu)$NeLD45>TDjzkEhUj!_H%&utVlu%ZPT0k+@3pn;gu09G|2bC@m0DYwH7vcaWc z+%7!`WQKjR?@JHj~-}F$)Rs9-{C!wMRD4Xwg($=K{!9M%r{4Am>^a8w_Y& z_<``GNP|GwYLS>ISw(e*GBisCfPghH+XvyPs8E^VF|M=*{Mnw+C|+P5(2G%lbGZr- zrDx&&{es8|c~H|v9Dv-z_|ZY>f)}pc*Haj&2IX4K*`Wi#!pO10 z^S$H%UI(+o7?V5D7b9?60EEUZ#C)>$kjy9gq$JPR^}Kh(gPGzlIkOlY*_Tc-79$Q1 z_Am|)vnpyGd6zBYvr0pfY#QiU>&bMr8&W1}6sk*1QZ4(TpBo+$k&yiQ;zMbHoKfL= z)3i&Ug0@NMj@ZudPuG@SU zF$HHb3@5*%151#r+~OU91o-O&ITxh$FQ$+g>yQpyOcrdYg{s4CAmTt4Y<7g&M5DhI z@N79k#~YE{byUzaF~kF-g5r>H?jBz5OL>&dm86oOnswoX+e6&lBV>``43Mok5x2ux z-(}+nNeN|Zh}zZDD8}PGb`>4m<85^(oTyKdT@bTpZHo-j7V>9g@j@h5*qyiFx)ZOx zOTD!d7yn#iTIv<_poZ_)O4|?v6<#au!y3wl>zJjBTxGwxT8}s*_E* zM@lrjm175F(q+&?)c7DrzY-6H0zkY#`ylz6gK^&Sn8dxJ980`+I+P-)f(f}<1q6ZC zT|kH=DudRb`2qxnQWl7o5RhQmf<=^XGxZ@Ti36=t0gT*{0LTc5Sv)AW06EY{w+@9= z>Z|QbNZ{s30T4KctoOEgU5}W*6tYY;Cm8f1D{>U_2vZw4Ji+j>3_~&z4K&kDG|0jd zQL9W75j>yRQF&#UFp(%lGyy>23!ig_xwAc>&zMa2x3q{ec9 z(!#Sp5cu{_7qJjnb+%wU2zenf!1Umaa}{YVBN$;e!SaA|AUJL!T*_n?G?Z1WSn`{W z3G}y3$EN9|P}Ti!E~Joykfb|hNgQZOZBUaG9#|hm!{xJ*$2sdEFbGG2r*H`ZwS(dd zg~kot0(tuvWApPT1W`IPq~USO2y|t0%63%}Oy{#8nqkKZStERR4bcTRu95`OxN;3_ z30r2+6HFC>3`bo3c}|15mbi-8 zKtmuV^!KqBK$2jir_LJ$d4O?UfQW2H5D5werI-PNA`yWpM}h7iV)xX05f>oFoI3o; zVrxO$cb!}TAZ>us?wy#LMvlP}Q?p|5k>S)>0To{X!>M|QlU4R@1S1j1J>Bbfu!jSGS-(PdD3!;|Unh0lWqa>4H(D6et}^DbERLn0;@!0Js_cM~UW zJMTzF`B6x3NmRI-Hn9OB+L<6BtnjbIMFGOffYhtV3`6AulLbK(ArO)PSuv;(O;bg@|I~v50g`vv?!(cR1fdes1J#ooHv*$yh#UT3E zRe}rnSqdHis90((7Xpwq8=lfAFb7ag-!doH^B-b&dAasv79mtM7PYoMTRJefU?@FN z3?w8WQaKR<1lSBJp;G3EC|J7O4DV3;!-gERkC-5_S-}`W>o7HBb*}lY6FA*|d50Yi z)0DV<3sFKlVYJfMrxuRzle0Ey2!w*BIa{*muDf>%&J*YyrUDoq&5XqXE{!H&q!7EK zyVDZ%YquUn1kLS>=y zeFj5CX7fTOj_&S;sG~s?DOE^7YL88(E^#$|eepWcYKO?h8*ni`y4AZbU^Q8yWN>NbSpTFegH(4GHZ%3D~x+VA2#6 zhCBgL4=@7tgWm*nNj$+NJ5`WOKuH1xkfc5{z& zE2S6f=A*scAeRs@An`nNl{)7sY3 zS_mtZ1Sp1jr8-Fhsg)){i3%bBpI<*P!aC5c6n9J0{@5mhq4U}VS?I*@fx<$M5}Ua>mH zBA^M7VW}h{N(Lq;jL!p#0fHd%9j}tly9K|T(EYNj0k# z!;%kB6;z=BxS|;YBqk;7Fv1Pj;IJJC@jl_LDG1O(Pjm<55CtHVlnH)-U&>YB93%(q z7zE#6Q3CqMC=}H)25Ar)hu8Y&QXA?VN>)G|z3YJ?Y(;np6!aV}$jsvsbWx|mNJ%l~ z56#f$a1KsmlE8k{5WEzS7eZ8AsA)ms35I<`$YKY46bS`>EyL4b6Q&3n5JS=O(0Af< zMekK2aDWc@9ni#-(v*YY=-z?hQ0h=S;CKFm#H(QPrpUHHu!GK`gT-KiA5xNnIz>r> zfLK71NDmogp-M=*Abpe$U`#smUBk5Wl#LXRU5lo=sH837EP0A%@O*>iS=#4y?qkmMqe z2th*Fq6XRm=81tKrxF7|5GFDZDkv3)?u)T&Cvs#UMLcuBK>ZwO(hW<(wB8MY?1&wI zj-OCv20*1Lh{vu)p`mJoJ$ou%#wsMLKGUo4aoxpKvY8sK@h8LqJqe%RwZ5j%=1KWY(%$!M2N29%8r(VirZlhLSTHgX2t<(y0z(7|LQ@k>BG52MiuIwnJ9AR@E~q9bX+@$ch(QWU zsvwdy8n>)GFEVhB5JW&kjRkjNsr1Jag=RGI15C8Q!l{CVl#n>X_{i{4fhH)rg!+Fv zyxIzQq@-T?ITQ&<6%-P26Y#^7cthQSB2b4QG^=}J2A|fzbcfBneV7K4)g@p@j1vKf z4+Rbp+o$n3Ovg~c1Cmu`WDc{wrU2#kHVAA75c_^q4N@k^LY9CWNk){?fMQ_dEqRpG zz!arO)dWpMiy=fn3_=h}R8ukqAcbz4>AY1cYf42@-%J zfhR!FP2Rr6J5YnS>hTSS6n#1x^|3`&RTo+xY8{2&3`|*L#uy=_G*Ar`s(5Veaqiia z1VVI;TMkGfaUr4D$Alb}ZvI9hGD>1ttMp{FWfTkA&|ol~~fj$%d8nuN_O0@p6r&J+)qqZv-bQ@1b$;$z)uav|(xN`%h3B*4^CS(JE@it()OgN)(wz9A_odv8_bBE92Ief5AwQ=zGjw`^p z`F;;Rs9i(uY@Ly1pTnoiUQ2-^A|52^K!NYXPdW(o{OBW=eIT0H2GEdxX!?mrhVVRN z*cxCbmJtC6fk2`NS|R`ABM?yX z4J9H$D9lo;C^ZQn(L_ZxD?$d0KmkA@LLo?mz?1~SM5!ee4G}0$r>#gl`l?_D#+c&j z1wc)!?x1_GZoiID_dYmu6yj8>dHSUfSt0NzVkbk9gA+kXFe-Qg10D)LRt^I=ni8&K&WOfU{9pNwI;?3=6%^9OR+c za+FK~aY{_2AGm}uJhJN_X8&wX5bi2uJuW#&yuN}bbsf<9RYFR_$VR@DK59~iYBfS| zO%5C^NO~jBEe7NQ&?~*yV;83p0@BVt^@}~oymGi_JgBKuNVh|U2fv!HD!m{9?yvw! z_LmS2deeU#M!6X@Oa&uNEZ=L)9GRpjLWm+QmB0jm2@)NY4bgd#E~lsyj}X`mU{p31 z?r?=ICSZ03#>{|{EDvf9NE#+a0zw9WxNAI-$N>4$!j!%sprD9-Vbxw7O=YbVwFLwy zco*cW<&sew86fif3BT&|{rT%M6$jFR2@!;10wf;m*7=c7o*-;M+t70tv#>*_h6l~x z1CA=3ovr23DNo4eKP~y93CbH9sw4}IfG#l~bpqgrjrCBc)cZY&DlUB11Fy1ShzJBb z)8l@!M;l>yf%qOB^UVQBXtoL_8NRcC--pcddu1R2ihwminr4Khpl@LVnH1nU=E!k? zY-~v-GDIN&QH**choHddhDafVBnnyvB_;>dm5Gq_Sb_#*C^!-Ez`}$NGuN14grX)& zC8;8cK=;@?IeqYO;`l+u57~{Cg=vNo^YSF_xX$Z$a5B5gM9tTQ4Z6`7==HIYJKNI<4# z4H`{^`@>>|<&GhQN9I$h`-2oH_RXA0Ru-P@g(novO7 z8V1m}nAl&OR}hgxbW5~Rl|}(l)|xLWptp2QMo9_4*~V#WO`CFGH>*sgJ0&uN!@OG( zLSWg?6s&2rV1sO@A;}dv<{Z77OMZvcaAonm*#XuUVw2ol`e2l+#E5o%UdIDt>Eb@S z?2!9iWR}0I;Ljci2*%w75Ei1AioVDFZ@62vqz84_ONf6{36}dgJ3W>d29M z>ExGE`V&%#)oMeUZw!i)87m;nNU%+@kyGg6X%1xP9Gsq97)v{hv&b}r4;{)5Vg!sN zXKZtZMA*YJM20b-IcsxP4r7r13&Wwvr2x_`2AyRITvb~8;W7snP&ix&fUh4qiGl(q z5X1)Y2t<4vwGcb#5J2t=@<|r2Cm|06C+UDdA;~Ep$c*_$4MUuq2|dD*+2%n*nLu2< z5w{2#Q99@Y;ZLX~p${HRRMhK96{~2Q8s72AU#if(u@ykKZ5**wl>t&XQ_rYC$P%Cz zpj9ZIOOyiP=_FEE7e5Mv0D0g-84#cmp!;Q5#UiZc3SlC#P&}nkO@IRNHVcWMcLQ0w zeS0nKM6=eu6u36I3ME;+HiKEf4KUhJ(oLgG+_%#1tQsn9MxhA;*p!V5^F&5s77B{U zI=*a}#ip^N2DOw@#VuuP2FEI<@*)gCBLbO1z56tov$_z| zd*W9Wvm5IX6Q+ZLZ91P%f3?>Sa+Gq|65ONFZz3u=(0vR$>?JUWv7NPnLVHZ3T)suI zQ_cBOpvvxdXd{oWY@xJfd=?iE^OD1}_nL$KNF=LkMA5w=Q`sNv+mET|dn(K=yTWyA z36I3Sj^t&2)XSBn-+uD9uFY0nCM;$FX{!l8whQ8Zl|67>!g*<2#?!w$7_e~vy1li( zMjk=Otv)(5u=y*oGxvfAeJY_>`y=&ZhAXP?=Va>3^R`MSyyqY4OtTuPc%gwd*@8a&Sgz8_MaS@B-JYCN=VMKhL@kIMe8YZsUrbbwE+Ij-cL z+k3Bnu}IhZ4MHcdWO^#jqd&rN57jY$-2DFXPFYQ(P54x`dzB(7eTv;#cGa&z(>hkF z+C1$+c4@h)vdGCAN?<2GQXxN8&?);EEe@Xq$MRe~Of z{O%=Y@J!aAdx`RJLMffp1M+vCcbv<}(2=#{roJO;{}+^ZxDB4PK#qUraqQJ%Lgyzn zlBbEUYW24x*u577*G4WMu$?%!_UQybRY zVt2?JqDXBM>)&;CbC<=sPZ8xtKG&`Cnd00C`~~w2?~h;~bWTqJh712JmeH)%9WtDH z)OYAxkq%o}JBaj^ZhN&S0O2nq{0*GJqAV@Wn+@0=GA?yAuH{Uyh@g5Y_+3i}=X4A{VE9d{a2IYj1(+bqkY1m9LB|b;$7wQi! z@n?II<6H!+>A0ywjcr$0cxuNnlnMC4_v^YqCiAsnpR7{mukUpGyjw8##K1fOBFn`A zNj5kP&JTldx2R=+z@#!YKn)Eq&(+a3piDP)#Lun|cBW6_eRPA|0=^O=zD|x0I2J5c zVZ`K{8>yLUeh4B@g1k4GIiDbTLhzNmwnVl!H`^5*-Uer`!Y1b$de;WFU!h%VwTgq} z08lJRUaj>g$nKJlS*=iX!{8M8FhKe)$TZ}`u^MrhV@3!&i}OH!QsXZD(gKZiiPg+hFa{nzy;6 zTwF(xWSEU}Ve=Kypc%(wthNho2YkiBc3Ktgm)^WZ7|O+ngW zhZVTt0YYXgq^YKpzM`R$JYueg5<(y#CIQ1U9zE-6)F=<`p|VgQvZ4lrKMEOITY*B=r7r}s}^kx6_U z#O1^9=Ut~_D9*pXN%q!re^2hPV;qnSFp8l^Z2{3x5P~+^Nm*0L#RZ+=JerUY^BHH$ z3zkj|64cZbr-R`aZ@4|6?=vhU!WLZ>RZ#r8qHlcxS!UO#dR+DIsel>`x#xZxU_-vE zh6nozU#P~t7{3#QatAAdZQQw<#YDS7ZVywrTnJv^UTvM(oy*9P0=Q`pYu{KU)SmLK z_lnZck+;J~D=}V_kmJ-$$|yAm*EGq1OnsJ$X~vp`5>)=mzS|eTqQj+cdHlJSf6tX` z)cH_$1X(R+qYl{~+)7)VFutm?{{eT3STY<{pi|$b1c#9jF@PD9mVuFDUIzSTu)9t+ zZSGwg%L1IDe1_-aI0@rc0aeTLZ?;Tv`v`kQc_l);v+@JTx=yj`MR$yrB0o~hTOyh! zQbgrCbItl3xG%^DJaMa4+Vi7nYh&%+JKZ-b$Mp5|rNEeoQqbuC@Yp__G_>V!k@ljJ zwHN9YO|$Bg?eWJERV)%8eZ_1mDUoFQE}QY7LDd@(3QSXL&a%a0d7b&eK0a|)|G_TS zXs}m_FHr}aVd6B5(bP9kX-cX)z)#{*ddk5vS{ZgYqL^M3=;7hByj$+BGQi4hrY=N4 zMwuaSh0aaOpr4oLqZh}lDQ5fu!XZahHMkKgrs4j1OMpFrj>h29z8Gg5gS$n1yfXLP zvhmt8SVPiDB1hp`?sPo(NG7dQsEhy5&|H-v5_2tcc#muXeJ5Poi;PJ zm_GliUz--*+7YW-DlEr!?rjmYBnFr&yfzg&%_y9KP4-Lea`~kpCFs=Rg6vaaa)5|+ zCstP?xKX~NAa#g4R4j)Ikd~R#KK_wpZvVBp=H<{|O3##Vt0P!!^@H)p5z+4(<(>_h z*&^?7+fyXt{we+^1=W{X?w=&~^QtKuMtru#9{`U~D}oiy9p+&GR62S}@mIhRj&%nt zQsNRNT(NFh%xMfoGIe_hz_6u=?&EU7A*g*;CvqO)sEY`9*UdF;WMPhe#pwQ+C%m94Z+7rA+p#+ z{1+*o8QrM#A1ZZ6;>G3y^x9gSz_6Puu-iGfEbH)L-{WUOBBEP-*O?oMxu75O7bgbq zy`cq&d)Fmz>UO+jV0Nm`4Q6ApdTtZ&ipZ$lAuRY`d10`>ux!Jf%{zFmc(s0MCuSeB z1Xz=j2+{@pXUdi z%y#QQ^^mtCxgDuFYy_~d6yzl*7nvL}*ssX_p({$}NL?aIqN@=)Qd?1*d1#=Oh?Snc zFfBC;uJX2Po(Y=!Ecpc=VqGC3iC2p6SHxted_VKHSKENhXvd|D{&uo`o*(#P18?`9 zJjdq1K6NFHyO=I4s6L6zEl5$fI3f7;bhX*$Sp+^$T?5VH(|SZS)qX0r_8TFaBo)CN zaFBg2>5oWOea5%}G^I$G$lT}jfbPwQOaS*5dQXXDN96jnFnlp`RPUU_g;vQR3->RZZJT(Q;|flyM3enYaRKA>auQm=nFbS@`DToqiP5|g&xT=6dVp8FN=2>#^8Bu$Z71NSp{T2&#Y9`&@SL+zEy zSPdFYPIs0N>v`CG@Vex~ceWn^^HfF=#jmGl^p-Xs{s`}#OTZB5m?7$bu5*hpHA7T_ zLENOOUk^^xEUPF6(orfc$S%ycJQw)rzJw=ar&CZ456&taL z%Z5iKHEvDbuD|{@t2c27zpb>&M5}JVS@V)g4}rtv4(*?3|H&Luh;2y3lYd;=A(u9+ zqg{+dV@)<<$`0y6iNQBNysbWJS{T}tvW2%Wbtf_8hSJHBq@dh8R{DZupCx3PYP=l- zR`XjVt4tn|9)zjj14MdhHlQE*YsN=E!Zakt@P8=#Ysamw5h&(sh1SsI(>9&8fAsT8}MuvlO;I;%QWsPQh9F2 zmE@qCfw~N$Biq4I1J37Wy-$?{p8%@XJ?ieV?p^tn^fWGcx8c)F=tdJ&_iILkWIG$Y z?xFw~VY;bf0T!dee}&!N8WOw^`laP0EV25QJ=JPjnSla^BB&9T19`UHFOEe-K~N0A06_&@X#!)S|9=9yC3Lg`E#=_tYsc4_QZR-SI*LRFSYWtsJ zJV31#_7WTGzN8tw_Ipt)bnK94U3LIe7xm)cU8jw}38iqu&08x)mszxt1-nQzW~LGcgKFre?KscD@N>Ha^q+H9 z>CTOuNln-M^6s+H`mwp!4$y>9gUm$bUPfO^Hzu(y{IpE61ms&Ha{LxKRh<38d9-xH ziV>RNpsq43n%0u_@Kh_{WdL@#GV^2<=wYaL)Ps>BnW&OXQ4f_zo#1Dw5h+1XQQz6g zroXALI9QVz?=4?F^~GTAz57*0rlm(fGS=1?zuvfg(sTBGz#t#+js;%$6&%sGx^aFm zKw8`D2chnTkXY!6C_|GLzguxzj!v54xbvef=A>|Io=&7lyMf_$iWC0hIDXox)^Fn| zV1wGS^UY()E*IUE*DibRLU`QHU)x=o9^atSsgx=mwn|+h)tuXfk0cZVjsORPovway zvu@>?)i_Z1AgAx%xnFq_R50Z%=+nab8y^jkz8f6MjQ-{Q?NC4Qyx=@VMrArxkc<2J z^fR)AN*2;BRO%wFoYU!>tsf0j^ge466v5!+x_BT(&nU#Q{cR1tjMqPDt5!=IT+M#- z*0!b6M4)q6n;PWkPzej@<|M~TN6m!8hiaeK#}crPmPuP$!vl9?2yjRILxyh#HHI8qA#d4KnK0*$lu_AdcVSDEdSz~ubWmDTk`(8?-41ZDR zkp*Xu#53iUCybrGUp}#e@(H(C!5kGC%DsmKd#~SoFin7BI|ls><-oEHW?F}cdKfX0 zb{@#*kjFXC9KUH$ZD-&QYHM>U2l(Z9$>K`c9b?8_h|==h!|ZRr@oKl2%EHOBGWpc} zv&sca;iPkUSovd>)AA-uaiV(j`!ERQmuDXV2W=d6v_oRAJdxsC% z_t6D7sHh_$#5guTX}>9Xz2^z4^b(XXF_qg|5ZV(eC3ht?@IL6~+gA^O)njgM&yk+1 zT-i~%baifzAtRyRPvWk+>_VDxn6MT(y$I*2xg)=h)Jh3+jvCkc$9}>Hlt>25dwZ2U!d;b=Lt}Y{1kq zdC|q!n(c${&vH%ASz2A#dE^7%?NKS5;Jw$p=Jfm1<4-kZ5NN97`BlzDhi(@5I&e&K~$+bIj~ik%gn1nfW5!4 zqAAsyRKO;X@eoybc8@KjhC_dwI%@9X(>^!17vTAi&>-0!Lw!==e(mI)

F%H&8NOge}Fweq7Y~@-)pW(JFD8YwAner(!v747I(IV9yZrjEx6jXnSJQ~L| zfdW3ljGdZz*A9Ov{{3Qn^ZRU6fUsB)KRfCgi2;hkxE2C_c;Rcu`-F(qwgmt=Bcm)S zlui;;Z7x%|Ldpt> z#i83`4{%mq3+lGnO;9u+g+O9kOn3Oer>ZfnCw^z%jYh*n*=|CedDK zb%TpB@%m;LU(UWXx%uieWbK)j;xW0NhHDM`3`ZObW@667r~RG?49OI(Uq0=p zD3PCNdgzt;n{xTC*yG8Ophl409m_944IE|G?xT_N5uj4Jayrd@lQ4;lFL8>K%xIq9cAB(c-1^^x7B5~JFDC}w4Xo&c;rpJR#@^m02YH1) z6dKV~88(Q|a~H0XDSvp7piL}cR^zjXJf5K1aP{^jf${E$xQ4;ZfZa3=sBsv6SL3b6vI5;9=v2!0#cmQ_Q9QE zMUI5KIzF7hA&$!iF|3tqb<_*{vXx)F!IX%Zys};B0v~}_ORZc6Q|EP>&o&QOM^S_} zg|C&77KO{8t+yRVQ}0hGYn}SHij4k!dA)`GoD~?N`&49$I_K~ z%FRtbOxAa`U=}Y4qEpI8(Wnlyhin z(-O{`b548ltI!?EV0X;xzmGE7Vpnf`%r9cp1j@>C|2DIH>(~ukH#$MHWhM5avSRCwNUQ-&pmerYe=S1%-_#4sxkyVcaWhh9( z*+MUHkc?kH1e@*~?V19C{(QU{Ru>^x(Y1ynr#v2wnC!AmCBffl00P@EQ5P5VL)|~NRG1BX3A?Io_Wgdc%JDp)K2GkUGQPaJqSJ5uKfq1U= zA6m^M9wkLXr%ObddC-v;!`NRaJG$*^AT6;WzFJHke;{ zGjUac>VV8fMfLf!Qeb-*DU^OENLYtTv6phWT$dPg{om4asgr?z&rBt(J{n>};=r;jnQqbRs3A9249m z>3rd(5~SU}(4?QFYtL(e>GA1mHXmC|U!Ke0fZ11@NWN2nQiDCWr7HV^W*VHcM?f7a z4~6RtuAfmyjvVG6MxH+ww3CGb^puDZrPkEKX~;sq>Bae!$9BqIB0=yoMRB$7yerAP zUk)@hIM^*)zCWU|zM&!L#v*ceHBtx%C1jzCjJnPrgWXD)hZ9aA72`Cju6Z;c_#$`B z_>5#>MCp}1JHkBvsQYP#1X6j&(hT4CBQh~#x?y=HW|Hsabs(dP(k8$CY&1K`1?q?lM%zL2~G2_)H1j!nQGgJjGr{0r)1O(K+?M3Jv*MvtvaI zkJT?(t0W&%xU02`^wfwd)+9#qQU`*rdi1=zLwREqdG0jTe=bcjViY(Dd5!*WBB?%7B6+lc_IGT(P}6B8@QTj$vr;HF ze(a$3jdzE~#j%>W`sR)(-6uI+?9P}}b$f+CJxRctiviMvbes#rTU{pmf%%L{-8#G& zAe26QE>+E=+6bA%u`8ZQ&l5r!>mt|S>N8p>4SYfmf^o4nT@9-3kkXZNH&%7k{|Vej zR@Z1)nW%+3B~n=C%`Tw*P-r)mh-h8nS-X2pnJ)g|383>wO?=OA%{L8pe5?P2ls(96 z7l;Dghso87Li;>$+P^g-hnw*2KUn&JmyJ&nV@0gylR65QBAimZc3Vhq4#pI34e-pL zUHWFV3>ozPVRgUs>rXwE+JGxw6%v$MhbP)Y6OSMrRhN-XTBA7TmUDr5?+>2`UG9gD zGp|Q>1a9ao6%+$Yi(c5cy-JiNA9* zss#wBJ`xnE=&HnE*n=|yhnJzOpf$kZ1KE{bKWqL}Dw@+XE;{3r&Rr(T1m>rc;+H;u zXxDC9ksT$V8cjOo+s_Yj3ox$3?X;p`(g7L{V=>u*d0n!#@OketulLK(zAqWUD>bMS z+Iqx8eUDvkA+>)!-={cCz?!ycfBg2poXol)Lf()zdx%{S$76~TO2y&o0cvx6#?B>O z)sfe|X_9dHjBjN0N}p=|b>A=Q2yhxl*yVGo;nAufa*~CT0^hvp0^Wl0T=TCzXui0S zR^)AD9_^w#8fmz59_pzATI^-@sMTj_I|eEcwU|!pzbrb}zHM*LVicZ{|Fo?|-E!1_ zhvFqIwuW=X@1=s*#1^!(hH%wP5qdY?Az|;e+oICIAsT2F;OnyYozKN+QgJ1j@;;r_ zKc;7T<@mXMw10Q9jnZnoAdN@5?uOq7kEtgq+MUo=q+ncn>_WOvvzE*j{t<1nmRoFQ3`>d2Ae(>Pzr-Q7*UGjbTd z9-uq^>s^T#jZza9PwVMBSQU*nohLSlTA^}wR>ViY2YcUhWRy_ERu()!vzQ-jwhaAA(Jx8kBWnXu9k2;g z6JMnWV2?`x*&d^cx#07dR%|5ld%{pg8HYpt+%!J<+U_kNG<9a14pB4*X3ZBA^@nhS zZh0#w;p2BAE&-DA{k4(*lOX7FDC#m?Vqy@k=!bz2H|TOJYFG*cSR_>;iV#viFLbEK zLjDYZ;asajie;s1dL`uT?&Po#Nlldj&s%j2Cny0#7#dGe%ttQytz3s9*7Ty>-_t}L zHcJoWZRQcxrmogF1`NwQ3Cfh#Z|{-hUuVdgsj72kuYR6kJu1|da^6Oq5=iTj-fKJ# zy{wmL9QtJbii6kibeB$e9(3~HG3ASGUMG*h9`u!HP{;NUV~~San2OfA$-7s1MeS+Y zajE@=GU-3FP&!)u=plor(ixr`Ay^mdYG)ig(93a)dKdGv4fjl-KW!HZ%)5AL)iAo; zAC)z(<$L~!)uR!4gp3N@px+jlF`q;c=Uq*)854T{6#JR;yEX!xWgIcZ)`xs3?A9T_ zl3)@6fK&>P>V+hiLhxBaG=YFYpvynVpd2mTmdyuP<_Hy8AlJ;1Lu`!(L7THk~R1OOq%uj4l7c1ffjUWE&^kW&#Y;@-XRPiTh5;v Nz${pi!IOW?{tupjMDzdv diff --git a/data-raw/discovery-doc-prep.R b/data-raw/discovery-doc-prep.R index d7eb628ae..a0793b696 100644 --- a/data-raw/discovery-doc-prep.R +++ b/data-raw/discovery-doc-prep.R @@ -4,6 +4,10 @@ source( system.file("discovery-doc-ingest", "ingest-functions.R", package = "gargle") ) +# if my use of schemas works out well, maybe this will migrate upstream into +# gargle and join the other ingest helpers +source(here::here("data-raw", "schema-rectangling.R")) + x <- download_discovery_document("sheets:v4") dd <- read_discovery_document(x) @@ -23,4 +27,21 @@ attr(.endpoints, "base_url") <- dd$rootUrl # to the "flattened" or "inlined" representation currently in .endpoints .schemas <- pluck(dd, "schemas") -usethis::use_data(.endpoints, .schemas, internal = TRUE, overwrite = TRUE) +these <- c( + "Spreadsheet", + "SpreadsheetProperties", + "Sheet", + "SheetProperties", + "NamedRange", + "GridRange" +) + +.tidy_schemas <- these %>% + set_names() %>% + map(schema_rectangle) +# View(.tidy_schemas) + +usethis::use_data( + .endpoints, .schemas, .tidy_schemas, + internal = TRUE, overwrite = TRUE +) diff --git a/data-raw/schema-rectangling.R b/data-raw/schema-rectangling.R new file mode 100644 index 000000000..f72bed807 --- /dev/null +++ b/data-raw/schema-rectangling.R @@ -0,0 +1,50 @@ +schema_rectangle <- function(s) { + if (!"tidyverse" %in% .packages()) { + stop("Attach the tidyverse package before using schema_rectangle()") + } + schema <- pluck(.schemas, s) + if (schema$type != "object") { + msg <- glue::glue( + "Schema must be of type {sq('object')}, not {sq(schema$type)}" + ) + stop(msg) + } + + properties <- pluck(schema, "properties") + scaffold <- list( + description = "Just a placeholder", + type = "scaffold", + "$ref" = "SCHEMA", + items = list("$ref" = "SCHEMA"), + format = "FORMAT", + enum = letters[1:3], + enumDescriptions = LETTERS[1:3] + ) + df <- tibble(properties = c(scaffold = list(scaffold), properties)) + + df <- df %>% + mutate(property = names(properties)) %>% + select(property, everything()) %>% + unnest_wider(properties) %>% + select(-description) %>% + mutate(type = replace_na(type, "object")) %>% + rename(instance_of = "$ref") + + # workaround for https://github.com/tidyverse/tidyr/issues/806 + repair <- function(x) { + map_if(x, ~ inherits(.x, "vctrs_unspecified"), ~ vctrs::unspecified(0)) + } + df <- modify_if(df, is_list, repair) + + df <- df %>% + hoist(items, array_of = "$ref") + + df <- df %>% + mutate(new = map2(enum, enumDescriptions, ~ tibble(enum = .x, enumDesc = .y))) %>% + select(-starts_with("enum")) %>% + rename(enum = new) %>% + mutate(type = if_else(map_lgl(enum, ~ nrow(.x) > 0), "enum", type)) + + df %>% + filter(property != "scaffold") +} From ebf1c86fc0765bd5c2bc68c93eff3ffe2bb4208a Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Thu, 21 Nov 2019 10:09:15 -0800 Subject: [PATCH 09/28] Import imap --- NAMESPACE | 1 + R/googlesheets4-package.R | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/NAMESPACE b/NAMESPACE index 31805e397..45049e380 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -53,6 +53,7 @@ importFrom(purrr,"%||%") importFrom(purrr,compact) importFrom(purrr,discard) importFrom(purrr,flatten) +importFrom(purrr,imap) importFrom(purrr,keep) importFrom(purrr,map) importFrom(purrr,map2) diff --git a/R/googlesheets4-package.R b/R/googlesheets4-package.R index e101fc157..bb2b05c1f 100644 --- a/R/googlesheets4-package.R +++ b/R/googlesheets4-package.R @@ -1,4 +1,4 @@ #' @keywords internal #' @importFrom purrr %||% map_lgl map_int map_dbl map_chr map map2 pluck walk -#' pmap_chr set_names discard keep flatten modify_if compact transpose +#' pmap_chr set_names discard keep flatten modify_if compact transpose imap "_PACKAGE" From 3f76282d5ff00ed98d3848415593ac94813f4e4f Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Thu, 21 Nov 2019 10:10:04 -0800 Subject: [PATCH 10/28] Reboot the schema <--> S3 strategy --- R/schema_GridRange.R | 15 -------- R/schema_NamedRange.R | 11 ------ R/schema_Sheet.R | 29 ++++----------- R/schema_SheetProperties.R | 22 ----------- R/schema_Spreadsheet.R | 21 +---------- R/schema_SpreadsheetProperties.R | 17 --------- R/schemas.R | 51 ++++++++++++++++++++++++++ R/sheets_create.R | 25 ++++--------- tests/testthat/test-schemas.R | 63 ++++++++++++++++++++++++++++++++ 9 files changed, 130 insertions(+), 124 deletions(-) delete mode 100644 R/schema_GridRange.R delete mode 100644 R/schema_NamedRange.R delete mode 100644 R/schema_SpreadsheetProperties.R create mode 100644 R/schemas.R create mode 100644 tests/testthat/test-schemas.R diff --git a/R/schema_GridRange.R b/R/schema_GridRange.R deleted file mode 100644 index c2590c683..000000000 --- a/R/schema_GridRange.R +++ /dev/null @@ -1,15 +0,0 @@ -# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/other#GridRange -GridRange <- function(sheetId, - startRowIndex, - endRowIndex, - startColumnIndex, - endColumnIndex) { - x <- list( - sheetId = sheetId, - startRowIndex = startRowIndex, - endRowIndex = endRowIndex, - startColumnIndex = startColumnIndex, - endColumnIndex = endColumnIndex - ) - structure(x, class = "GridRange") -} diff --git a/R/schema_NamedRange.R b/R/schema_NamedRange.R deleted file mode 100644 index fe2f3b996..000000000 --- a/R/schema_NamedRange.R +++ /dev/null @@ -1,11 +0,0 @@ -# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#NamedRange -NamedRange <- function(namedRangeId, - name, - range) { - x <- list( - namedRangeId = namedRangeId, - name = name, - range = range - ) - structure(x, class = "NamedRange") -} diff --git a/R/schema_Sheet.R b/R/schema_Sheet.R index 0412f89c6..9823db93c 100644 --- a/R/schema_Sheet.R +++ b/R/schema_Sheet.R @@ -1,22 +1,9 @@ -# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#Sheet -Sheet <- function(properties = SheetProperties(), - data = NULL) { - # an instance of Sheet potentially has MANY more fields - # I'm just starting with the ones I plan to use soon - x <- list( - properties = properties, - data = data - ) - structure(x, class = "Sheet") -} - tibblify_Sheet <- function(x) { - out <- tibblify_SheetProperties(do.call(SheetProperties, x$properties)) + out <- tibblify_SheetProperties(new_from_schema("SheetProperties", !!!x$properties)) # TODO: come back to deal with `data` tibble::add_column(out, data = list(NULL)) } -#' @export as_Sheet <- function(df, name) { UseMethod("as_Sheet") } @@ -28,24 +15,22 @@ as_Sheet.default <- function(df, name) { ) } -as_Sheet.tibble <- function(df, name) { - NextMethod() -} - as_Sheet.data.frame <- function(df, name) { check_string(name) - compact(Sheet( - properties = compact(SheetProperties( + x <- new_from_schema( + id = "Sheet", + properties = new_from_schema( + id = "SheetProperties", title = name, # TODO: not making room for col_names here yet gridProperties = list(rowCount = nrow(df), columnCount = ncol(df)) - )), + ), data = list( # an array of instances of GridData list( rowData = as_RowData(df) # an array of instances of RowData ) ) - )) + ) } as_RowData <- function(df) { diff --git a/R/schema_SheetProperties.R b/R/schema_SheetProperties.R index 687d59340..0e9d24f27 100644 --- a/R/schema_SheetProperties.R +++ b/R/schema_SheetProperties.R @@ -1,25 +1,3 @@ -# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets/sheets#SheetProperties -SheetProperties <- function(sheetId = NULL, - title = NULL, - index = NULL, - sheetType = NULL, - gridProperties = NULL, - hidden = NULL, - tabColor = NULL, - rightToLeft = NULL) { - x <- list( - sheetId = sheetId, - title = title, - index = index, - sheetType = sheetType, # enum - gridProperties = gridProperties, # unimplemented schema - hidden = hidden, - tabColor = tabColor, # schema - rightToLeft = rightToLeft - ) - structure(x, class = c("SheetProperties", "list")) -} - tibblify_SheetProperties <- function(x) { # weird-looking workaround for the (current) lack of typed pluck() # revisit this when I depend on vctrs directly diff --git a/R/schema_Spreadsheet.R b/R/schema_Spreadsheet.R index fef6fe03e..fb463139c 100644 --- a/R/schema_Spreadsheet.R +++ b/R/schema_Spreadsheet.R @@ -1,21 +1,3 @@ -# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#Spreadsheet -Spreadsheet <- function(spreadsheetId = NULL, - properties = SpreadsheetProperties(), - sheets = NULL, - namedRanges = NULL, - spreadsheetUrl = NULL, - developerMetadata = NULL) { - x <- list( - spreadsheetId = spreadsheetId, - properties = properties, - sheets = sheets, - namedRanges = namedRanges, - spreadsheetUrl = spreadsheetUrl, - developerMetadata = developerMetadata - ) - structure(x, class = "Spreadsheet") -} - # input: instance of Spreadsheet, in the Sheets API sense, as a named list # output: instance of sheets_Spreadsheet, which is how I want to hold this info sheets_Spreadsheet <- function(x = list()) { @@ -29,8 +11,7 @@ sheets_Spreadsheet <- function(x = list()) { out <- map(ours_theirs, ~ pluck(x, !!!.x)) if (!is.null(x$sheets)) { - sheets <- map(x$sheets, ~ do.call(Sheet, .x)) - sheets <- map(sheets, tibblify_Sheet) + sheets <- map(x$sheets, tibblify_Sheet) out$sheets <- do.call(rbind, sheets) } diff --git a/R/schema_SpreadsheetProperties.R b/R/schema_SpreadsheetProperties.R deleted file mode 100644 index 9d8174e91..000000000 --- a/R/schema_SpreadsheetProperties.R +++ /dev/null @@ -1,17 +0,0 @@ -# https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets#SpreadsheetProperties -SpreadsheetProperties <- function(title, - locale = NULL, - autoRecalc = NULL, - timeZone = NULL, - defaultFormat = NULL, - iterativeCalculationSettings = NULL) { - x <- list( - title = title, - locale = locale, - autoRecalc = autoRecalc, # enum - timeZone = timeZone, - defaultFormat = defaultFormat, # unimplemented schema - iterativeCalculationSettings = iterativeCalculationSettings # unimplemented schema - ) - structure(x, class = c("SpreadsheetProperties", "list")) -} diff --git a/R/schemas.R b/R/schemas.R new file mode 100644 index 000000000..1084d0d88 --- /dev/null +++ b/R/schemas.R @@ -0,0 +1,51 @@ +new_from_schema <- function(id, ...) { + schema <- .tidy_schemas[[id]] + if (is.null(schema)) { + rlang::abort(glue("Can't find a tidy schema with id {sq(id)}")) + } + dots <- rlang::list2(...) + + check_against_schema(dots, schema = schema, id = id) + + structure( + dots, + class = c(id_as_class(id), "googlesheets4_schema", "list"), + schema = schema + ) +} + +# TODO: if it proves necessary, this could do more meaningful checks +check_against_schema <- function(properties, schema, id) { + unexpected <- setdiff(names(properties), schema$property) + if (length(unexpected) > 0) { + msg <- glue(" + Properties not recognized for the {sq(id)} schema: + * {glue_collapse(unexpected, sep = ', ')} + ") + rlang::abort(msg) + } + invisible(properties) +} + +id_as_class <- function(id) glue("googlesheets4_{id}") + +id_from_class <- function(x) { + m <- grep("^googlesheets4_", class(x), value = TRUE)[[1]] + sub("^googlesheets4_", "", m) +} + +# patch ---- +patch <- function(x, ...) { + UseMethod("patch") +} + +patch.default <- function(x, ...) { + stop_glue(" + Don't know how to {bt('patch()')} an object of class {class_collapse(x)} + ") +} + +patch.googlesheets4_schema <- function(x, ...) { + dots <- rlang::list2(...) + new_from_schema(id_from_class(x), !!!utils::modifyList(x, dots)) +} diff --git a/R/sheets_create.R b/R/sheets_create.R index f8ec97b67..8de0250cb 100644 --- a/R/sheets_create.R +++ b/R/sheets_create.R @@ -29,27 +29,18 @@ #' ) #' } sheets_create <- function(name, ..., sheets = NULL) { - # TODO: do I care that this loses the SpreadsheetProperties class? - ss_props <- compact(SpreadsheetProperties(title = name, ...)) - # ss_sheets <- list( - # new_Sheet(iris, "yo"), - # compact(Sheet( - # properties = compact(SheetProperties( - # title = "foofy", - # gridProperties = list(rowCount = 3, columnCount = 5) - # )) - # )) - # ) - ss_sheets <- NULL + ss_body <- new_from_schema("Spreadsheet") %>% + patch(properties = new_from_schema( + id = "SpreadsheetProperties", + title = name, ... + )) if (!is.null(sheets)) { - ss_sheets <- unname(purrr::imap(sheets, as_Sheet)) + ss_body <- ss_body %>% + patch(sheets = unname(imap(sheets, as_Sheet))) } req <- request_generate( "sheets.spreadsheets.create", - params = compact(Spreadsheet( - properties = ss_props, - sheets = ss_sheets - )) + params = ss_body ) raw_resp <- request_make(req) resp <- gargle::response_process(raw_resp) diff --git a/tests/testthat/test-schemas.R b/tests/testthat/test-schemas.R new file mode 100644 index 000000000..3146e7e49 --- /dev/null +++ b/tests/testthat/test-schemas.R @@ -0,0 +1,63 @@ +test_that("new_from_schema() errors for non-existing id", { + expect_error(new_from_schema("I_don't_exist"), "Can't find") +}) + +test_that("new_from_schema() works (and doesn't require data)", { + out <- new_from_schema("Spreadsheet") + expect_length(out, 0) + expect_s3_class(out, "googlesheets4_Spreadsheet") + expect_s3_class(out, "googlesheets4_schema") + expect_s3_class(attr(out, "schema"), "tbl_df") +}) + +test_that("new_from_schema() accepts data expected for schema", { + out <- new_from_schema("Spreadsheet", spreadsheetId = "abc") + expect_identical(out$spreadsheetId, "abc") +}) + +test_that("new_from_schema() rejects data not expected for schema", { + expect_error( + new_from_schema("Spreadsheet", foofy = "blah"), + "not recognized" + ) + expect_error( + new_from_schema("Spreadsheet", foofy = "blah", foo = "bar"), + "foofy, foo" + ) +}) + +test_that("patch() fails informatively for non-schema input", { + expect_error(patch(1), "Don't know how") +}) + +test_that("patch() with no data passes input through", { + out <- new_from_schema("Spreadsheet", spreadsheetId = "abc") + expect_identical(out, patch(out)) +}) + +test_that("patch() accepts data expected for schema", { + expect_identical( + new_from_schema("Spreadsheet", spreadsheetId = "abc"), + new_from_schema("Spreadsheet") %>% patch(spreadsheetId = "abc") + ) +}) + +test_that("patch() rejects data not expected for schema", { + x <- new_from_schema("Spreadsheet") + expect_error(patch(x, foofy = "blah"), "not recognized") +}) + +test_that("patch() overwrites existing data", { + x <- new_from_schema("Spreadsheet", spreadsheetId = "abc") + x <- patch(x, spreadsheetId = "xyz") + expect_identical(x$spreadsheetId, "xyz") + expect_length(x, 1) +}) + +test_that("patch() retains classes", { + x <- new_from_schema("Spreadsheet") + classes_in <- class(x) + x <- patch(x, spreadsheetId = "abc") + classes_out <- class(x) + expect_identical(classes_in, classes_out) +}) From 8f8d8a49e32c9ca28adb098ad691a16466706ceb Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Thu, 21 Nov 2019 10:31:06 -0800 Subject: [PATCH 11/28] Revise tibblify --- NAMESPACE | 2 + R/schema_Sheet.R | 5 +- R/schema_SheetProperties.R | 3 +- R/schema_Spreadsheet.R | 3 +- R/schemas.R | 13 +++- README.md | 77 +++++++++++------------ index.md | 126 ++++++++++++++++++------------------- 7 files changed, 121 insertions(+), 108 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 45049e380..f02cf1a01 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -13,6 +13,8 @@ S3method(ctype,default) S3method(ctype,list) S3method(format,sheets_Spreadsheet) S3method(print,sheets_Spreadsheet) +S3method(tibblify,googlesheets4_Sheet) +S3method(tibblify,googlesheets4_SheetProperties) export("%>%") export(anchored) export(as_sheets_id) diff --git a/R/schema_Sheet.R b/R/schema_Sheet.R index 9823db93c..a41ab62ab 100644 --- a/R/schema_Sheet.R +++ b/R/schema_Sheet.R @@ -1,5 +1,6 @@ -tibblify_Sheet <- function(x) { - out <- tibblify_SheetProperties(new_from_schema("SheetProperties", !!!x$properties)) +#' @export +tibblify.googlesheets4_Sheet <- function(x, ...) { + out <- tibblify(new_from_schema("SheetProperties", !!!x$properties)) # TODO: come back to deal with `data` tibble::add_column(out, data = list(NULL)) } diff --git a/R/schema_SheetProperties.R b/R/schema_SheetProperties.R index 0e9d24f27..891937e6c 100644 --- a/R/schema_SheetProperties.R +++ b/R/schema_SheetProperties.R @@ -1,4 +1,5 @@ -tibblify_SheetProperties <- function(x) { +#' @export +tibblify.googlesheets4_SheetProperties <- function(x, ...) { # weird-looking workaround for the (current) lack of typed pluck() # revisit this when I depend on vctrs directly x <- list(x) diff --git a/R/schema_Spreadsheet.R b/R/schema_Spreadsheet.R index fb463139c..2a558851d 100644 --- a/R/schema_Spreadsheet.R +++ b/R/schema_Spreadsheet.R @@ -11,7 +11,8 @@ sheets_Spreadsheet <- function(x = list()) { out <- map(ours_theirs, ~ pluck(x, !!!.x)) if (!is.null(x$sheets)) { - sheets <- map(x$sheets, tibblify_Sheet) + sheets <- map(x$sheets, ~ new_from_schema("Sheet", !!!.x)) + sheets <- map(sheets, tibblify) out$sheets <- do.call(rbind, sheets) } diff --git a/R/schemas.R b/R/schemas.R index 1084d0d88..2ff605e1e 100644 --- a/R/schemas.R +++ b/R/schemas.R @@ -41,7 +41,7 @@ patch <- function(x, ...) { patch.default <- function(x, ...) { stop_glue(" - Don't know how to {bt('patch()')} an object of class {class_collapse(x)} + Don't know how to {bt('patch()')} an object of class {class_collapse(x)} ") } @@ -49,3 +49,14 @@ patch.googlesheets4_schema <- function(x, ...) { dots <- rlang::list2(...) new_from_schema(id_from_class(x), !!!utils::modifyList(x, dots)) } + +# tibblify ---- +tibblify <- function(x, ...) { + UseMethod("tibblify") +} + +tibblify.default <- function(x, ...) { + stop_glue(" + Don't know how to {bt('tibblify()')} an object of class {class_collapse(x)} + ") +} diff --git a/README.md b/README.md index 6b53528bf..8e327a1c6 100644 --- a/README.md +++ b/README.md @@ -79,13 +79,13 @@ sheets_example("chicken-sheet") %>% #> Reading from 'chicken-sheet' #> #> # A tibble: 5 x 4 -#> chicken breed sex motto -#> -#> 1 Foghorn Leghorn Leghorn roost… That's a joke, ah say, that's a jo… -#> 2 Chicken Little unknown hen The sky is falling! -#> 3 Ginger Rhode Islan… hen Listen. We'll either die free chic… -#> 4 Camilla the Chic… Chantecler hen Bawk, buck, ba-gawk. -#> 5 Ernie The Giant … Brahma roost… Put Captain Solo in the cargo hold. +#> chicken breed sex motto +#> +#> 1 Foghorn Leghorn Leghorn roost… That's a joke, ah say, that's a joke,… +#> 2 Chicken Little unknown hen The sky is falling! +#> 3 Ginger Rhode Island… hen Listen. We'll either die free chicken… +#> 4 Camilla the Chick… Chantecler hen Bawk, buck, ba-gawk. +#> 5 Ernie The Giant C… Brahma roost… Put Captain Solo in the cargo hold. ``` Read specific cells, from a specific sheet, using an A1-style notation: @@ -96,19 +96,18 @@ sheets_example("deaths") %>% #> Reading from 'deaths' #> Range "'arts'!A5:F15" #> # A tibble: 10 x 6 -#> Name Profession Age `Has kids` `Date of birth` -#> -#> 1 Davi… musician 69 TRUE 1947-01-08 00:00:00 -#> 2 Carr… actor 60 TRUE 1956-10-21 00:00:00 -#> 3 Chuc… musician 90 TRUE 1926-10-18 00:00:00 -#> 4 Bill… actor 61 TRUE 1955-05-17 00:00:00 -#> 5 Prin… musician 57 TRUE 1958-06-07 00:00:00 -#> 6 Alan… actor 69 FALSE 1946-02-21 00:00:00 -#> 7 Flor… actor 82 TRUE 1934-02-14 00:00:00 -#> 8 Harp… author 89 FALSE 1926-04-28 00:00:00 -#> 9 Zsa … actor 99 TRUE 1917-02-06 00:00:00 -#> 10 Geor… musician 53 FALSE 1963-06-25 00:00:00 -#> # … with 1 more variable: `Date of death` +#> Name Profession Age `Has kids` `Date of birth` `Date of death` +#> +#> 1 David Bo… musician 69 TRUE 1947-01-08 00:00:00 2016-01-10 00:00:00 +#> 2 Carrie F… actor 60 TRUE 1956-10-21 00:00:00 2016-12-27 00:00:00 +#> 3 Chuck Be… musician 90 TRUE 1926-10-18 00:00:00 2017-03-18 00:00:00 +#> 4 Bill Pax… actor 61 TRUE 1955-05-17 00:00:00 2017-02-25 00:00:00 +#> 5 Prince musician 57 TRUE 1958-06-07 00:00:00 2016-04-21 00:00:00 +#> 6 Alan Ric… actor 69 FALSE 1946-02-21 00:00:00 2016-01-14 00:00:00 +#> 7 Florence… actor 82 TRUE 1934-02-14 00:00:00 2016-11-24 00:00:00 +#> 8 Harper L… author 89 FALSE 1926-04-28 00:00:00 2016-02-19 00:00:00 +#> 9 Zsa Zsa … actor 99 TRUE 1917-02-06 00:00:00 2016-12-18 00:00:00 +#> 10 George M… musician 53 FALSE 1963-06-25 00:00:00 2016-12-25 00:00:00 ``` Read from a named range or region and specify (some of the ) column @@ -120,18 +119,18 @@ sheets_example("deaths") %>% #> Reading from 'deaths' #> Range "arts_data" #> # A tibble: 10 x 6 -#> Name Profession Age `Has kids` `Date of birth` `Date of death` -#> -#> 1 David Bowie musician 69 TRUE 1947-01-08 2016-01-10 -#> 2 Carrie Fish… actor 60 TRUE 1956-10-21 2016-12-27 -#> 3 Chuck Berry musician 90 TRUE 1926-10-18 2017-03-18 -#> 4 Bill Paxton actor 61 TRUE 1955-05-17 2017-02-25 -#> 5 Prince musician 57 TRUE 1958-06-07 2016-04-21 -#> 6 Alan Rickman actor 69 FALSE 1946-02-21 2016-01-14 -#> 7 Florence He… actor 82 TRUE 1934-02-14 2016-11-24 -#> 8 Harper Lee author 89 FALSE 1926-04-28 2016-02-19 -#> 9 Zsa Zsa Gáb… actor 99 TRUE 1917-02-06 2016-12-18 -#> 10 George Mich… musician 53 FALSE 1963-06-25 2016-12-25 +#> Name Profession Age `Has kids` `Date of birth` `Date of death` +#> +#> 1 David Bowie musician 69 TRUE 1947-01-08 2016-01-10 +#> 2 Carrie Fisher actor 60 TRUE 1956-10-21 2016-12-27 +#> 3 Chuck Berry musician 90 TRUE 1926-10-18 2017-03-18 +#> 4 Bill Paxton actor 61 TRUE 1955-05-17 2017-02-25 +#> 5 Prince musician 57 TRUE 1958-06-07 2016-04-21 +#> 6 Alan Rickman actor 69 FALSE 1946-02-21 2016-01-14 +#> 7 Florence Henders… actor 82 TRUE 1934-02-14 2016-11-24 +#> 8 Harper Lee author 89 FALSE 1926-04-28 2016-02-19 +#> 9 Zsa Zsa Gábor actor 99 TRUE 1917-02-06 2016-12-18 +#> 10 George Michael musician 53 FALSE 1963-06-25 2016-12-25 ``` There are various ways to specify the target Sheet. The simplest, but @@ -144,13 +143,13 @@ read_sheet(url) #> Reading from 'chicken-sheet' #> #> # A tibble: 5 x 4 -#> chicken breed sex motto -#> -#> 1 Foghorn Leghorn Leghorn roost… That's a joke, ah say, that's a jo… -#> 2 Chicken Little unknown hen The sky is falling! -#> 3 Ginger Rhode Islan… hen Listen. We'll either die free chic… -#> 4 Camilla the Chic… Chantecler hen Bawk, buck, ba-gawk. -#> 5 Ernie The Giant … Brahma roost… Put Captain Solo in the cargo hold. +#> chicken breed sex motto +#> +#> 1 Foghorn Leghorn Leghorn roost… That's a joke, ah say, that's a joke,… +#> 2 Chicken Little unknown hen The sky is falling! +#> 3 Ginger Rhode Island… hen Listen. We'll either die free chicken… +#> 4 Camilla the Chick… Chantecler hen Bawk, buck, ba-gawk. +#> 5 Ernie The Giant C… Brahma roost… Put Captain Solo in the cargo hold. ``` For more information, see the package website: diff --git a/index.md b/index.md index 3bc6b01ef..3414d0004 100644 --- a/index.md +++ b/index.md @@ -75,9 +75,9 @@ library(googlesheets4) (deaths <- drive_get("deaths")) #> # A tibble: 1 x 4 -#> name path id drive_resource -#> -#> 1 deaths ~/deaths 1tuYKzSbLukDLe5ymf_ZKdQA8SfOyeMM7rmf6D6… name path id drive_resource +#> +#> 1 deaths ~/deaths 1tuYKzSbLukDLe5ymf_ZKdQA8SfOyeMM7rmf6D6NJpxg ``` Pass the result to googlesheets4 functions such as: @@ -112,11 +112,11 @@ read_sheet(deaths, range = "A5:F8") #> Reading from 'deaths' #> Range "A5:F8" #> # A tibble: 3 x 6 -#> Name Profession Age `Has kids` `Date of birth` `Date of death` -#> -#> 1 Davi… musician 69 TRUE 1947-01-08 00:00:00 2016-01-10 00:00:00 -#> 2 Carr… actor 60 TRUE 1956-10-21 00:00:00 2016-12-27 00:00:00 -#> 3 Chuc… musician 90 TRUE 1926-10-18 00:00:00 2017-03-18 00:00:00 +#> Name Profession Age `Has kids` `Date of birth` `Date of death` +#> +#> 1 David Bow… musician 69 TRUE 1947-01-08 00:00:00 2016-01-10 00:00:00 +#> 2 Carrie Fi… actor 60 TRUE 1956-10-21 00:00:00 2016-12-27 00:00:00 +#> 3 Chuck Ber… musician 90 TRUE 1926-10-18 00:00:00 2017-03-18 00:00:00 ``` If you’re willing to refer to the spreadsheet by id (or URL), just @@ -222,19 +222,18 @@ read_sheet(sheets_example("deaths"), skip = 4, n_max = 10) #> Reading from 'deaths' #> Range "5:5000000" #> # A tibble: 10 x 6 -#> Name Profession Age `Has kids` `Date of birth` -#> -#> 1 Davi… musician 69 TRUE 1947-01-08 00:00:00 -#> 2 Carr… actor 60 TRUE 1956-10-21 00:00:00 -#> 3 Chuc… musician 90 TRUE 1926-10-18 00:00:00 -#> 4 Bill… actor 61 TRUE 1955-05-17 00:00:00 -#> 5 Prin… musician 57 TRUE 1958-06-07 00:00:00 -#> 6 Alan… actor 69 FALSE 1946-02-21 00:00:00 -#> 7 Flor… actor 82 TRUE 1934-02-14 00:00:00 -#> 8 Harp… author 89 FALSE 1926-04-28 00:00:00 -#> 9 Zsa … actor 99 TRUE 1917-02-06 00:00:00 -#> 10 Geor… musician 53 FALSE 1963-06-25 00:00:00 -#> # … with 1 more variable: `Date of death` +#> Name Profession Age `Has kids` `Date of birth` `Date of death` +#> +#> 1 David Bo… musician 69 TRUE 1947-01-08 00:00:00 2016-01-10 00:00:00 +#> 2 Carrie F… actor 60 TRUE 1956-10-21 00:00:00 2016-12-27 00:00:00 +#> 3 Chuck Be… musician 90 TRUE 1926-10-18 00:00:00 2017-03-18 00:00:00 +#> 4 Bill Pax… actor 61 TRUE 1955-05-17 00:00:00 2017-02-25 00:00:00 +#> 5 Prince musician 57 TRUE 1958-06-07 00:00:00 2016-04-21 00:00:00 +#> 6 Alan Ric… actor 69 FALSE 1946-02-21 00:00:00 2016-01-14 00:00:00 +#> 7 Florence… actor 82 TRUE 1934-02-14 00:00:00 2016-11-24 00:00:00 +#> 8 Harper L… author 89 FALSE 1926-04-28 00:00:00 2016-02-19 00:00:00 +#> 9 Zsa Zsa … actor 99 TRUE 1917-02-06 00:00:00 2016-12-18 00:00:00 +#> 10 George M… musician 53 FALSE 1963-06-25 00:00:00 2016-12-25 00:00:00 read_sheet( sheets_example("deaths"), range = "other!A5:F15", col_types = "?ci??D" @@ -242,18 +241,18 @@ read_sheet( #> Reading from 'deaths' #> Range "'other'!A5:F15" #> # A tibble: 10 x 6 -#> Name Profession Age `Has kids` `Date of birth` `Date of death` -#> -#> 1 Vera Ru… scientist 88 TRUE 1928-07-23 00:00:00 2016-12-25 -#> 2 Mohamed… athlete 74 TRUE 1942-01-17 00:00:00 2016-06-03 -#> 3 Morley … journalist 84 TRUE 1931-11-08 00:00:00 2016-05-19 -#> 4 Fidel C… politician 90 TRUE 1926-08-13 00:00:00 2016-11-25 -#> 5 Antonin… lawyer 79 TRUE 1936-03-11 00:00:00 2016-02-13 -#> 6 Jo Cox politician 41 TRUE 1974-06-22 00:00:00 2016-06-16 -#> 7 Janet R… lawyer 78 FALSE 1938-07-21 00:00:00 2016-11-07 -#> 8 Gwen If… journalist 61 FALSE 1955-09-29 00:00:00 2016-11-14 -#> 9 John Gl… astronaut 95 TRUE 1921-07-28 00:00:00 2016-12-08 -#> 10 Pat Sum… coach 64 TRUE 1952-06-14 00:00:00 2016-06-28 +#> Name Profession Age `Has kids` `Date of birth` `Date of death` +#> +#> 1 Vera Rubin scientist 88 TRUE 1928-07-23 00:00:00 2016-12-25 +#> 2 Mohamed Ali athlete 74 TRUE 1942-01-17 00:00:00 2016-06-03 +#> 3 Morley Safer journalist 84 TRUE 1931-11-08 00:00:00 2016-05-19 +#> 4 Fidel Castro politician 90 TRUE 1926-08-13 00:00:00 2016-11-25 +#> 5 Antonin Scal… lawyer 79 TRUE 1936-03-11 00:00:00 2016-02-13 +#> 6 Jo Cox politician 41 TRUE 1974-06-22 00:00:00 2016-06-16 +#> 7 Janet Reno lawyer 78 FALSE 1938-07-21 00:00:00 2016-11-07 +#> 8 Gwen Ifill journalist 61 FALSE 1955-09-29 00:00:00 2016-11-14 +#> 9 John Glenn astronaut 95 TRUE 1921-07-28 00:00:00 2016-12-08 +#> 10 Pat Summit coach 64 TRUE 1952-06-14 00:00:00 2016-06-28 ``` If you looked at the `deaths` spreadsheet in the browser (it’s @@ -276,19 +275,18 @@ sheets_example("deaths") %>% #> Reading from 'deaths' #> Range "arts_data" #> # A tibble: 10 x 6 -#> Name Profession Age `Has kids` `Date of birth` -#> -#> 1 Davi… musician 69 TRUE 1947-01-08 00:00:00 -#> 2 Carr… actor 60 TRUE 1956-10-21 00:00:00 -#> 3 Chuc… musician 90 TRUE 1926-10-18 00:00:00 -#> 4 Bill… actor 61 TRUE 1955-05-17 00:00:00 -#> 5 Prin… musician 57 TRUE 1958-06-07 00:00:00 -#> 6 Alan… actor 69 FALSE 1946-02-21 00:00:00 -#> 7 Flor… actor 82 TRUE 1934-02-14 00:00:00 -#> 8 Harp… author 89 FALSE 1926-04-28 00:00:00 -#> 9 Zsa … actor 99 TRUE 1917-02-06 00:00:00 -#> 10 Geor… musician 53 FALSE 1963-06-25 00:00:00 -#> # … with 1 more variable: `Date of death` +#> Name Profession Age `Has kids` `Date of birth` `Date of death` +#> +#> 1 David Bo… musician 69 TRUE 1947-01-08 00:00:00 2016-01-10 00:00:00 +#> 2 Carrie F… actor 60 TRUE 1956-10-21 00:00:00 2016-12-27 00:00:00 +#> 3 Chuck Be… musician 90 TRUE 1926-10-18 00:00:00 2017-03-18 00:00:00 +#> 4 Bill Pax… actor 61 TRUE 1955-05-17 00:00:00 2017-02-25 00:00:00 +#> 5 Prince musician 57 TRUE 1958-06-07 00:00:00 2016-04-21 00:00:00 +#> 6 Alan Ric… actor 69 FALSE 1946-02-21 00:00:00 2016-01-14 00:00:00 +#> 7 Florence… actor 82 TRUE 1934-02-14 00:00:00 2016-11-24 00:00:00 +#> 8 Harper L… author 89 FALSE 1926-04-28 00:00:00 2016-02-19 00:00:00 +#> 9 Zsa Zsa … actor 99 TRUE 1917-02-06 00:00:00 2016-12-18 00:00:00 +#> 10 George M… musician 53 FALSE 1963-06-25 00:00:00 2016-12-25 00:00:00 ``` The named ranges, if any exist, are part of the information returned by @@ -304,7 +302,7 @@ First, put the iris data into a csv file. ``` r (iris_tempfile <- tempfile(pattern = "iris-", fileext = ".csv")) -#> [1] "/var/folders/yx/3p5dt4jj1019st0x90vhm9rr0000gn/T//RtmpO9k96x/iris-52c01686c65f.csv" +#> [1] "/var/folders/yx/3p5dt4jj1019st0x90vhm9rr0000gn/T//RtmpxgbcIq/iris-1435e49144926.csv" write.csv(iris, iris_tempfile, row.names = FALSE) ``` @@ -314,15 +312,15 @@ convert to a Sheet. ``` r (iris_ss <- drive_upload(iris_tempfile, type = "spreadsheet")) #> Local file: -#> * /var/folders/yx/3p5dt4jj1019st0x90vhm9rr0000gn/T//RtmpO9k96x/iris-52c01686c65f.csv +#> * /var/folders/yx/3p5dt4jj1019st0x90vhm9rr0000gn/T//RtmpxgbcIq/iris-1435e49144926.csv #> uploaded into Drive file: -#> * iris-52c01686c65f: 1igNr3u_vfO7DyEDquqPHOyYCvZuTVZZEU-Gp9huONBQ +#> * iris-1435e49144926: 12tzp-ojdfdaEU_oHL4iVMHGkZOO2-jE1idzfaRQW88I #> with MIME type: #> * application/vnd.google-apps.spreadsheet #> # A tibble: 1 x 3 -#> name id drive_resource -#> * -#> 1 iris-52c01686c6… 1igNr3u_vfO7DyEDquqPHOyYCvZuTVZZEU-Gp9… name id drive_resource +#> * +#> 1 iris-1435e49144926 12tzp-ojdfdaEU_oHL4iVMHGkZOO2-jE1idzfaRQW… Reading from 'iris-52c01686c65f' +#> Reading from 'iris-1435e49144926' #> Range "B1:D6" #> # A tibble: 5 x 3 #> Sepal.Width Petal.Length Petal.Width @@ -349,12 +347,12 @@ Download the Sheet as an Excel workbook and read it back in via ``` r (iris_xlsxfile <- sub("[.]csv", ".xlsx", iris_tempfile)) -#> [1] "/var/folders/yx/3p5dt4jj1019st0x90vhm9rr0000gn/T//RtmpO9k96x/iris-52c01686c65f.xlsx" +#> [1] "/var/folders/yx/3p5dt4jj1019st0x90vhm9rr0000gn/T//RtmpxgbcIq/iris-1435e49144926.xlsx" drive_download(iris_ss, path = iris_xlsxfile, overwrite = TRUE) #> File downloaded: -#> * iris-52c01686c65f +#> * iris-1435e49144926 #> Saved locally as: -#> * /var/folders/yx/3p5dt4jj1019st0x90vhm9rr0000gn/T//RtmpO9k96x/iris-52c01686c65f.xlsx +#> * /var/folders/yx/3p5dt4jj1019st0x90vhm9rr0000gn/T//RtmpxgbcIq/iris-1435e49144926.xlsx if (requireNamespace("readxl", quietly = TRUE)) { readxl::read_excel(iris_xlsxfile) @@ -382,7 +380,7 @@ file.remove(iris_tempfile, iris_xlsxfile) #> [1] TRUE TRUE drive_rm(iris_ss) #> Files deleted: -#> * iris-52c01686c65f: 1igNr3u_vfO7DyEDquqPHOyYCvZuTVZZEU-Gp9huONBQ +#> * iris-1435e49144926: 12tzp-ojdfdaEU_oHL4iVMHGkZOO2-jE1idzfaRQW88I ``` ## Get Sheet metadata or detailed cell data @@ -414,16 +412,16 @@ str(deaths_meta, max.level = 1) #> $ name : chr "deaths" #> $ locale : chr "en" #> $ time_zone : chr "America/Los_Angeles" -#> $ sheets :Classes 'tbl_df', 'tbl' and 'data.frame': 2 obs. of 7 variables: +#> $ sheets :Classes 'tbl_df', 'tbl' and 'data.frame': 2 obs. of 8 variables: #> $ named_ranges :Classes 'tbl_df', 'tbl' and 'data.frame': 2 obs. of 9 variables: -#> - attr(*, "class")= chr [1:2] "sheets_meta" "list" +#> - attr(*, "class")= chr [1:2] "sheets_Spreadsheet" "list" deaths_meta$sheets -#> # A tibble: 2 x 7 -#> name index id type visible grid_rows grid_columns -#> -#> 1 arts 0 1210215306 GRID TRUE 1000 26 -#> 2 other 1 28655153 GRID TRUE 1000 26 +#> # A tibble: 2 x 8 +#> name index id type visible grid_rows grid_columns data +#> +#> 1 arts 0 1210215306 GRID TRUE 1000 26 +#> 2 other 1 28655153 GRID TRUE 1000 26 deaths_meta$named_ranges #> # A tibble: 2 x 9 From 0f53f80dc79b79c3aa483b6da202e24ec0a09f59 Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Thu, 21 Nov 2019 11:24:14 -0800 Subject: [PATCH 12/28] Export this method --- NAMESPACE | 1 + R/schema_Sheet.R | 1 + 2 files changed, 2 insertions(+) diff --git a/NAMESPACE b/NAMESPACE index f02cf1a01..c99a2bda5 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,5 +1,6 @@ # Generated by roxygen2: do not edit by hand +S3method(as_Sheet,data.frame) S3method(as_sheets_id,"NULL") S3method(as_sheets_id,character) S3method(as_sheets_id,default) diff --git a/R/schema_Sheet.R b/R/schema_Sheet.R index a41ab62ab..62e8a30c1 100644 --- a/R/schema_Sheet.R +++ b/R/schema_Sheet.R @@ -16,6 +16,7 @@ as_Sheet.default <- function(df, name) { ) } +#' @export as_Sheet.data.frame <- function(df, name) { check_string(name) x <- new_from_schema( From e3902290b1df04c8901bf4dd0bb65f1441c7f00e Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Thu, 21 Nov 2019 13:01:05 -0800 Subject: [PATCH 13/28] Comment re: explicit list class --- R/schemas.R | 2 ++ 1 file changed, 2 insertions(+) diff --git a/R/schemas.R b/R/schemas.R index 2ff605e1e..5bf6f4c05 100644 --- a/R/schemas.R +++ b/R/schemas.R @@ -9,6 +9,8 @@ new_from_schema <- function(id, ...) { structure( dots, + # explicit 'list' class is a bit icky but makes jsonlite happy + # in various vctrs futures, this could need revisiting class = c(id_as_class(id), "googlesheets4_schema", "list"), schema = schema ) From e19ae1d4c4c51ffb9be6bf6d9eba4ae651e75254 Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Thu, 21 Nov 2019 13:07:44 -0800 Subject: [PATCH 14/28] Shorten name --- R/schema_Sheet.R | 6 +++--- R/schema_Spreadsheet.R | 2 +- R/schemas.R | 4 ++-- R/sheets_create.R | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/R/schema_Sheet.R b/R/schema_Sheet.R index 62e8a30c1..e4d2169a7 100644 --- a/R/schema_Sheet.R +++ b/R/schema_Sheet.R @@ -1,6 +1,6 @@ #' @export tibblify.googlesheets4_Sheet <- function(x, ...) { - out <- tibblify(new_from_schema("SheetProperties", !!!x$properties)) + out <- tibblify(new("SheetProperties", !!!x$properties)) # TODO: come back to deal with `data` tibble::add_column(out, data = list(NULL)) } @@ -19,9 +19,9 @@ as_Sheet.default <- function(df, name) { #' @export as_Sheet.data.frame <- function(df, name) { check_string(name) - x <- new_from_schema( + x <- new( id = "Sheet", - properties = new_from_schema( + properties = new( id = "SheetProperties", title = name, # TODO: not making room for col_names here yet diff --git a/R/schema_Spreadsheet.R b/R/schema_Spreadsheet.R index 2a558851d..a7d07f131 100644 --- a/R/schema_Spreadsheet.R +++ b/R/schema_Spreadsheet.R @@ -11,7 +11,7 @@ sheets_Spreadsheet <- function(x = list()) { out <- map(ours_theirs, ~ pluck(x, !!!.x)) if (!is.null(x$sheets)) { - sheets <- map(x$sheets, ~ new_from_schema("Sheet", !!!.x)) + sheets <- map(x$sheets, ~ new("Sheet", !!!.x)) sheets <- map(sheets, tibblify) out$sheets <- do.call(rbind, sheets) } diff --git a/R/schemas.R b/R/schemas.R index 5bf6f4c05..d1f152ada 100644 --- a/R/schemas.R +++ b/R/schemas.R @@ -1,4 +1,4 @@ -new_from_schema <- function(id, ...) { +new <- function(id, ...) { schema <- .tidy_schemas[[id]] if (is.null(schema)) { rlang::abort(glue("Can't find a tidy schema with id {sq(id)}")) @@ -49,7 +49,7 @@ patch.default <- function(x, ...) { patch.googlesheets4_schema <- function(x, ...) { dots <- rlang::list2(...) - new_from_schema(id_from_class(x), !!!utils::modifyList(x, dots)) + new(id_from_class(x), !!!utils::modifyList(x, dots)) } # tibblify ---- diff --git a/R/sheets_create.R b/R/sheets_create.R index 8de0250cb..dfb247847 100644 --- a/R/sheets_create.R +++ b/R/sheets_create.R @@ -29,8 +29,8 @@ #' ) #' } sheets_create <- function(name, ..., sheets = NULL) { - ss_body <- new_from_schema("Spreadsheet") %>% - patch(properties = new_from_schema( + ss_body <- new("Spreadsheet") %>% + patch(properties = new( id = "SpreadsheetProperties", title = name, ... )) From da74ca87a8a8d3ddd7c0e21bf41b582a0202657e Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Thu, 21 Nov 2019 13:23:34 -0800 Subject: [PATCH 15/28] Snapshot tidy schemas so future diffs are informative --- data-raw/discovery-doc-prep.R | 9 +++++++++ data-raw/schemas/GridRange | 9 +++++++++ data-raw/schemas/NamedRange | 7 +++++++ data-raw/schemas/Sheet | 17 +++++++++++++++++ data-raw/schemas/SheetProperties | 12 ++++++++++++ data-raw/schemas/Spreadsheet | 10 ++++++++++ data-raw/schemas/SpreadsheetProperties | 10 ++++++++++ 7 files changed, 74 insertions(+) create mode 100644 data-raw/schemas/GridRange create mode 100644 data-raw/schemas/NamedRange create mode 100644 data-raw/schemas/Sheet create mode 100644 data-raw/schemas/SheetProperties create mode 100644 data-raw/schemas/Spreadsheet create mode 100644 data-raw/schemas/SpreadsheetProperties diff --git a/data-raw/discovery-doc-prep.R b/data-raw/discovery-doc-prep.R index a0793b696..11f443f21 100644 --- a/data-raw/discovery-doc-prep.R +++ b/data-raw/discovery-doc-prep.R @@ -41,6 +41,15 @@ these <- c( map(schema_rectangle) # View(.tidy_schemas) +fs::dir_create(here::here("data-raw", "schemas")) +write_one <- function(data, id) { + sink(here::here("data-raw", "schemas", id)) + cat("#", id, " \n") + print(data) + sink() +} +iwalk(.tidy_schemas, write_one) + usethis::use_data( .endpoints, .schemas, .tidy_schemas, internal = TRUE, overwrite = TRUE diff --git a/data-raw/schemas/GridRange b/data-raw/schemas/GridRange new file mode 100644 index 000000000..a81e14d24 --- /dev/null +++ b/data-raw/schemas/GridRange @@ -0,0 +1,9 @@ +# GridRange +# A tibble: 5 x 6 + property type instance_of array_of format enum + +1 startRowIndex integer int32 +2 startColumnIndex integer int32 +3 sheetId integer int32 +4 endRowIndex integer int32 +5 endColumnIndex integer int32 diff --git a/data-raw/schemas/NamedRange b/data-raw/schemas/NamedRange new file mode 100644 index 000000000..20998e7e5 --- /dev/null +++ b/data-raw/schemas/NamedRange @@ -0,0 +1,7 @@ +# NamedRange +# A tibble: 3 x 6 + property type instance_of array_of format enum + +1 name string +2 namedRangeId string +3 range object GridRange diff --git a/data-raw/schemas/Sheet b/data-raw/schemas/Sheet new file mode 100644 index 000000000..a9d00a2b7 --- /dev/null +++ b/data-raw/schemas/Sheet @@ -0,0 +1,17 @@ +# Sheet +# A tibble: 13 x 6 + property type instance_of array_of format enum + + 1 properties object SheetProperti… DimensionGroup ConditionalFormatR… ProtectedRange DeveloperMetadata GridRange BandedRange EmbeddedChart FilterView Slicer DimensionGroup GridData +1 hidden boolean +2 sheetType enum +3 gridProperties object GridProperties +4 title string +5 index integer int32 +6 tabColor object Color +7 sheetId integer int32 +8 rightToLeft boolean diff --git a/data-raw/schemas/Spreadsheet b/data-raw/schemas/Spreadsheet new file mode 100644 index 000000000..8f3eea9e4 --- /dev/null +++ b/data-raw/schemas/Spreadsheet @@ -0,0 +1,10 @@ +# Spreadsheet +# A tibble: 6 x 6 + property type instance_of array_of format enum + +1 properties object SpreadsheetProperti… NamedRange DeveloperMetad… Sheet +1 autoRecalc enum Date: Thu, 21 Nov 2019 13:28:23 -0800 Subject: [PATCH 16/28] jsondiff says: "The two files were semantically identical." Various things just seem to be in a different order --- data-raw/sheets-v4_2019-11-15.json | 10052 +++++++++++++-------------- 1 file changed, 5026 insertions(+), 5026 deletions(-) diff --git a/data-raw/sheets-v4_2019-11-15.json b/data-raw/sheets-v4_2019-11-15.json index 7bc15fe57..20cc94220 100644 --- a/data-raw/sheets-v4_2019-11-15.json +++ b/data-raw/sheets-v4_2019-11-15.json @@ -1,1087 +1,325 @@ { - "ownerDomain": "google.com", - "name": "sheets", - "batchPath": "batch", - "fullyEncodeReservedExpansion": true, - "title": "Google Sheets API", - "ownerName": "Google", - "resources": { - "spreadsheets": { - "methods": { - "get": { - "response": { - "$ref": "Spreadsheet" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "GET", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/drive.readonly", - "https://www.googleapis.com/auth/spreadsheets", - "https://www.googleapis.com/auth/spreadsheets.readonly" - ], - "parameters": { - "spreadsheetId": { - "location": "path", - "description": "The spreadsheet to request.", - "required": true, - "type": "string" - }, - "ranges": { - "description": "The ranges to retrieve from the spreadsheet.", - "type": "string", - "repeated": true, - "location": "query" - }, - "includeGridData": { - "location": "query", - "description": "True if grid data should be returned.\nThis parameter is ignored if a field mask was set in the request.", - "type": "boolean" - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}", - "path": "v4/spreadsheets/{spreadsheetId}", - "id": "sheets.spreadsheets.get", - "description": "Returns the spreadsheet at the given ID.\nThe caller must specify the spreadsheet ID.\n\nBy default, data within grids will not be returned.\nYou can include grid data one of two ways:\n\n* Specify a field mask listing your desired fields using the `fields` URL\nparameter in HTTP\n\n* Set the includeGridData\nURL parameter to true. If a field mask is set, the `includeGridData`\nparameter is ignored\n\nFor large spreadsheets, it is recommended to retrieve only the specific\nfields of the spreadsheet that you want.\n\nTo retrieve only subsets of the spreadsheet, use the\nranges URL parameter.\nMultiple ranges can be specified. Limiting the range will\nreturn only the portions of the spreadsheet that intersect the requested\nranges. Ranges are specified using A1 notation." + "discoveryVersion": "v1", + "version_module": true, + "schemas": { + "UpdateNamedRangeRequest": { + "type": "object", + "properties": { + "namedRange": { + "description": "The named range to update with the new properties.", + "$ref": "NamedRange" }, - "getByDataFilter": { - "httpMethod": "POST", - "parameterOrder": [ - "spreadsheetId" - ], - "response": { - "$ref": "Spreadsheet" - }, - "parameters": { - "spreadsheetId": { - "location": "path", - "description": "The spreadsheet to request.", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}:getByDataFilter", - "id": "sheets.spreadsheets.getByDataFilter", - "path": "v4/spreadsheets/{spreadsheetId}:getByDataFilter", - "description": "Returns the spreadsheet at the given ID.\nThe caller must specify the spreadsheet ID.\n\nThis method differs from GetSpreadsheet in that it allows selecting\nwhich subsets of spreadsheet data to return by specifying a\ndataFilters parameter.\nMultiple DataFilters can be specified. Specifying one or\nmore data filters will return the portions of the spreadsheet that\nintersect ranges matched by any of the filters.\n\nBy default, data within grids will not be returned.\nYou can include grid data one of two ways:\n\n* Specify a field mask listing your desired fields using the `fields` URL\nparameter in HTTP\n\n* Set the includeGridData\nparameter to true. If a field mask is set, the `includeGridData`\nparameter is ignored\n\nFor large spreadsheets, it is recommended to retrieve only the specific\nfields of the spreadsheet that you want.", - "request": { - "$ref": "GetSpreadsheetByDataFilterRequest" - } + "fields": { + "type": "string", + "description": "The fields that should be updated. At least one field must be specified.\nThe root `namedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask" + } + }, + "id": "UpdateNamedRangeRequest", + "description": "Updates properties of the named range with the specified\nnamedRangeId." + }, + "FindReplaceRequest": { + "description": "Finds and replaces data in cells over a range, sheet, or all sheets.", + "type": "object", + "properties": { + "range": { + "$ref": "GridRange", + "description": "The range to find/replace over." }, - "create": { - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": {}, - "flatPath": "v4/spreadsheets", - "path": "v4/spreadsheets", - "id": "sheets.spreadsheets.create", - "request": { - "$ref": "Spreadsheet" - }, - "description": "Creates a spreadsheet, returning the newly created spreadsheet.", - "response": { - "$ref": "Spreadsheet" - }, - "parameterOrder": [], - "httpMethod": "POST" + "sheetId": { + "description": "The sheet to find/replace over.", + "format": "int32", + "type": "integer" }, - "batchUpdate": { - "flatPath": "v4/spreadsheets/{spreadsheetId}:batchUpdate", - "path": "v4/spreadsheets/{spreadsheetId}:batchUpdate", - "id": "sheets.spreadsheets.batchUpdate", - "request": { - "$ref": "BatchUpdateSpreadsheetRequest" - }, - "description": "Applies one or more updates to the spreadsheet.\n\nEach request is validated before\nbeing applied. If any request is not valid then the entire request will\nfail and nothing will be applied.\n\nSome requests have replies to\ngive you some information about how\nthey are applied. The replies will mirror the requests. For example,\nif you applied 4 updates and the 3rd one had a reply, then the\nresponse will have 2 empty replies, the actual reply, and another empty\nreply, in that order.\n\nDue to the collaborative nature of spreadsheets, it is not guaranteed that\nthe spreadsheet will reflect exactly your changes after this completes,\nhowever it is guaranteed that the updates in the request will be\napplied together atomically. Your changes may be altered with respect to\ncollaborator changes. If there are no collaborators, the spreadsheet\nshould reflect your changes.", - "response": { - "$ref": "BatchUpdateSpreadsheetResponse" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": { - "spreadsheetId": { - "description": "The spreadsheet to apply the updates to.", - "required": true, - "type": "string", - "location": "path" - } - } + "allSheets": { + "description": "True to find/replace over all sheets.", + "type": "boolean" + }, + "matchCase": { + "type": "boolean", + "description": "True if the search is case sensitive." + }, + "includeFormulas": { + "description": "True if the search should include cells with formulas.\nFalse to skip cells with formulas.", + "type": "boolean" + }, + "matchEntireCell": { + "description": "True if the find value should match the entire cell.", + "type": "boolean" + }, + "searchByRegex": { + "description": "True if the find value is a regex.\nThe regular expression and replacement should follow Java regex rules\nat https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html.\nThe replacement string is allowed to refer to capturing groups.\nFor example, if one cell has the contents `\"Google Sheets\"` and another\nhas `\"Google Docs\"`, then searching for `\"o.* (.*)\"` with a replacement of\n`\"$1 Rocks\"` would change the contents of the cells to\n`\"GSheets Rocks\"` and `\"GDocs Rocks\"` respectively.", + "type": "boolean" + }, + "find": { + "type": "string", + "description": "The value to search." + }, + "replacement": { + "type": "string", + "description": "The value to use as the replacement." } }, - "resources": { - "developerMetadata": { - "methods": { - "search": { - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": { - "spreadsheetId": { - "required": true, - "type": "string", - "location": "path", - "description": "The ID of the spreadsheet to retrieve metadata from." - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/developerMetadata:search", - "path": "v4/spreadsheets/{spreadsheetId}/developerMetadata:search", - "id": "sheets.spreadsheets.developerMetadata.search", - "request": { - "$ref": "SearchDeveloperMetadataRequest" - }, - "description": "Returns all developer metadata matching the specified DataFilter.\nIf the provided DataFilter represents a DeveloperMetadataLookup object,\nthis will return all DeveloperMetadata entries selected by it. If the\nDataFilter represents a location in a spreadsheet, this will return all\ndeveloper metadata associated with locations intersecting that region.", - "response": { - "$ref": "SearchDeveloperMetadataResponse" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST" - }, - "get": { - "path": "v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}", - "id": "sheets.spreadsheets.developerMetadata.get", - "description": "Returns the developer metadata with the specified ID.\nThe caller must specify the spreadsheet ID and the developer metadata's\nunique metadataId.", - "response": { - "$ref": "DeveloperMetadata" - }, - "parameterOrder": [ - "spreadsheetId", - "metadataId" - ], - "httpMethod": "GET", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": { - "metadataId": { - "description": "The ID of the developer metadata to retrieve.", - "format": "int32", - "required": true, - "type": "integer", - "location": "path" - }, - "spreadsheetId": { - "required": true, - "type": "string", - "location": "path", - "description": "The ID of the spreadsheet to retrieve metadata from." - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}" - } + "id": "FindReplaceRequest" + }, + "UpdateCellsRequest": { + "type": "object", + "properties": { + "start": { + "$ref": "GridCoordinate", + "description": "The coordinate to start writing data at.\nAny number of rows and columns (including a different number of\ncolumns per row) may be written." + }, + "range": { + "$ref": "GridRange", + "description": "The range to write data to.\n\nIf the data in rows does not cover the entire requested range,\nthe fields matching those set in fields will be cleared." + }, + "rows": { + "description": "The data to write.", + "type": "array", + "items": { + "$ref": "RowData" } }, - "values": { - "methods": { - "get": { - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/drive.readonly", - "https://www.googleapis.com/auth/spreadsheets", - "https://www.googleapis.com/auth/spreadsheets.readonly" - ], - "parameters": { - "majorDimension": { - "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.", - "type": "string", - "location": "query", - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ] - }, - "spreadsheetId": { - "location": "path", - "description": "The ID of the spreadsheet to retrieve data from.", - "required": true, - "type": "string" - }, - "range": { - "description": "The A1 notation of the values to retrieve.", - "required": true, - "type": "string", - "location": "path" - }, - "valueRenderOption": { - "location": "query", - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ], - "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string" - }, - "dateTimeRenderOption": { - "type": "string", - "location": "query", - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER]." - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}", - "path": "v4/spreadsheets/{spreadsheetId}/values/{range}", - "id": "sheets.spreadsheets.values.get", - "description": "Returns a range of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and a range.", - "response": { - "$ref": "ValueRange" - }, - "parameterOrder": [ - "spreadsheetId", - "range" - ], - "httpMethod": "GET" - }, - "update": { - "response": { - "$ref": "UpdateValuesResponse" - }, - "parameterOrder": [ - "spreadsheetId", - "range" - ], - "httpMethod": "PUT", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": { - "spreadsheetId": { - "description": "The ID of the spreadsheet to update.", - "required": true, - "type": "string", - "location": "path" - }, - "responseValueRenderOption": { - "location": "query", - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ], - "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string" - }, - "valueInputOption": { - "location": "query", - "enum": [ - "INPUT_VALUE_OPTION_UNSPECIFIED", - "RAW", - "USER_ENTERED" - ], - "description": "How the input data should be interpreted.", - "type": "string" - }, - "responseDateTimeRenderOption": { - "location": "query", - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER.", - "type": "string" - }, - "range": { - "required": true, - "type": "string", - "location": "path", - "description": "The A1 notation of the values to update." - }, - "includeValuesInResponse": { - "location": "query", - "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values.\nIf the range to write was larger than than the range actually written,\nthe response will include all values in the requested range (excluding\ntrailing empty rows and columns).", - "type": "boolean" - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}", - "path": "v4/spreadsheets/{spreadsheetId}/values/{range}", - "id": "sheets.spreadsheets.values.update", - "request": { - "$ref": "ValueRange" - }, - "description": "Sets values in a range of a spreadsheet.\nThe caller must specify the spreadsheet ID, range, and\na valueInputOption." - }, - "batchUpdateByDataFilter": { - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter", - "id": "sheets.spreadsheets.values.batchUpdateByDataFilter", - "description": "Sets values in one or more ranges of a spreadsheet.\nThe caller must specify the spreadsheet ID,\na valueInputOption, and one or more\nDataFilterValueRanges.", - "request": { - "$ref": "BatchUpdateValuesByDataFilterRequest" - }, - "response": { - "$ref": "BatchUpdateValuesByDataFilterResponse" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST", - "parameters": { - "spreadsheetId": { - "location": "path", - "description": "The ID of the spreadsheet to update.", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ] - }, - "batchUpdate": { - "description": "Sets values in one or more ranges of a spreadsheet.\nThe caller must specify the spreadsheet ID,\na valueInputOption, and one or more\nValueRanges.", - "request": { - "$ref": "BatchUpdateValuesRequest" - }, - "response": { - "$ref": "BatchUpdateValuesResponse" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST", - "parameters": { - "spreadsheetId": { - "description": "The ID of the spreadsheet to update.", - "required": true, - "type": "string", - "location": "path" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchUpdate", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchUpdate", - "id": "sheets.spreadsheets.values.batchUpdate" - }, - "batchGet": { - "parameters": { - "ranges": { - "description": "The A1 notation of the values to retrieve.", - "type": "string", - "repeated": true, - "location": "query" - }, - "majorDimension": { - "location": "query", - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ], - "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.", - "type": "string" - }, - "spreadsheetId": { - "location": "path", - "description": "The ID of the spreadsheet to retrieve data from.", - "required": true, - "type": "string" - }, - "valueRenderOption": { - "type": "string", - "location": "query", - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ], - "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE." - }, - "dateTimeRenderOption": { - "location": "query", - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/drive.readonly", - "https://www.googleapis.com/auth/spreadsheets", - "https://www.googleapis.com/auth/spreadsheets.readonly" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchGet", - "id": "sheets.spreadsheets.values.batchGet", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchGet", - "description": "Returns one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more ranges.", - "httpMethod": "GET", - "parameterOrder": [ - "spreadsheetId" - ], - "response": { - "$ref": "BatchGetValuesResponse" - } - }, - "clear": { - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": { - "spreadsheetId": { - "location": "path", - "description": "The ID of the spreadsheet to update.", - "required": true, - "type": "string" - }, - "range": { - "required": true, - "type": "string", - "location": "path", - "description": "The A1 notation of the values to clear." - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}:clear", - "id": "sheets.spreadsheets.values.clear", - "path": "v4/spreadsheets/{spreadsheetId}/values/{range}:clear", - "request": { - "$ref": "ClearValuesRequest" - }, - "description": "Clears values from a spreadsheet.\nThe caller must specify the spreadsheet ID and range.\nOnly values are cleared -- all other properties of the cell (such as\nformatting, data validation, etc..) are kept.", - "httpMethod": "POST", - "parameterOrder": [ - "spreadsheetId", - "range" - ], - "response": { - "$ref": "ClearValuesResponse" - } - }, - "batchClearByDataFilter": { - "response": { - "$ref": "BatchClearValuesByDataFilterResponse" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST", - "parameters": { - "spreadsheetId": { - "location": "path", - "description": "The ID of the spreadsheet to update.", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter", - "id": "sheets.spreadsheets.values.batchClearByDataFilter", - "description": "Clears one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more\nDataFilters. Ranges matching any of the specified data\nfilters will be cleared. Only values are cleared -- all other properties\nof the cell (such as formatting, data validation, etc..) are kept.", - "request": { - "$ref": "BatchClearValuesByDataFilterRequest" - } - }, - "append": { - "id": "sheets.spreadsheets.values.append", - "path": "v4/spreadsheets/{spreadsheetId}/values/{range}:append", - "description": "Appends values to a spreadsheet. The input range is used to search for\nexisting data and find a \"table\" within that range. Values will be\nappended to the next row of the table, starting with the first column of\nthe table. See the\n[guide](/sheets/api/guides/values#appending_values)\nand\n[sample code](/sheets/api/samples/writing#append_values)\nfor specific details of how tables are detected and data is appended.\n\nThe caller must specify the spreadsheet ID, range, and\na valueInputOption. The `valueInputOption` only\ncontrols how the input data will be added to the sheet (column-wise or\nrow-wise), it does not influence what cell the data starts being written\nto.", - "request": { - "$ref": "ValueRange" - }, - "httpMethod": "POST", - "parameterOrder": [ - "spreadsheetId", - "range" - ], - "response": { - "$ref": "AppendValuesResponse" - }, - "parameters": { - "insertDataOption": { - "description": "How the input data should be inserted.", - "type": "string", - "location": "query", - "enum": [ - "OVERWRITE", - "INSERT_ROWS" - ] - }, - "valueInputOption": { - "location": "query", - "enum": [ - "INPUT_VALUE_OPTION_UNSPECIFIED", - "RAW", - "USER_ENTERED" - ], - "description": "How the input data should be interpreted.", - "type": "string" - }, - "responseDateTimeRenderOption": { - "location": "query", - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", - "type": "string" - }, - "range": { - "required": true, - "type": "string", - "location": "path", - "description": "The A1 notation of a range to search for a logical table of data.\nValues will be appended after the last row of the table." - }, - "includeValuesInResponse": { - "type": "boolean", - "location": "query", - "description": "Determines if the update response should include the values\nof the cells that were appended. By default, responses\ndo not include the updated values." - }, - "spreadsheetId": { - "description": "The ID of the spreadsheet to update.", - "required": true, - "type": "string", - "location": "path" - }, - "responseValueRenderOption": { - "type": "string", - "location": "query", - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ], - "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE." - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}:append" - }, - "batchGetByDataFilter": { - "response": { - "$ref": "BatchGetValuesByDataFilterResponse" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": { - "spreadsheetId": { - "location": "path", - "description": "The ID of the spreadsheet to retrieve data from.", - "required": true, - "type": "string" - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter", - "id": "sheets.spreadsheets.values.batchGetByDataFilter", - "request": { - "$ref": "BatchGetValuesByDataFilterRequest" - }, - "description": "Returns one or more ranges of values that match the specified data filters.\nThe caller must specify the spreadsheet ID and one or more\nDataFilters. Ranges that match any of the data filters in\nthe request will be returned." - }, - "batchClear": { - "response": { - "$ref": "BatchClearValuesResponse" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": { - "spreadsheetId": { - "description": "The ID of the spreadsheet to update.", - "required": true, - "type": "string", - "location": "path" - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchClear", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchClear", - "id": "sheets.spreadsheets.values.batchClear", - "request": { - "$ref": "BatchClearValuesRequest" - }, - "description": "Clears one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more ranges.\nOnly values are cleared -- all other properties of the cell (such as\nformatting, data validation, etc..) are kept." - } - } - }, - "sheets": { - "methods": { - "copyTo": { - "response": { - "$ref": "SheetProperties" - }, - "parameterOrder": [ - "spreadsheetId", - "sheetId" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": { - "spreadsheetId": { - "description": "The ID of the spreadsheet containing the sheet to copy.", - "required": true, - "type": "string", - "location": "path" - }, - "sheetId": { - "required": true, - "type": "integer", - "location": "path", - "description": "The ID of the sheet to copy.", - "format": "int32" - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo", - "path": "v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo", - "id": "sheets.spreadsheets.sheets.copyTo", - "request": { - "$ref": "CopySheetToAnotherSpreadsheetRequest" - }, - "description": "Copies a single sheet from a spreadsheet to another spreadsheet.\nReturns the properties of the newly created sheet." - } - } - } - } - } - }, - "parameters": { - "alt": { - "type": "string", - "enumDescriptions": [ - "Responses with Content-Type of application/json", - "Media download with context-dependent Content-Type", - "Responses with Content-Type of application/x-protobuf" - ], - "location": "query", - "description": "Data format for response.", - "default": "json", - "enum": [ - "json", - "media", - "proto" - ] - }, - "access_token": { - "type": "string", - "location": "query", - "description": "OAuth access token." - }, - "key": { - "type": "string", - "location": "query", - "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token." - }, - "upload_protocol": { - "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").", - "type": "string", - "location": "query" - }, - "quotaUser": { - "location": "query", - "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.", - "type": "string" - }, - "prettyPrint": { - "description": "Returns response with indentations and line breaks.", - "type": "boolean", - "default": "true", - "location": "query" - }, - "fields": { - "type": "string", - "location": "query", - "description": "Selector specifying which fields to include in a partial response." - }, - "uploadType": { - "type": "string", - "location": "query", - "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\")." - }, - "callback": { - "location": "query", - "description": "JSONP", - "type": "string" - }, - "oauth_token": { - "description": "OAuth 2.0 token for the current user.", - "type": "string", - "location": "query" - }, - "$.xgafv": { - "location": "query", - "enum": [ - "1", - "2" - ], - "description": "V1 error format.", - "type": "string", - "enumDescriptions": [ - "v1 error format", - "v2 error format" - ] - } - }, - "version": "v4", - "baseUrl": "https://sheets.googleapis.com/", - "kind": "discovery#restDescription", - "description": "Reads and writes Google Sheets.", - "servicePath": "", - "basePath": "", - "revision": "20191115", - "documentationLink": "https://developers.google.com/sheets/", - "id": "sheets:v4", - "discoveryVersion": "v1", - "version_module": true, - "schemas": { - "AddSheetResponse": { - "id": "AddSheetResponse", - "description": "The result of adding a sheet.", + "fields": { + "type": "string", + "description": "The fields of CellData that should be updated.\nAt least one field must be specified.\nThe root is the CellData; 'row.values.' should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask" + } + }, + "id": "UpdateCellsRequest", + "description": "Updates all cells in a range with new data." + }, + "RandomizeRangeRequest": { + "description": "Randomizes the order of the rows in a range.", "type": "object", "properties": { - "properties": { - "description": "The properties of the newly added sheet.", - "$ref": "SheetProperties" + "range": { + "$ref": "GridRange", + "description": "The range to randomize." } - } + }, + "id": "RandomizeRangeRequest" }, - "PivotGroupRule": { - "id": "PivotGroupRule", - "description": "An optional setting on a PivotGroup that defines buckets for the values\nin the source data column rather than breaking out each individual value.\nOnly one PivotGroup with a group rule may be added for each column in\nthe source data, though on any given column you may add both a\nPivotGroup that has a rule and a PivotGroup that does not.", + "DeleteRangeRequest": { + "id": "DeleteRangeRequest", + "description": "Deletes a range of cells, shifting other cells into the deleted area.", "type": "object", "properties": { - "manualRule": { - "$ref": "ManualRule", - "description": "A ManualRule." - }, - "histogramRule": { - "$ref": "HistogramRule", - "description": "A HistogramRule." + "shiftDimension": { + "description": "The dimension from which deleted cells will be replaced with.\nIf ROWS, existing cells will be shifted upward to\nreplace the deleted cells. If COLUMNS, existing cells\nwill be shifted left to replace the deleted cells.", + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ] }, - "dateTimeRule": { - "$ref": "DateTimeRule", - "description": "A DateTimeRule." + "range": { + "$ref": "GridRange", + "description": "The range of cells to delete." } } }, - "AddFilterViewResponse": { - "description": "The result of adding a filter view.", + "DeleteDuplicatesResponse": { + "description": "The result of removing duplicates in a range.", "type": "object", "properties": { - "filter": { - "$ref": "FilterView", - "description": "The newly added filter view." + "duplicatesRemovedCount": { + "type": "integer", + "description": "The number of duplicate rows removed.", + "format": "int32" } }, - "id": "AddFilterViewResponse" + "id": "DeleteDuplicatesResponse" }, - "IterativeCalculationSettings": { + "UnmergeCellsRequest": { + "description": "Unmerges cells in the given range.", "type": "object", "properties": { - "convergenceThreshold": { - "description": "When iterative calculation is enabled and successive results differ by\nless than this threshold value, the calculation rounds stop.", - "format": "double", - "type": "number" - }, - "maxIterations": { - "description": "When iterative calculation is enabled, the maximum number of calculation\nrounds to perform.", - "format": "int32", - "type": "integer" + "range": { + "description": "The range within which all cells should be unmerged.\nIf the range spans multiple merges, all will be unmerged.\nThe range must not partially span any merge.", + "$ref": "GridRange" } }, - "id": "IterativeCalculationSettings", - "description": "Settings to control how circular dependencies are resolved with iterative\ncalculation." + "id": "UnmergeCellsRequest" }, - "ScorecardChartSpec": { - "description": "A scorecard chart. Scorecard charts are used to highlight key performance\nindicators, known as KPIs, on the spreadsheet. A scorecard chart can\nrepresent things like total sales, average cost, or a top selling item. You\ncan specify a single data value, or aggregate over a range of data.\nPercentage or absolute difference from a baseline value can be highlighted,\nlike changes over time.", + "SortSpec": { + "description": "A sort order associated with a specific column or row.", "type": "object", "properties": { - "numberFormatSource": { - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "Inherit number formatting from data.", - "Apply custom formatting as specified by ChartCustomNumberFormatOptions." - ], - "enum": [ - "CHART_NUMBER_FORMAT_SOURCE_UNDEFINED", - "FROM_DATA", - "CUSTOM" - ], - "description": "The number format source used in the scorecard chart.\nThis field is optional." - }, - "keyValueFormat": { - "$ref": "KeyValueFormat", - "description": "Formatting options for key value." - }, - "customFormatOptions": { - "description": "Custom formatting options for numeric key/baseline values in scorecard\nchart. This field is used only when number_format_source is set to\nCUSTOM. This field is optional.", - "$ref": "ChartCustomNumberFormatOptions" - }, - "scaleFactor": { - "type": "number", - "description": "Value to scale scorecard key and baseline value. For example, a factor of\n10 can be used to divide all values in the chart by 10.\nThis field is optional.", - "format": "double" - }, - "baselineValueFormat": { - "description": "Formatting options for baseline value.\nThis field is needed only if baseline_value_data is specified.", - "$ref": "BaselineValueFormat" - }, - "baselineValueData": { - "$ref": "ChartData", - "description": "The data for scorecard baseline value.\nThis field is optional." + "dimensionIndex": { + "description": "The dimension the sort should be applied to.", + "format": "int32", + "type": "integer" }, - "keyValueData": { - "$ref": "ChartData", - "description": "The data for scorecard key value." + "backgroundColor": { + "description": "The background fill color to sort by. Mutually exclusive with sorting by\ntext color. Requests to set this field will fail with a 400 error if\nforeground color is also set.", + "$ref": "Color" }, - "aggregateType": { - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "Average aggregate function.", - "Count aggregate function.", - "Maximum aggregate function.", - "Median aggregate function.", - "Minimum aggregate function.", - "Sum aggregate function." - ], + "sortOrder": { "enum": [ - "CHART_AGGREGATE_TYPE_UNSPECIFIED", - "AVERAGE", - "COUNT", - "MAX", - "MEDIAN", - "MIN", - "SUM" + "SORT_ORDER_UNSPECIFIED", + "ASCENDING", + "DESCENDING" ], - "description": "The aggregation type for key and baseline chart data in scorecard chart.\nThis field is optional." + "description": "The order data should be sorted.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use this.", + "Sort ascending.", + "Sort descending." + ] + }, + "foregroundColor": { + "$ref": "Color", + "description": "The text color to sort by. Mutually exclusive with sorting by background\nfill color. Requests to set this field will fail with a 400 error if\nbackground color is also set." } }, - "id": "ScorecardChartSpec" + "id": "SortSpec" }, - "SpreadsheetProperties": { - "description": "Properties of a spreadsheet.", + "UpdateEmbeddedObjectPositionResponse": { + "id": "UpdateEmbeddedObjectPositionResponse", + "description": "The result of updating an embedded object's position.", "type": "object", "properties": { - "autoRecalc": { - "enum": [ - "RECALCULATION_INTERVAL_UNSPECIFIED", - "ON_CHANGE", - "MINUTE", - "HOUR" - ], - "description": "The amount of time to wait before volatile functions are recalculated.", - "type": "string", - "enumDescriptions": [ - "Default value. This value must not be used.", - "Volatile functions are updated on every change.", - "Volatile functions are updated on every change and every minute.", - "Volatile functions are updated on every change and hourly." - ] - }, - "defaultFormat": { - "description": "The default format of all cells in the spreadsheet.\nCellData.effectiveFormat will not be set if\nthe cell's format is equal to this default format. This field is read-only.", - "$ref": "CellFormat" - }, - "title": { - "description": "The title of the spreadsheet.", - "type": "string" - }, - "timeZone": { - "type": "string", - "description": "The time zone of the spreadsheet, in CLDR format such as\n`America/New_York`. If the time zone isn't recognized, this may\nbe a custom time zone such as `GMT-07:00`." - }, - "locale": { - "type": "string", - "description": "The locale of the spreadsheet in one of the following formats:\n\n* an ISO 639-1 language code such as `en`\n\n* an ISO 639-2 language code such as `fil`, if no 639-1 code exists\n\n* a combination of the ISO language code and country code, such as `en_US`\n\nNote: when updating this field, not all locales/languages are supported." + "position": { + "$ref": "EmbeddedObjectPosition", + "description": "The new position of the embedded object." + } + } + }, + "BooleanRule": { + "id": "BooleanRule", + "description": "A rule that may or may not match, depending on the condition.", + "type": "object", + "properties": { + "format": { + "$ref": "CellFormat", + "description": "The format to apply.\nConditional formatting can only apply a subset of formatting:\nbold, italic,\nstrikethrough,\nforeground color &\nbackground color." }, - "iterativeCalculationSettings": { - "description": "Determines whether and how circular references are resolved with iterative\ncalculation. Absence of this field means that circular references will\nresult in calculation errors.", - "$ref": "IterativeCalculationSettings" + "condition": { + "$ref": "BooleanCondition", + "description": "The condition of the rule. If the condition evaluates to true,\nthe format is applied." } - }, - "id": "SpreadsheetProperties" + } }, - "OverlayPosition": { - "description": "The location an object is overlaid on top of a grid.", + "WaterfallChartSpec": { + "description": "A waterfall chart.", "type": "object", "properties": { - "widthPixels": { - "description": "The width of the object, in pixels. Defaults to 600.", - "format": "int32", - "type": "integer" + "domain": { + "$ref": "WaterfallChartDomain", + "description": "The domain data (horizontal axis) for the waterfall chart." }, - "offsetXPixels": { - "description": "The horizontal offset, in pixels, that the object is offset\nfrom the anchor cell.", - "format": "int32", - "type": "integer" + "firstValueIsTotal": { + "type": "boolean", + "description": "True to interpret the first value as a total." }, - "anchorCell": { - "$ref": "GridCoordinate", - "description": "The cell the object is anchored to." + "stackedType": { + "enumDescriptions": [ + "Default value, do not use.", + "Values corresponding to the same domain (horizontal axis) value will be\nstacked vertically.", + "Series will spread out along the horizontal axis." + ], + "enum": [ + "WATERFALL_STACKED_TYPE_UNSPECIFIED", + "STACKED", + "SEQUENTIAL" + ], + "description": "The stacked type.", + "type": "string" }, - "offsetYPixels": { - "description": "The vertical offset, in pixels, that the object is offset\nfrom the anchor cell.", - "format": "int32", - "type": "integer" + "hideConnectorLines": { + "description": "True to hide connector lines between columns.", + "type": "boolean" }, - "heightPixels": { - "description": "The height of the object, in pixels. Defaults to 371.", - "format": "int32", - "type": "integer" + "series": { + "description": "The data this waterfall chart is visualizing.", + "type": "array", + "items": { + "$ref": "WaterfallChartSeries" + } + }, + "connectorLineStyle": { + "$ref": "LineStyle", + "description": "The line style for the connector lines." } }, - "id": "OverlayPosition" + "id": "WaterfallChartSpec" }, - "AddChartResponse": { + "UpdateConditionalFormatRuleRequest": { + "description": "Updates a conditional format rule at the given index,\nor moves a conditional format rule to another index.", "type": "object", "properties": { - "chart": { - "description": "The newly added chart.", - "$ref": "EmbeddedChart" + "index": { + "description": "The zero-based index of the rule that should be replaced or moved.", + "format": "int32", + "type": "integer" + }, + "sheetId": { + "description": "The sheet of the rule to move. Required if new_index is set,\nunused otherwise.", + "format": "int32", + "type": "integer" + }, + "newIndex": { + "type": "integer", + "description": "The zero-based new index the rule should end up at.", + "format": "int32" + }, + "rule": { + "$ref": "ConditionalFormatRule", + "description": "The rule that should replace the rule at the given index." } }, - "id": "AddChartResponse", - "description": "The result of adding a chart to a spreadsheet." + "id": "UpdateConditionalFormatRuleRequest" }, - "InsertDimensionRequest": { + "BasicChartDomain": { "type": "object", "properties": { - "inheritFromBefore": { - "description": "Whether dimension properties should be extended from the dimensions\nbefore or after the newly inserted dimensions.\nTrue to inherit from the dimensions before (in which case the start\nindex must be greater than 0), and false to inherit from the dimensions\nafter.\n\nFor example, if row index 0 has red background and row index 1\nhas a green background, then inserting 2 rows at index 1 can inherit\neither the green or red background. If `inheritFromBefore` is true,\nthe two new rows will be red (because the row before the insertion point\nwas red), whereas if `inheritFromBefore` is false, the two new rows will\nbe green (because the row after the insertion point was green).", + "reversed": { + "description": "True to reverse the order of the domain values (horizontal axis).", "type": "boolean" }, - "range": { - "$ref": "DimensionRange", - "description": "The dimensions to insert. Both the start and end indexes must be bounded." + "domain": { + "$ref": "ChartData", + "description": "The data of the domain. For example, if charting stock prices over time,\nthis is the data representing the dates." } }, - "id": "InsertDimensionRequest", - "description": "Inserts rows or columns in a sheet at a particular index." + "id": "BasicChartDomain", + "description": "The domain of a chart.\nFor example, if charting stock prices over time, this would be the date." }, - "BatchUpdateValuesRequest": { - "description": "The request for updating more than one range of values in a spreadsheet.", + "PasteDataRequest": { + "description": "Inserts data into the spreadsheet starting at the specified coordinate.", "type": "object", "properties": { - "responseDateTimeRenderOption": { - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER.", - "type": "string", - "enumDescriptions": [ - "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", - "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." - ] + "coordinate": { + "description": "The coordinate at which the data should start being inserted.", + "$ref": "GridCoordinate" }, - "responseValueRenderOption": { - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ], - "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string", - "enumDescriptions": [ - "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", - "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", - "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." - ] + "data": { + "description": "The data to insert.", + "type": "string" }, - "includeValuesInResponse": { - "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values. The `updatedData` field within\neach of the BatchUpdateValuesResponse.responses will contain\nthe updated values. If the range to write was larger than than the range\nactually written, the response will include all values in the requested\nrange (excluding trailing empty rows and columns).", - "type": "boolean" + "delimiter": { + "description": "The delimiter in the data.", + "type": "string" }, - "valueInputOption": { + "type": { "enum": [ - "INPUT_VALUE_OPTION_UNSPECIFIED", - "RAW", - "USER_ENTERED" + "PASTE_NORMAL", + "PASTE_VALUES", + "PASTE_FORMAT", + "PASTE_NO_BORDERS", + "PASTE_FORMULA", + "PASTE_DATA_VALIDATION", + "PASTE_CONDITIONAL_FORMATTING" ], - "description": "How the input data should be interpreted.", - "type": "string", - "enumDescriptions": [ - "Default input value. This value must not be used.", - "The values the user has entered will not be parsed and will be stored\nas-is.", - "The values will be parsed as if the user typed them into the UI.\nNumbers will stay as numbers, but strings may be converted to numbers,\ndates, etc. following the same rules that are applied when entering\ntext into a cell via the Google Sheets UI." - ] - }, - "data": { - "description": "The new values to apply to the spreadsheet.", - "type": "array", - "items": { - "$ref": "ValueRange" - } - } - }, - "id": "BatchUpdateValuesRequest" - }, - "CutPasteRequest": { - "description": "Moves data from the source to the destination.", - "type": "object", - "properties": { - "source": { - "$ref": "GridRange", - "description": "The source data to cut." - }, - "pasteType": { - "description": "What kind of data to paste. All the source data will be cut, regardless\nof what is pasted.", + "description": "How the data should be pasted.", "type": "string", "enumDescriptions": [ "Paste values, formulas, formats, and merges.", @@ -1091,1256 +329,1390 @@ "Paste the formulas only.", "Paste the data validation only.", "Paste the conditional formatting rules only." - ], - "enum": [ - "PASTE_NORMAL", - "PASTE_VALUES", - "PASTE_FORMAT", - "PASTE_NO_BORDERS", - "PASTE_FORMULA", - "PASTE_DATA_VALIDATION", - "PASTE_CONDITIONAL_FORMATTING" ] }, - "destination": { - "$ref": "GridCoordinate", - "description": "The top-left coordinate where the data should be pasted." + "html": { + "description": "True if the data is HTML.", + "type": "boolean" } }, - "id": "CutPasteRequest" + "id": "PasteDataRequest" }, - "ChartAxisViewWindowOptions": { - "id": "ChartAxisViewWindowOptions", - "description": "The options that define a \"view window\" for a chart (such as the visible\nvalues in an axis).", + "UpdateDeveloperMetadataResponse": { "type": "object", "properties": { - "viewWindowMax": { - "description": "The maximum numeric value to be shown in this view window. If unset, will\nautomatically determine a maximum value that looks good for the data.", - "format": "double", - "type": "number" - }, - "viewWindowMode": { - "enumDescriptions": [ - "The default view window mode used in the Sheets editor for this chart\ntype. In most cases, if set, the default mode is equivalent to\n`PRETTY`.", - "Do not use. Represents that the currently set mode is not supported by\nthe API.", - "Follows the min and max exactly if specified. If a value is unspecified,\nit will fall back to the `PRETTY` value.", - "Chooses a min and max that make the chart look good. Both min and max are\nignored in this mode." - ], - "enum": [ - "DEFAULT_VIEW_WINDOW_MODE", - "VIEW_WINDOW_MODE_UNSUPPORTED", - "EXPLICIT", - "PRETTY" - ], - "description": "The view window's mode.", - "type": "string" - }, - "viewWindowMin": { - "description": "The minimum numeric value to be shown in this view window. If unset, will\nautomatically determine a minimum value that looks good for the data.", - "format": "double", - "type": "number" + "developerMetadata": { + "description": "The updated developer metadata.", + "type": "array", + "items": { + "$ref": "DeveloperMetadata" + } } - } + }, + "id": "UpdateDeveloperMetadataResponse", + "description": "The response from updating developer metadata." }, - "BasicChartSeries": { - "id": "BasicChartSeries", - "description": "A single series of data in a chart.\nFor example, if charting stock prices over time, multiple series may exist,\none for the \"Open Price\", \"High Price\", \"Low Price\" and \"Close Price\".", + "AppendDimensionRequest": { "type": "object", "properties": { - "series": { - "$ref": "ChartData", - "description": "The data being visualized in this chart series." - }, - "type": { - "description": "The type of this series. Valid only if the\nchartType is\nCOMBO.\nDifferent types will change the way the series is visualized.\nOnly LINE, AREA,\nand COLUMN are supported.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "A \u003ca href=\"/chart/interactive/docs/gallery/barchart\"\u003ebar chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/linechart\"\u003eline chart\u003c/a\u003e.", - "An \u003ca href=\"/chart/interactive/docs/gallery/areachart\"\u003earea chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/columnchart\"\u003ecolumn chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/scatterchart\"\u003escatter\nchart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/combochart\"\u003ecombo chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/steppedareachart\"\u003estepped area\nchart\u003c/a\u003e." - ], - "enum": [ - "BASIC_CHART_TYPE_UNSPECIFIED", - "BAR", - "LINE", - "AREA", - "COLUMN", - "SCATTER", - "COMBO", - "STEPPED_AREA" - ] + "sheetId": { + "description": "The sheet to append rows or columns to.", + "format": "int32", + "type": "integer" }, - "targetAxis": { + "dimension": { "enum": [ - "BASIC_CHART_AXIS_POSITION_UNSPECIFIED", - "BOTTOM_AXIS", - "LEFT_AXIS", - "RIGHT_AXIS" + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" ], - "description": "The minor axis that will specify the range of values for this series.\nFor example, if charting stocks over time, the \"Volume\" series\nmay want to be pinned to the right with the prices pinned to the left,\nbecause the scale of trading volume is different than the scale of\nprices.\nIt is an error to specify an axis that isn't a valid minor axis\nfor the chart's type.", + "description": "Whether rows or columns should be appended.", "type": "string", "enumDescriptions": [ - "Default value, do not use.", - "The axis rendered at the bottom of a chart.\nFor most charts, this is the standard major axis.\nFor bar charts, this is a minor axis.", - "The axis rendered at the left of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is the standard major axis.", - "The axis rendered at the right of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is an unusual major axis." + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." ] }, - "color": { - "$ref": "Color", - "description": "The color for elements (i.e. bars, lines, points) associated with this\nseries. If empty, a default color is used." + "length": { + "type": "integer", + "description": "The number of rows or columns to append.", + "format": "int32" + } + }, + "id": "AppendDimensionRequest", + "description": "Appends rows or columns to the end of a sheet." + }, + "AddNamedRangeRequest": { + "description": "Adds a named range to the spreadsheet.", + "type": "object", + "properties": { + "namedRange": { + "$ref": "NamedRange", + "description": "The named range to add. The namedRangeId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a range that already exists.)" + } + }, + "id": "AddNamedRangeRequest" + }, + "CreateDeveloperMetadataResponse": { + "description": "The response from creating developer metadata.", + "type": "object", + "properties": { + "developerMetadata": { + "$ref": "DeveloperMetadata", + "description": "The developer metadata that was created." + } + }, + "id": "CreateDeveloperMetadataResponse" + }, + "UpdateEmbeddedObjectPositionRequest": { + "id": "UpdateEmbeddedObjectPositionRequest", + "description": "Update an embedded object's position (such as a moving or resizing a\nchart or image).", + "type": "object", + "properties": { + "newPosition": { + "$ref": "EmbeddedObjectPosition", + "description": "An explicit position to move the embedded object to.\nIf newPosition.sheetId is set,\na new sheet with that ID will be created.\nIf newPosition.newSheet is set to true,\na new sheet will be created with an ID that will be chosen for you." + }, + "fields": { + "description": "The fields of OverlayPosition\nthat should be updated when setting a new position. Used only if\nnewPosition.overlayPosition\nis set, in which case at least one field must\nbe specified. The root `newPosition.overlayPosition` is implied and\nshould not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" }, - "lineStyle": { - "$ref": "LineStyle", - "description": "The line style of this series. Valid only if the\nchartType is AREA,\nLINE, or SCATTER.\nCOMBO charts are also supported if the\nseries chart type is\nAREA or LINE." + "objectId": { + "description": "The ID of the object to moved.", + "format": "int32", + "type": "integer" } } }, - "AutoResizeDimensionsRequest": { - "description": "Automatically resizes one or more dimensions based on the contents\nof the cells in that dimension.", + "WaterfallChartColumnStyle": { + "description": "Styles for a waterfall chart column.", "type": "object", "properties": { - "dimensions": { - "$ref": "DimensionRange", - "description": "The dimensions to automatically resize." + "color": { + "description": "The color of the column.", + "$ref": "Color" + }, + "label": { + "description": "The label of the column's legend.", + "type": "string" } }, - "id": "AutoResizeDimensionsRequest" + "id": "WaterfallChartColumnStyle" }, - "UpdateBordersRequest": { - "id": "UpdateBordersRequest", - "description": "Updates the borders of a range.\nIf a field is not set in the request, that means the border remains as-is.\nFor example, with two subsequent UpdateBordersRequest:\n\n 1. range: A1:A5 `{ top: RED, bottom: WHITE }`\n 2. range: A1:A5 `{ left: BLUE }`\n\nThat would result in A1:A5 having a borders of\n`{ top: RED, bottom: WHITE, left: BLUE }`.\nIf you want to clear a border, explicitly set the style to\nNONE.", + "Request": { "type": "object", "properties": { - "left": { - "$ref": "Border", - "description": "The border to put at the left of the range." + "deleteRange": { + "$ref": "DeleteRangeRequest", + "description": "Deletes a range of cells from a sheet, shifting the remaining cells." }, - "bottom": { - "$ref": "Border", - "description": "The border to put at the bottom of the range." + "deleteBanding": { + "description": "Removes a banded range", + "$ref": "DeleteBandingRequest" }, - "innerVertical": { - "$ref": "Border", - "description": "The vertical border to put within the range." + "addFilterView": { + "$ref": "AddFilterViewRequest", + "description": "Adds a filter view." }, - "right": { - "$ref": "Border", - "description": "The border to put at the right of the range." + "deleteDuplicates": { + "$ref": "DeleteDuplicatesRequest", + "description": "Removes rows containing duplicate values in specified columns of a cell\nrange." }, - "range": { - "$ref": "GridRange", - "description": "The range whose borders should be updated." + "updateBorders": { + "$ref": "UpdateBordersRequest", + "description": "Updates the borders in a range of cells." }, - "innerHorizontal": { - "$ref": "Border", - "description": "The horizontal border to put within the range." + "setDataValidation": { + "description": "Sets data validation for one or more cells.", + "$ref": "SetDataValidationRequest" }, - "top": { - "$ref": "Border", - "description": "The border to put at the top of the range." - } - } - }, - "CellFormat": { - "description": "The format of a cell.", - "type": "object", - "properties": { - "numberFormat": { - "$ref": "NumberFormat", - "description": "A format describing how number values should be represented to the user." + "deleteConditionalFormatRule": { + "description": "Deletes an existing conditional format rule.", + "$ref": "DeleteConditionalFormatRuleRequest" }, - "hyperlinkDisplayType": { - "type": "string", - "enumDescriptions": [ - "The default value: the hyperlink is rendered. Do not use this.", - "A hyperlink should be explicitly rendered.", - "A hyperlink should not be rendered." - ], - "enum": [ - "HYPERLINK_DISPLAY_TYPE_UNSPECIFIED", - "LINKED", - "PLAIN_TEXT" - ], - "description": "How a hyperlink, if it exists, should be displayed in the cell." + "clearBasicFilter": { + "$ref": "ClearBasicFilterRequest", + "description": "Clears the basic filter on a sheet." }, - "horizontalAlignment": { - "type": "string", - "enumDescriptions": [ - "The horizontal alignment is not specified. Do not use this.", - "The text is explicitly aligned to the left of the cell.", - "The text is explicitly aligned to the center of the cell.", - "The text is explicitly aligned to the right of the cell." - ], - "enum": [ - "HORIZONTAL_ALIGN_UNSPECIFIED", - "LEFT", - "CENTER", - "RIGHT" - ], - "description": "The horizontal alignment of the value in the cell." + "repeatCell": { + "$ref": "RepeatCellRequest", + "description": "Repeats a single cell across a range." }, - "textFormat": { - "$ref": "TextFormat", - "description": "The format of the text in the cell (unless overridden by a format run)." + "appendDimension": { + "$ref": "AppendDimensionRequest", + "description": "Appends dimensions to the end of a sheet." }, - "backgroundColor": { - "$ref": "Color", - "description": "The background color of the cell." + "updateSlicerSpec": { + "$ref": "UpdateSlicerSpecRequest", + "description": "Updates a slicer's specifications." }, - "padding": { - "$ref": "Padding", - "description": "The padding of the cell." + "updateConditionalFormatRule": { + "$ref": "UpdateConditionalFormatRuleRequest", + "description": "Updates an existing conditional format rule." }, - "verticalAlignment": { - "description": "The vertical alignment of the value in the cell.", - "type": "string", - "enumDescriptions": [ - "The vertical alignment is not specified. Do not use this.", - "The text is explicitly aligned to the top of the cell.", - "The text is explicitly aligned to the middle of the cell.", - "The text is explicitly aligned to the bottom of the cell." - ], - "enum": [ - "VERTICAL_ALIGN_UNSPECIFIED", - "TOP", - "MIDDLE", - "BOTTOM" - ] + "createDeveloperMetadata": { + "$ref": "CreateDeveloperMetadataRequest", + "description": "Creates new developer metadata" + }, + "insertRange": { + "$ref": "InsertRangeRequest", + "description": "Inserts new cells in a sheet, shifting the existing cells." + }, + "moveDimension": { + "description": "Moves rows or columns to another location in a sheet.", + "$ref": "MoveDimensionRequest" + }, + "deleteDeveloperMetadata": { + "$ref": "DeleteDeveloperMetadataRequest", + "description": "Deletes developer metadata" + }, + "randomizeRange": { + "description": "Randomizes the order of the rows in a range.", + "$ref": "RandomizeRangeRequest" + }, + "updateBanding": { + "$ref": "UpdateBandingRequest", + "description": "Updates a banded range" + }, + "addProtectedRange": { + "$ref": "AddProtectedRangeRequest", + "description": "Adds a protected range." + }, + "deleteNamedRange": { + "$ref": "DeleteNamedRangeRequest", + "description": "Deletes a named range." + }, + "duplicateSheet": { + "$ref": "DuplicateSheetRequest", + "description": "Duplicates a sheet." + }, + "deleteSheet": { + "$ref": "DeleteSheetRequest", + "description": "Deletes a sheet." + }, + "unmergeCells": { + "description": "Unmerges merged cells.", + "$ref": "UnmergeCellsRequest" + }, + "updateEmbeddedObjectPosition": { + "$ref": "UpdateEmbeddedObjectPositionRequest", + "description": "Updates an embedded object's (e.g. chart, image) position." + }, + "addDimensionGroup": { + "description": "Creates a group over the specified range.", + "$ref": "AddDimensionGroupRequest" + }, + "updateDeveloperMetadata": { + "$ref": "UpdateDeveloperMetadataRequest", + "description": "Updates an existing developer metadata entry" + }, + "updateDimensionProperties": { + "$ref": "UpdateDimensionPropertiesRequest", + "description": "Updates dimensions' properties." + }, + "updateDimensionGroup": { + "$ref": "UpdateDimensionGroupRequest", + "description": "Updates the state of the specified group." + }, + "pasteData": { + "$ref": "PasteDataRequest", + "description": "Pastes data (HTML or delimited) into a sheet." + }, + "setBasicFilter": { + "description": "Sets the basic filter on a sheet.", + "$ref": "SetBasicFilterRequest" + }, + "addConditionalFormatRule": { + "$ref": "AddConditionalFormatRuleRequest", + "description": "Adds a new conditional format rule." + }, + "updateCells": { + "$ref": "UpdateCellsRequest", + "description": "Updates many cells at once." + }, + "addNamedRange": { + "$ref": "AddNamedRangeRequest", + "description": "Adds a named range." + }, + "updateSpreadsheetProperties": { + "$ref": "UpdateSpreadsheetPropertiesRequest", + "description": "Updates the spreadsheet's properties." + }, + "trimWhitespace": { + "$ref": "TrimWhitespaceRequest", + "description": "Trims cells of whitespace (such as spaces, tabs, or new lines)." + }, + "deleteEmbeddedObject": { + "$ref": "DeleteEmbeddedObjectRequest", + "description": "Deletes an embedded object (e.g, chart, image) in a sheet." + }, + "updateFilterView": { + "description": "Updates the properties of a filter view.", + "$ref": "UpdateFilterViewRequest" + }, + "addBanding": { + "description": "Adds a new banded range", + "$ref": "AddBandingRequest" + }, + "appendCells": { + "description": "Appends cells after the last row with data in a sheet.", + "$ref": "AppendCellsRequest" + }, + "autoResizeDimensions": { + "$ref": "AutoResizeDimensionsRequest", + "description": "Automatically resizes one or more dimensions based on the contents\nof the cells in that dimension." + }, + "cutPaste": { + "description": "Cuts data from one area and pastes it to another.", + "$ref": "CutPasteRequest" + }, + "mergeCells": { + "$ref": "MergeCellsRequest", + "description": "Merges cells together." + }, + "updateNamedRange": { + "$ref": "UpdateNamedRangeRequest", + "description": "Updates a named range." + }, + "updateSheetProperties": { + "$ref": "UpdateSheetPropertiesRequest", + "description": "Updates a sheet's properties." + }, + "deleteDimension": { + "$ref": "DeleteDimensionRequest", + "description": "Deletes rows or columns in a sheet." + }, + "autoFill": { + "$ref": "AutoFillRequest", + "description": "Automatically fills in more data based on existing data." + }, + "sortRange": { + "$ref": "SortRangeRequest", + "description": "Sorts data in a range." + }, + "addSlicer": { + "$ref": "AddSlicerRequest", + "description": "Adds a slicer." + }, + "deleteProtectedRange": { + "$ref": "DeleteProtectedRangeRequest", + "description": "Deletes a protected range." + }, + "deleteDimensionGroup": { + "$ref": "DeleteDimensionGroupRequest", + "description": "Deletes a group over the specified range." + }, + "duplicateFilterView": { + "$ref": "DuplicateFilterViewRequest", + "description": "Duplicates a filter view." }, - "borders": { - "description": "The borders of the cell.", - "$ref": "Borders" + "addChart": { + "description": "Adds a chart.", + "$ref": "AddChartRequest" }, - "textDirection": { - "enumDescriptions": [ - "The text direction is not specified. Do not use this.", - "The text direction of left-to-right was set by the user.", - "The text direction of right-to-left was set by the user." - ], - "enum": [ - "TEXT_DIRECTION_UNSPECIFIED", - "LEFT_TO_RIGHT", - "RIGHT_TO_LEFT" - ], - "description": "The direction of the text in the cell.", - "type": "string" + "findReplace": { + "description": "Finds and replaces occurrences of some text with other text.", + "$ref": "FindReplaceRequest" }, - "wrapStrategy": { - "description": "The wrap strategy for the value in the cell.", - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "Lines that are longer than the cell width will be written in the next\ncell over, so long as that cell is empty. If the next cell over is\nnon-empty, this behaves the same as CLIP. The text will never wrap\nto the next line unless the user manually inserts a new line.\nExample:\n\n | First sentence. |\n | Manual newline that is very long. \u003c- Text continues into next cell\n | Next newline. |", - "This wrap strategy represents the old Google Sheets wrap strategy where\nwords that are longer than a line are clipped rather than broken. This\nstrategy is not supported on all platforms and is being phased out.\nExample:\n\n | Cell has a |\n | loooooooooo| \u003c- Word is clipped.\n | word. |", - "Lines that are longer than the cell width will be clipped.\nThe text will never wrap to the next line unless the user manually\ninserts a new line.\nExample:\n\n | First sentence. |\n | Manual newline t| \u003c- Text is clipped\n | Next newline. |", - "Words that are longer than a line are wrapped at the character level\nrather than clipped.\nExample:\n\n | Cell has a |\n | loooooooooo| \u003c- Word is broken.\n | ong word. |" - ], - "enum": [ - "WRAP_STRATEGY_UNSPECIFIED", - "OVERFLOW_CELL", - "LEGACY_WRAP", - "CLIP", - "WRAP" - ] + "updateChartSpec": { + "$ref": "UpdateChartSpecRequest", + "description": "Updates a chart's specifications." }, - "textRotation": { - "$ref": "TextRotation", - "description": "The rotation applied to text in a cell" - } - }, - "id": "CellFormat" - }, - "ClearValuesResponse": { - "id": "ClearValuesResponse", - "description": "The response when clearing a range of values in a spreadsheet.", - "type": "object", - "properties": { - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", - "type": "string" + "textToColumns": { + "$ref": "TextToColumnsRequest", + "description": "Converts a column of text into many columns of text." }, - "clearedRange": { - "description": "The range (in A1 notation) that was cleared.\n(If the request was for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual range\n that was cleared, bounded to the sheet's limits.)", - "type": "string" - } - } - }, - "WaterfallChartCustomSubtotal": { - "description": "A custom subtotal column for a waterfall chart series.", - "type": "object", - "properties": { - "subtotalIndex": { - "description": "The 0-based index of a data point within the series. If\ndata_is_subtotal is true, the data point at this index is the\nsubtotal. Otherwise, the subtotal appears after the data point with\nthis index. A series can have multiple subtotals at arbitrary indices,\nbut subtotals do not affect the indices of the data points. For\nexample, if a series has three data points, their indices will always\nbe 0, 1, and 2, regardless of how many subtotals exist on the series or\nwhat data points they are associated with.", - "format": "int32", - "type": "integer" + "updateProtectedRange": { + "description": "Updates a protected range.", + "$ref": "UpdateProtectedRangeRequest" }, - "dataIsSubtotal": { - "type": "boolean", - "description": "True if the data point at subtotal_index is the subtotal. If false,\nthe subtotal will be computed and appear after the data point." + "addSheet": { + "$ref": "AddSheetRequest", + "description": "Adds a sheet." }, - "label": { - "description": "A label for the subtotal column.", - "type": "string" - } - }, - "id": "WaterfallChartCustomSubtotal" - }, - "ChartData": { - "description": "The data included in a domain or series.", - "type": "object", - "properties": { - "sourceRange": { - "description": "The source ranges of the data.", - "$ref": "ChartSourceRange" - } - }, - "id": "ChartData" - }, - "BatchGetValuesResponse": { - "type": "object", - "properties": { - "valueRanges": { - "description": "The requested values. The order of the ValueRanges is the same as the\norder of the requested ranges.", - "type": "array", - "items": { - "$ref": "ValueRange" - } + "copyPaste": { + "$ref": "CopyPasteRequest", + "description": "Copies data from one area and pastes it to another." }, - "spreadsheetId": { - "description": "The ID of the spreadsheet the data was retrieved from.", - "type": "string" + "deleteFilterView": { + "$ref": "DeleteFilterViewRequest", + "description": "Deletes a filter view from a sheet." + }, + "insertDimension": { + "$ref": "InsertDimensionRequest", + "description": "Inserts new rows or columns in a sheet." } }, - "id": "BatchGetValuesResponse", - "description": "The response when retrieving more than one range of values in a spreadsheet." + "id": "Request", + "description": "A single kind of update to apply to a spreadsheet." }, - "UpdateBandingRequest": { - "description": "Updates properties of the supplied banded range.", + "WaterfallChartDomain": { "type": "object", "properties": { - "bandedRange": { - "$ref": "BandedRange", - "description": "The banded range to update with the new properties." + "reversed": { + "description": "True to reverse the order of the domain values (horizontal axis).", + "type": "boolean" }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `bandedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" + "data": { + "$ref": "ChartData", + "description": "The data of the WaterfallChartDomain." } }, - "id": "UpdateBandingRequest" + "id": "WaterfallChartDomain", + "description": "The domain of a waterfall chart." }, - "Color": { - "description": "Represents a color in the RGBA color space. This representation is designed\nfor simplicity of conversion to/from color representations in various\nlanguages over compactness; for example, the fields of this representation\ncan be trivially provided to the constructor of \"java.awt.Color\" in Java; it\ncan also be trivially provided to UIColor's \"+colorWithRed:green:blue:alpha\"\nmethod in iOS; and, with just a little work, it can be easily formatted into\na CSS \"rgba()\" string in JavaScript, as well.\n\nNote: this proto does not carry information about the absolute color space\nthat should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,\nDCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color\nspace.\n\nExample (Java):\n\n import com.google.type.Color;\n\n // ...\n public static java.awt.Color fromProto(Color protocolor) {\n float alpha = protocolor.hasAlpha()\n ? protocolor.getAlpha().getValue()\n : 1.0;\n\n return new java.awt.Color(\n protocolor.getRed(),\n protocolor.getGreen(),\n protocolor.getBlue(),\n alpha);\n }\n\n public static Color toProto(java.awt.Color color) {\n float red = (float) color.getRed();\n float green = (float) color.getGreen();\n float blue = (float) color.getBlue();\n float denominator = 255.0;\n Color.Builder resultBuilder =\n Color\n .newBuilder()\n .setRed(red / denominator)\n .setGreen(green / denominator)\n .setBlue(blue / denominator);\n int alpha = color.getAlpha();\n if (alpha != 255) {\n result.setAlpha(\n FloatValue\n .newBuilder()\n .setValue(((float) alpha) / denominator)\n .build());\n }\n return resultBuilder.build();\n }\n // ...\n\nExample (iOS / Obj-C):\n\n // ...\n static UIColor* fromProto(Color* protocolor) {\n float red = [protocolor red];\n float green = [protocolor green];\n float blue = [protocolor blue];\n FloatValue* alpha_wrapper = [protocolor alpha];\n float alpha = 1.0;\n if (alpha_wrapper != nil) {\n alpha = [alpha_wrapper value];\n }\n return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];\n }\n\n static Color* toProto(UIColor* color) {\n CGFloat red, green, blue, alpha;\n if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {\n return nil;\n }\n Color* result = [[Color alloc] init];\n [result setRed:red];\n [result setGreen:green];\n [result setBlue:blue];\n if (alpha \u003c= 0.9999) {\n [result setAlpha:floatWrapperWithValue(alpha)];\n }\n [result autorelease];\n return result;\n }\n // ...\n\n Example (JavaScript):\n\n // ...\n\n var protoToCssColor = function(rgb_color) {\n var redFrac = rgb_color.red || 0.0;\n var greenFrac = rgb_color.green || 0.0;\n var blueFrac = rgb_color.blue || 0.0;\n var red = Math.floor(redFrac * 255);\n var green = Math.floor(greenFrac * 255);\n var blue = Math.floor(blueFrac * 255);\n\n if (!('alpha' in rgb_color)) {\n return rgbToCssColor_(red, green, blue);\n }\n\n var alphaFrac = rgb_color.alpha.value || 0.0;\n var rgbParams = [red, green, blue].join(',');\n return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');\n };\n\n var rgbToCssColor_ = function(red, green, blue) {\n var rgbNumber = new Number((red \u003c\u003c 16) | (green \u003c\u003c 8) | blue);\n var hexString = rgbNumber.toString(16);\n var missingZeros = 6 - hexString.length;\n var resultBuilder = ['#'];\n for (var i = 0; i \u003c missingZeros; i++) {\n resultBuilder.push('0');\n }\n resultBuilder.push(hexString);\n return resultBuilder.join('');\n };\n\n // ...", + "GridRange": { + "description": "A range on a sheet.\nAll indexes are zero-based.\nIndexes are half open, e.g the start index is inclusive\nand the end index is exclusive -- [start_index, end_index).\nMissing indexes indicate the range is unbounded on that side.\n\nFor example, if `\"Sheet1\"` is sheet ID 0, then:\n\n `Sheet1!A1:A1 == sheet_id: 0,\n start_row_index: 0, end_row_index: 1,\n start_column_index: 0, end_column_index: 1`\n\n `Sheet1!A3:B4 == sheet_id: 0,\n start_row_index: 2, end_row_index: 4,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1!A:B == sheet_id: 0,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1!A5:B == sheet_id: 0,\n start_row_index: 4,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1 == sheet_id:0`\n\nThe start index must always be less than or equal to the end index.\nIf the start index equals the end index, then the range is empty.\nEmpty ranges are typically not meaningful and are usually rendered in the\nUI as `#REF!`.", "type": "object", "properties": { - "red": { - "type": "number", - "description": "The amount of red in the color as a value in the interval [0, 1].", - "format": "float" + "sheetId": { + "description": "The sheet this range is on.", + "format": "int32", + "type": "integer" }, - "green": { - "description": "The amount of green in the color as a value in the interval [0, 1].", - "format": "float", - "type": "number" + "endRowIndex": { + "description": "The end row (exclusive) of the range, or not set if unbounded.", + "format": "int32", + "type": "integer" }, - "blue": { - "description": "The amount of blue in the color as a value in the interval [0, 1].", - "format": "float", - "type": "number" + "endColumnIndex": { + "description": "The end column (exclusive) of the range, or not set if unbounded.", + "format": "int32", + "type": "integer" }, - "alpha": { - "type": "number", - "description": "The fraction of this color that should be applied to the pixel. That is,\nthe final pixel color is defined by the equation:\n\n pixel color = alpha * (this color) + (1.0 - alpha) * (background color)\n\nThis means that a value of 1.0 corresponds to a solid color, whereas\na value of 0.0 corresponds to a completely transparent color. This\nuses a wrapper message rather than a simple float scalar so that it is\npossible to distinguish between a default value and the value being unset.\nIf omitted, this color object is to be rendered as a solid color\n(as if the alpha value had been explicitly given with a value of 1.0).", - "format": "float" + "startRowIndex": { + "description": "The start row (inclusive) of the range, or not set if unbounded.", + "format": "int32", + "type": "integer" + }, + "startColumnIndex": { + "description": "The start column (inclusive) of the range, or not set if unbounded.", + "format": "int32", + "type": "integer" } }, - "id": "Color" + "id": "GridRange" }, - "TrimWhitespaceRequest": { + "DeleteDimensionGroupRequest": { + "description": "Deletes a group over the specified range by decrementing the depth of the\ndimensions in the range.\n\nFor example, assume the sheet has a depth-1 group over B:E and a depth-2\ngroup over C:D. Deleting a group over D:E leaves the sheet with a\ndepth-1 group over B:D and a depth-2 group over C:C.", "type": "object", "properties": { "range": { - "$ref": "GridRange", - "description": "The range whose cells to trim." - } - }, - "id": "TrimWhitespaceRequest", - "description": "Trims the whitespace (such as spaces, tabs, or new lines) in every cell in\nthe specified range. This request removes all whitespace from the start and\nend of each cell's text, and reduces any subsequence of remaining whitespace\ncharacters to a single space. If the resulting trimmed text starts with a '+'\nor '=' character, the text remains as a string value and isn't interpreted\nas a formula." - }, - "ChartSourceRange": { - "description": "Source ranges for a chart.", - "type": "object", - "properties": { - "sources": { - "type": "array", - "items": { - "$ref": "GridRange" - }, - "description": "The ranges of data for a series or domain.\nExactly one dimension must have a length of 1,\nand all sources in the list must have the same dimension\nwith length 1.\nThe domain (if it exists) & all series must have the same number\nof source ranges. If using more than one source range, then the source\nrange at a given offset must be in order and contiguous across the domain\nand series.\n\nFor example, these are valid configurations:\n\n domain sources: A1:A5\n series1 sources: B1:B5\n series2 sources: D6:D10\n\n domain sources: A1:A5, C10:C12\n series1 sources: B1:B5, D10:D12\n series2 sources: C1:C5, E10:E12" + "$ref": "DimensionRange", + "description": "The range of the group to be deleted." } }, - "id": "ChartSourceRange" + "id": "DeleteDimensionGroupRequest" }, - "ValueRange": { - "description": "Data within a range of the spreadsheet.", + "BubbleChartSpec": { + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/bubblechart\"\u003ebubble chart\u003c/a\u003e.", "type": "object", "properties": { - "majorDimension": { + "bubbleMaxRadiusSize": { + "description": "The max radius size of the bubbles, in pixels.\nIf specified, the field must be a positive value.", + "format": "int32", + "type": "integer" + }, + "series": { + "$ref": "ChartData", + "description": "The data contianing the bubble y-values. These values locate the bubbles\nin the chart vertically." + }, + "legendPosition": { "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." + "Default value, do not use.", + "The legend is rendered on the bottom of the chart.", + "The legend is rendered on the left of the chart.", + "The legend is rendered on the right of the chart.", + "The legend is rendered on the top of the chart.", + "No legend is rendered.", + "The legend is rendered inside the chart area." ], "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" + "BUBBLE_CHART_LEGEND_POSITION_UNSPECIFIED", + "BOTTOM_LEGEND", + "LEFT_LEGEND", + "RIGHT_LEGEND", + "TOP_LEGEND", + "NO_LEGEND", + "INSIDE_LEGEND" ], - "description": "The major dimension of the values.\n\nFor output, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.\n\nFor input, with `range=A1:B2,majorDimension=ROWS` then `[[1,2],[3,4]]`\nwill set `A1=1,B1=2,A2=3,B2=4`. With `range=A1:B2,majorDimension=COLUMNS`\nthen `[[1,2],[3,4]]` will set `A1=1,B1=3,A2=2,B2=4`.\n\nWhen writing, if this field is not set, it defaults to ROWS.", + "description": "Where the legend of the chart should be drawn.", "type": "string" }, - "values": { - "description": "The data that was read or to be written. This is an array of arrays,\nthe outer array representing all the data and each inner array\nrepresenting a major dimension. Each item in the inner array\ncorresponds with one cell.\n\nFor output, empty trailing rows and columns will not be included.\n\nFor input, supported value types are: bool, string, and double.\nNull values will be skipped.\nTo set a cell to an empty value, set the string value to an empty string.", - "type": "array", - "items": { - "type": "array", - "items": { - "type": "any" - } - } + "bubbleOpacity": { + "description": "The opacity of the bubbles between 0 and 1.0.\n0 is fully transparent and 1 is fully opaque.", + "format": "float", + "type": "number" + }, + "bubbleSizes": { + "description": "The data contianing the bubble sizes. Bubble sizes are used to draw\nthe bubbles at different sizes relative to each other.\nIf specified, group_ids must also be specified. This field is\noptional.", + "$ref": "ChartData" + }, + "domain": { + "description": "The data containing the bubble x-values. These values locate the bubbles\nin the chart horizontally.", + "$ref": "ChartData" + }, + "bubbleTextStyle": { + "$ref": "TextFormat", + "description": "The format of the text inside the bubbles.\nUnderline and Strikethrough are not supported." + }, + "bubbleBorderColor": { + "description": "The bubble border color.", + "$ref": "Color" + }, + "groupIds": { + "$ref": "ChartData", + "description": "The data containing the bubble group IDs. All bubbles with the same group\nID are drawn in the same color. If bubble_sizes is specified then\nthis field must also be specified but may contain blank values.\nThis field is optional." + }, + "bubbleLabels": { + "description": "The data containing the bubble labels. These do not need to be unique.", + "$ref": "ChartData" + }, + "bubbleMinRadiusSize": { + "description": "The minimum radius size of the bubbles, in pixels.\nIf specific, the field must be a positive value.", + "format": "int32", + "type": "integer" + } + }, + "id": "BubbleChartSpec" + }, + "SetDataValidationRequest": { + "type": "object", + "properties": { + "rule": { + "$ref": "DataValidationRule", + "description": "The data validation rule to set on each cell in the range,\nor empty to clear the data validation in the range." }, "range": { - "description": "The range the values cover, in A1 notation.\nFor output, this range indicates the entire requested range,\neven though the values will exclude trailing rows and columns.\nWhen appending values, this field represents the range to search for a\ntable, after which values will be appended.", - "type": "string" + "$ref": "GridRange", + "description": "The range the data validation rule should apply to." } }, - "id": "ValueRange" + "id": "SetDataValidationRequest", + "description": "Sets a data validation rule to every cell in the range.\nTo clear validation in a range, call this with no rule specified." }, - "AddBandingRequest": { - "description": "Adds a new banded range to the spreadsheet.", + "TextPosition": { + "description": "Position settings for text.", "type": "object", "properties": { - "bandedRange": { - "$ref": "BandedRange", - "description": "The banded range to add. The bandedRangeId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a range that already exists.)" + "horizontalAlignment": { + "description": "Horizontal alignment setting for the piece of text.", + "type": "string", + "enumDescriptions": [ + "The horizontal alignment is not specified. Do not use this.", + "The text is explicitly aligned to the left of the cell.", + "The text is explicitly aligned to the center of the cell.", + "The text is explicitly aligned to the right of the cell." + ], + "enum": [ + "HORIZONTAL_ALIGN_UNSPECIFIED", + "LEFT", + "CENTER", + "RIGHT" + ] } }, - "id": "AddBandingRequest" + "id": "TextPosition" }, - "Response": { + "BatchUpdateSpreadsheetRequest": { + "description": "The request for updating any aspect of a spreadsheet.", "type": "object", "properties": { - "deleteDeveloperMetadata": { - "description": "A reply from deleting a developer metadata entry.", - "$ref": "DeleteDeveloperMetadataResponse" - }, - "trimWhitespace": { - "description": "A reply from trimming whitespace.", - "$ref": "TrimWhitespaceResponse" - }, - "addFilterView": { - "description": "A reply from adding a filter view.", - "$ref": "AddFilterViewResponse" - }, - "deleteDuplicates": { - "$ref": "DeleteDuplicatesResponse", - "description": "A reply from removing rows containing duplicate values." - }, - "addBanding": { - "$ref": "AddBandingResponse", - "description": "A reply from adding a banded range." - }, - "addProtectedRange": { - "$ref": "AddProtectedRangeResponse", - "description": "A reply from adding a protected range." - }, - "duplicateSheet": { - "$ref": "DuplicateSheetResponse", - "description": "A reply from duplicating a sheet." - }, - "addSlicer": { - "$ref": "AddSlicerResponse", - "description": "A reply from adding a slicer." - }, - "updateEmbeddedObjectPosition": { - "$ref": "UpdateEmbeddedObjectPositionResponse", - "description": "A reply from updating an embedded object's position." - }, - "deleteConditionalFormatRule": { - "description": "A reply from deleting a conditional format rule.", - "$ref": "DeleteConditionalFormatRuleResponse" - }, - "deleteDimensionGroup": { - "description": "A reply from deleting a dimension group.", - "$ref": "DeleteDimensionGroupResponse" - }, - "duplicateFilterView": { - "$ref": "DuplicateFilterViewResponse", - "description": "A reply from duplicating a filter view." - }, - "addDimensionGroup": { - "description": "A reply from adding a dimension group.", - "$ref": "AddDimensionGroupResponse" - }, - "addChart": { - "$ref": "AddChartResponse", - "description": "A reply from adding a chart." - }, - "updateDeveloperMetadata": { - "description": "A reply from updating a developer metadata entry.", - "$ref": "UpdateDeveloperMetadataResponse" - }, - "findReplace": { - "$ref": "FindReplaceResponse", - "description": "A reply from doing a find/replace." - }, - "addSheet": { - "$ref": "AddSheetResponse", - "description": "A reply from adding a sheet." + "includeSpreadsheetInResponse": { + "description": "Determines if the update response should include the spreadsheet\nresource.", + "type": "boolean" }, - "updateConditionalFormatRule": { - "$ref": "UpdateConditionalFormatRuleResponse", - "description": "A reply from updating a conditional format rule." + "responseRanges": { + "description": "Limits the ranges included in the response spreadsheet.\nMeaningful only if include_spreadsheet_response is 'true'.", + "type": "array", + "items": { + "type": "string" + } }, - "createDeveloperMetadata": { - "$ref": "CreateDeveloperMetadataResponse", - "description": "A reply from creating a developer metadata entry." + "responseIncludeGridData": { + "description": "True if grid data should be returned. Meaningful only if\nif include_spreadsheet_in_response is 'true'.\nThis parameter is ignored if a field mask was set in the request.", + "type": "boolean" }, - "addNamedRange": { - "$ref": "AddNamedRangeResponse", - "description": "A reply from adding a named range." + "requests": { + "description": "A list of updates to apply to the spreadsheet.\nRequests will be applied in the order they are specified.\nIf any request is not valid, no requests will be applied.", + "type": "array", + "items": { + "$ref": "Request" + } } }, - "id": "Response", - "description": "A single response from an update." + "id": "BatchUpdateSpreadsheetRequest" }, - "EmbeddedChart": { - "description": "A chart embedded in a sheet.", + "Padding": { + "description": "The amount of padding around the cell, in pixels.\nWhen updating padding, every field must be specified.", "type": "object", "properties": { - "chartId": { - "description": "The ID of the chart.", + "left": { + "description": "The left padding of the cell.", "format": "int32", "type": "integer" }, - "position": { - "$ref": "EmbeddedObjectPosition", - "description": "The position of the chart." + "right": { + "type": "integer", + "description": "The right padding of the cell.", + "format": "int32" }, - "spec": { - "description": "The specification of the chart.", - "$ref": "ChartSpec" + "bottom": { + "description": "The bottom padding of the cell.", + "format": "int32", + "type": "integer" + }, + "top": { + "description": "The top padding of the cell.", + "format": "int32", + "type": "integer" } }, - "id": "EmbeddedChart" + "id": "Padding" }, - "InsertRangeRequest": { - "description": "Inserts cells into a range, shifting the existing cells over or down.", + "BasicChartAxis": { + "id": "BasicChartAxis", + "description": "An axis of the chart.\nA chart may not have more than one axis per\naxis position.", "type": "object", "properties": { - "shiftDimension": { - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ], - "description": "The dimension which will be shifted when inserting cells.\nIf ROWS, existing cells will be shifted down.\nIf COLUMNS, existing cells will be shifted right.", + "viewWindowOptions": { + "$ref": "ChartAxisViewWindowOptions", + "description": "The view window options for this axis." + }, + "position": { + "description": "The position of this axis.", "type": "string", "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." + "Default value, do not use.", + "The axis rendered at the bottom of a chart.\nFor most charts, this is the standard major axis.\nFor bar charts, this is a minor axis.", + "The axis rendered at the left of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is the standard major axis.", + "The axis rendered at the right of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is an unusual major axis." + ], + "enum": [ + "BASIC_CHART_AXIS_POSITION_UNSPECIFIED", + "BOTTOM_AXIS", + "LEFT_AXIS", + "RIGHT_AXIS" ] }, + "title": { + "description": "The title of this axis. If set, this overrides any title inferred\nfrom headers of the data.", + "type": "string" + }, + "titleTextPosition": { + "$ref": "TextPosition", + "description": "The axis title text position." + }, + "format": { + "$ref": "TextFormat", + "description": "The format of the title.\nOnly valid if the axis is not associated with the domain." + } + } + }, + "DeleteDimensionRequest": { + "type": "object", + "properties": { "range": { - "$ref": "GridRange", - "description": "The range to insert new cells into." + "$ref": "DimensionRange", + "description": "The dimensions to delete from the sheet." } }, - "id": "InsertRangeRequest" + "id": "DeleteDimensionRequest", + "description": "Deletes the dimensions from the sheet." }, - "AddNamedRangeResponse": { + "UpdateChartSpecRequest": { "type": "object", "properties": { - "namedRange": { - "$ref": "NamedRange", - "description": "The named range to add." + "chartId": { + "description": "The ID of the chart to update.", + "format": "int32", + "type": "integer" + }, + "spec": { + "$ref": "ChartSpec", + "description": "The specification to apply to the chart." } }, - "id": "AddNamedRangeResponse", - "description": "The result of adding a named range." + "id": "UpdateChartSpecRequest", + "description": "Updates a chart's specifications.\n(This does not move or resize a chart. To move or resize a chart, use\n UpdateEmbeddedObjectPositionRequest.)" }, - "AddSheetRequest": { - "description": "Adds a new sheet.\nWhen a sheet is added at a given index,\nall subsequent sheets' indexes are incremented.\nTo add an object sheet, use AddChartRequest instead and specify\nEmbeddedObjectPosition.sheetId or\nEmbeddedObjectPosition.newSheet.", + "DeleteFilterViewRequest": { + "description": "Deletes a particular filter view.", "type": "object", "properties": { - "properties": { - "$ref": "SheetProperties", - "description": "The properties the new sheet should have.\nAll properties are optional.\nThe sheetId field is optional; if one is not\nset, an id will be randomly generated. (It is an error to specify the ID\nof a sheet that already exists.)" + "filterId": { + "description": "The ID of the filter to delete.", + "format": "int32", + "type": "integer" } }, - "id": "AddSheetRequest" + "id": "DeleteFilterViewRequest" }, - "AddSlicerRequest": { - "description": "Adds a slicer to a sheet in the spreadsheet.", + "BatchGetValuesByDataFilterRequest": { + "description": "The request for retrieving a range of values in a spreadsheet selected by a\nset of DataFilters.", "type": "object", "properties": { - "slicer": { - "$ref": "Slicer", - "description": "The slicer that should be added to the spreadsheet, including\nthe position where it should be placed. The slicerId field is optional; if one is not set, an id\nwill be randomly generated. (It is an error to specify the ID\nof a slicer that already exists.)" + "dataFilters": { + "description": "The data filters used to match the ranges of values to retrieve. Ranges\nthat match any of the specified data filters will be included in the\nresponse.", + "type": "array", + "items": { + "$ref": "DataFilter" + } + }, + "valueRenderOption": { + "enumDescriptions": [ + "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", + "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", + "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." + ], + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" + ], + "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", + "type": "string" + }, + "dateTimeRenderOption": { + "type": "string", + "enumDescriptions": [ + "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", + "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." + ], + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ], + "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER]." + }, + "majorDimension": { + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen a request that selects that range and sets `majorDimension=ROWS` will\nreturn `[[1,2],[3,4]]`,\nwhereas a request that sets `majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`." } }, - "id": "AddSlicerRequest" - }, - "DeleteConditionalFormatRuleResponse": { - "id": "DeleteConditionalFormatRuleResponse", - "description": "The result of deleting a conditional format rule.", - "type": "object", - "properties": { - "rule": { - "description": "The rule that was deleted.", - "$ref": "ConditionalFormatRule" - } - } + "id": "BatchGetValuesByDataFilterRequest" }, - "GridCoordinate": { - "description": "A coordinate in a sheet.\nAll indexes are zero-based.", + "BatchUpdateValuesResponse": { + "description": "The response when updating a range of values in a spreadsheet.", "type": "object", "properties": { - "rowIndex": { - "type": "integer", - "description": "The row index of the coordinate.", - "format": "int32" + "totalUpdatedCells": { + "description": "The total number of cells updated.", + "format": "int32", + "type": "integer" }, - "columnIndex": { - "description": "The column index of the coordinate.", + "totalUpdatedColumns": { + "description": "The total number of columns where at least one cell in the column was\nupdated.", "format": "int32", "type": "integer" }, - "sheetId": { + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", + "type": "string" + }, + "totalUpdatedRows": { "type": "integer", - "description": "The sheet this coordinate is on.", + "description": "The total number of rows where at least one cell in the row was updated.", "format": "int32" + }, + "responses": { + "description": "One UpdateValuesResponse per requested range, in the same order as\nthe requests appeared.", + "type": "array", + "items": { + "$ref": "UpdateValuesResponse" + } + }, + "totalUpdatedSheets": { + "description": "The total number of sheets where at least one cell in the sheet was\nupdated.", + "format": "int32", + "type": "integer" } }, - "id": "GridCoordinate" + "id": "BatchUpdateValuesResponse" }, - "UpdateSheetPropertiesRequest": { - "description": "Updates properties of the sheet with the specified\nsheetId.", + "KeyValueFormat": { + "description": "Formatting options for key value.", "type": "object", "properties": { - "properties": { - "description": "The properties to update.", - "$ref": "SheetProperties" + "position": { + "$ref": "TextPosition", + "description": "Specifies the horizontal text positioning of key value.\nThis field is optional. If not specified, default positioning is used." }, - "fields": { - "type": "string", - "description": "The fields that should be updated. At least one field must be specified.\nThe root `properties` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask" + "textFormat": { + "$ref": "TextFormat", + "description": "Text formatting options for key value." } }, - "id": "UpdateSheetPropertiesRequest" + "id": "KeyValueFormat" }, - "AddSlicerResponse": { - "description": "The result of adding a slicer to a spreadsheet.", + "BatchClearValuesRequest": { + "description": "The request for clearing more than one range of values in a spreadsheet.", "type": "object", "properties": { - "slicer": { - "$ref": "Slicer", - "description": "The newly added slicer." + "ranges": { + "description": "The ranges to clear, in A1 notation.", + "type": "array", + "items": { + "type": "string" + } } }, - "id": "AddSlicerResponse" + "id": "BatchClearValuesRequest" }, - "GridProperties": { + "DeveloperMetadata": { "type": "object", "properties": { - "rowCount": { - "description": "The number of rows in the grid.", - "format": "int32", - "type": "integer" + "metadataValue": { + "type": "string", + "description": "Data associated with the metadata's key." }, - "hideGridlines": { - "description": "True if the grid isn't showing gridlines in the UI.", - "type": "boolean" + "metadataKey": { + "type": "string", + "description": "The metadata key. There may be multiple metadata in a spreadsheet with the\nsame key. Developer metadata must always have a key specified." }, - "frozenRowCount": { + "metadataId": { "type": "integer", - "description": "The number of rows that are frozen in the grid.", + "description": "The spreadsheet-scoped unique ID that identifies the metadata. IDs may be\nspecified when metadata is created, otherwise one will be randomly\ngenerated and assigned. Must be positive.", "format": "int32" }, - "columnCount": { - "description": "The number of columns in the grid.", - "format": "int32", - "type": "integer" - }, - "frozenColumnCount": { - "description": "The number of columns that are frozen in the grid.", - "format": "int32", - "type": "integer" - }, - "columnGroupControlAfter": { - "type": "boolean", - "description": "True if the column grouping control toggle is shown after the group." + "location": { + "$ref": "DeveloperMetadataLocation", + "description": "The location where the metadata is associated." }, - "rowGroupControlAfter": { - "description": "True if the row grouping control toggle is shown after the group.", - "type": "boolean" + "visibility": { + "enum": [ + "DEVELOPER_METADATA_VISIBILITY_UNSPECIFIED", + "DOCUMENT", + "PROJECT" + ], + "description": "The metadata visibility. Developer metadata must always have a visibility\nspecified.", + "type": "string", + "enumDescriptions": [ + "Default value.", + "Document-visible metadata is accessible from any developer project with\naccess to the document.", + "Project-visible metadata is only visible to and accessible by the developer\nproject that created the metadata." + ] } }, - "id": "GridProperties", - "description": "Properties of a grid." + "id": "DeveloperMetadata", + "description": "Developer metadata associated with a location or object in a spreadsheet.\nDeveloper metadata may be used to associate arbitrary data with various\nparts of a spreadsheet and will remain associated at those locations as they\nmove around and the spreadsheet is edited. For example, if developer\nmetadata is associated with row 5 and another row is then subsequently\ninserted above row 5, that original metadata will still be associated with\nthe row it was first associated with (what is now row 6). If the associated\nobject is deleted its metadata is deleted too." }, - "Sheet": { + "BaselineValueFormat": { "type": "object", "properties": { - "properties": { - "$ref": "SheetProperties", - "description": "The properties of the sheet." - }, - "columnGroups": { - "description": "All column groups on this sheet, ordered by increasing range start index,\nthen by group depth.", - "type": "array", - "items": { - "$ref": "DimensionGroup" - } - }, - "conditionalFormats": { - "description": "The conditional format rules in this sheet.", - "type": "array", - "items": { - "$ref": "ConditionalFormatRule" - } - }, - "protectedRanges": { - "description": "The protected ranges in this sheet.", - "type": "array", - "items": { - "$ref": "ProtectedRange" - } - }, - "developerMetadata": { - "description": "The developer metadata associated with a sheet.", - "type": "array", - "items": { - "$ref": "DeveloperMetadata" - } - }, - "basicFilter": { - "$ref": "BasicFilter", - "description": "The filter on this sheet, if any." + "textFormat": { + "$ref": "TextFormat", + "description": "Text formatting options for baseline value." }, - "merges": { - "description": "The ranges that are merged together.", - "type": "array", - "items": { - "$ref": "GridRange" - } + "description": { + "description": "Description which is appended after the baseline value.\nThis field is optional.", + "type": "string" }, - "bandedRanges": { - "description": "The banded (alternating colors) ranges on this sheet.", - "type": "array", - "items": { - "$ref": "BandedRange" - } + "negativeColor": { + "$ref": "Color", + "description": "Color to be used, in case baseline value represents a negative change for\nkey value. This field is optional." }, - "charts": { - "description": "The specifications of every chart on this sheet.", - "type": "array", - "items": { - "$ref": "EmbeddedChart" - } + "comparisonType": { + "enum": [ + "COMPARISON_TYPE_UNDEFINED", + "ABSOLUTE_DIFFERENCE", + "PERCENTAGE_DIFFERENCE" + ], + "description": "The comparison type of key value with baseline value.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "Use absolute difference between key and baseline value.", + "Use percentage difference between key and baseline value." + ] }, - "filterViews": { - "description": "The filter views in this sheet.", - "type": "array", - "items": { - "$ref": "FilterView" - } + "position": { + "description": "Specifies the horizontal text positioning of baseline value.\nThis field is optional. If not specified, default positioning is used.", + "$ref": "TextPosition" }, - "slicers": { - "description": "The slicers on this sheet.", - "type": "array", - "items": { - "$ref": "Slicer" - } + "positiveColor": { + "$ref": "Color", + "description": "Color to be used, in case baseline value represents a positive change for\nkey value. This field is optional." + } + }, + "id": "BaselineValueFormat", + "description": "Formatting options for baseline value." + }, + "DimensionGroup": { + "id": "DimensionGroup", + "description": "A group over an interval of rows or columns on a sheet, which can contain or\nbe contained within other groups. A group can be collapsed or expanded as a\nunit on the sheet.", + "type": "object", + "properties": { + "collapsed": { + "description": "This field is true if this group is collapsed. A collapsed group remains\ncollapsed if an overlapping group at a shallower depth is expanded.\n\nA true value does not imply that all dimensions within the group are\nhidden, since a dimension's visibility can change independently from this\ngroup property. However, when this property is updated, all dimensions\nwithin it are set to hidden if this field is true, or set to visible if\nthis field is false.", + "type": "boolean" }, - "rowGroups": { - "description": "All row groups on this sheet, ordered by increasing range start index, then\nby group depth.", - "type": "array", - "items": { - "$ref": "DimensionGroup" - } + "range": { + "description": "The range over which this group exists.", + "$ref": "DimensionRange" }, - "data": { - "description": "Data in the grid, if this is a grid sheet.\nThe number of GridData objects returned is dependent on the number of\nranges requested on this sheet. For example, if this is representing\n`Sheet1`, and the spreadsheet was requested with ranges\n`Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a\nstartRow/startColumn of `0`,\nwhile the second one will have `startRow 14` (zero-based row 15),\nand `startColumn 3` (zero-based column D).", - "type": "array", - "items": { - "$ref": "GridData" - } + "depth": { + "description": "The depth of the group, representing how many groups have a range that\nwholly contains the range of this group.", + "format": "int32", + "type": "integer" + } + } + }, + "ClearBasicFilterRequest": { + "id": "ClearBasicFilterRequest", + "description": "Clears the basic filter, if any exists on the sheet.", + "type": "object", + "properties": { + "sheetId": { + "description": "The sheet ID on which the basic filter should be cleared.", + "format": "int32", + "type": "integer" } - }, - "id": "Sheet", - "description": "A sheet in a spreadsheet." + } }, - "FilterCriteria": { - "description": "Criteria for showing/hiding rows in a filter or filter view.", + "TextToColumnsRequest": { + "description": "Splits a column of text into multiple columns,\nbased on a delimiter in each cell.", "type": "object", "properties": { - "hiddenValues": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Values that should be hidden." - }, - "condition": { - "$ref": "BooleanCondition", - "description": "A condition that must be true for values to be shown.\n(This does not override hidden_values -- if a value is listed there,\n it will still be hidden.)" + "source": { + "$ref": "GridRange", + "description": "The source data range. This must span exactly one column." }, - "visibleBackgroundColor": { - "$ref": "Color", - "description": "The background fill color to filter by; only cells with this fill color are\nshown. Mutually exclusive with all other filter criteria. Requests to set\nthis field will fail with a 400 error if any other filter criteria field is\nset." + "delimiterType": { + "type": "string", + "enumDescriptions": [ + "Default value. This value must not be used.", + "\",\"", + "\";\"", + "\".\"", + "\" \"", + "A custom value as defined in delimiter.", + "Automatically detect columns." + ], + "enum": [ + "DELIMITER_TYPE_UNSPECIFIED", + "COMMA", + "SEMICOLON", + "PERIOD", + "SPACE", + "CUSTOM", + "AUTODETECT" + ], + "description": "The delimiter type to use." }, - "visibleForegroundColor": { - "description": "The text color to filter by; only cells with this text color are shown.\nMutually exclusive with all other filter criteria. Requests to set this\nfield will fail with a 400 error if any other filter criteria field is set.", - "$ref": "Color" + "delimiter": { + "description": "The delimiter to use. Used only if delimiterType is\nCUSTOM.", + "type": "string" } }, - "id": "FilterCriteria" + "id": "TextToColumnsRequest" }, - "PivotGroupValueMetadata": { + "DeleteBandingRequest": { + "description": "Removes the banded range with the given ID from the spreadsheet.", "type": "object", "properties": { - "value": { - "description": "The calculated value the metadata corresponds to.\n(Note that formulaValue is not valid,\n because the values will be calculated.)", - "$ref": "ExtendedValue" - }, - "collapsed": { - "description": "True if the data corresponding to the value is collapsed.", - "type": "boolean" + "bandedRangeId": { + "description": "The ID of the banded range to delete.", + "format": "int32", + "type": "integer" } }, - "id": "PivotGroupValueMetadata", - "description": "Metadata about a value in a pivot grouping." + "id": "DeleteBandingRequest" }, - "Editors": { - "id": "Editors", - "description": "The editors of a protected range.", + "AppendValuesResponse": { + "id": "AppendValuesResponse", + "description": "The response when updating a range of values in a spreadsheet.", "type": "object", "properties": { - "users": { - "description": "The email addresses of users with edit access to the protected range.", - "type": "array", - "items": { - "type": "string" - } + "updates": { + "description": "Information about the updates that were applied.", + "$ref": "UpdateValuesResponse" }, - "groups": { - "description": "The email addresses of groups with edit access to the protected range.", + "tableRange": { + "description": "The range (in A1 notation) of the table that values are being appended to\n(before the values were appended).\nEmpty if no table was found.", + "type": "string" + }, + "spreadsheetId": { + "type": "string", + "description": "The spreadsheet the updates were applied to." + } + } + }, + "PivotFilterCriteria": { + "description": "Criteria for showing/hiding rows in a pivot table.", + "type": "object", + "properties": { + "visibleValues": { + "description": "Values that should be included. Values not listed here are excluded.", "type": "array", "items": { "type": "string" } - }, - "domainUsersCanEdit": { - "description": "True if anyone in the document's domain has edit access to the protected\nrange. Domain protection is only supported on documents within a domain.", - "type": "boolean" } - } + }, + "id": "PivotFilterCriteria" }, - "DataValidationRule": { - "description": "A data validation rule.", + "MoveDimensionRequest": { "type": "object", "properties": { - "showCustomUi": { - "description": "True if the UI should be customized based on the kind of condition.\nIf true, \"List\" conditions will show a dropdown.", - "type": "boolean" - }, - "strict": { - "description": "True if invalid data should be rejected.", - "type": "boolean" - }, - "inputMessage": { - "description": "A message to show the user when adding data to the cell.", - "type": "string" + "destinationIndex": { + "description": "The zero-based start index of where to move the source data to,\nbased on the coordinates *before* the source data is removed\nfrom the grid. Existing data will be shifted down or right\n(depending on the dimension) to make room for the moved dimensions.\nThe source dimensions are removed from the grid, so the\nthe data may end up in a different index than specified.\n\nFor example, given `A1..A5` of `0, 1, 2, 3, 4` and wanting to move\n`\"1\"` and `\"2\"` to between `\"3\"` and `\"4\"`, the source would be\n`ROWS [1..3)`,and the destination index would be `\"4\"`\n(the zero-based index of row 5).\nThe end result would be `A1..A5` of `0, 3, 1, 2, 4`.", + "format": "int32", + "type": "integer" }, - "condition": { - "$ref": "BooleanCondition", - "description": "The condition that data in the cell must match." + "source": { + "$ref": "DimensionRange", + "description": "The source dimensions to move." } }, - "id": "DataValidationRule" + "id": "MoveDimensionRequest", + "description": "Moves one or more rows or columns." }, - "TextRotation": { - "description": "The rotation applied to text in a cell.", + "AddConditionalFormatRuleRequest": { "type": "object", "properties": { - "angle": { - "description": "The angle between the standard orientation and the desired orientation.\nMeasured in degrees. Valid values are between -90 and 90. Positive\nangles are angled upwards, negative are angled downwards.\n\nNote: For LTR text direction positive angles are in the\ncounterclockwise direction, whereas for RTL they are in the clockwise\ndirection", + "rule": { + "description": "The rule to add.", + "$ref": "ConditionalFormatRule" + }, + "index": { + "description": "The zero-based index where the rule should be inserted.", "format": "int32", "type": "integer" + } + }, + "id": "AddConditionalFormatRuleRequest", + "description": "Adds a new conditional format rule at the given index.\nAll subsequent rules' indexes are incremented." + }, + "CreateDeveloperMetadataRequest": { + "description": "A request to create developer metadata.", + "type": "object", + "properties": { + "developerMetadata": { + "description": "The developer metadata to create.", + "$ref": "DeveloperMetadata" + } + }, + "id": "CreateDeveloperMetadataRequest" + }, + "ChartSpec": { + "id": "ChartSpec", + "description": "The specifications of a chart.", + "type": "object", + "properties": { + "title": { + "description": "The title of the chart.", + "type": "string" }, - "vertical": { - "description": "If true, text reads top to bottom, but the orientation of individual\ncharacters is unchanged.\nFor example:\n\n | V |\n | e |\n | r |\n | t |\n | i |\n | c |\n | a |\n | l |", + "altText": { + "description": "The alternative text that describes the chart. This is often used\nfor accessibility.", + "type": "string" + }, + "titleTextPosition": { + "$ref": "TextPosition", + "description": "The title text position.\nThis field is optional." + }, + "histogramChart": { + "$ref": "HistogramChartSpec", + "description": "A histogram chart specification." + }, + "candlestickChart": { + "description": "A candlestick chart specification.", + "$ref": "CandlestickChartSpec" + }, + "bubbleChart": { + "description": "A bubble chart specification.", + "$ref": "BubbleChartSpec" + }, + "waterfallChart": { + "description": "A waterfall chart specification.", + "$ref": "WaterfallChartSpec" + }, + "fontName": { + "description": "The name of the font to use by default for all chart text (e.g. title,\naxis labels, legend). If a font is specified for a specific part of the\nchart it will override this font name.", + "type": "string" + }, + "maximized": { + "description": "True to make a chart fill the entire space in which it's rendered with\nminimum padding. False to use the default padding.\n(Not applicable to Geo and Org charts.)", "type": "boolean" + }, + "treemapChart": { + "$ref": "TreemapChartSpec", + "description": "A treemap chart specification." + }, + "hiddenDimensionStrategy": { + "description": "Determines how the charts will use hidden rows or columns.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "Charts will skip hidden rows and columns.", + "Charts will skip hidden rows only.", + "Charts will skip hidden columns only.", + "Charts will not skip any hidden rows or columns." + ], + "enum": [ + "CHART_HIDDEN_DIMENSION_STRATEGY_UNSPECIFIED", + "SKIP_HIDDEN_ROWS_AND_COLUMNS", + "SKIP_HIDDEN_ROWS", + "SKIP_HIDDEN_COLUMNS", + "SHOW_ALL" + ] + }, + "subtitleTextFormat": { + "description": "The subtitle text format.\nStrikethrough and underline are not supported.", + "$ref": "TextFormat" + }, + "subtitle": { + "description": "The subtitle of the chart.", + "type": "string" + }, + "subtitleTextPosition": { + "$ref": "TextPosition", + "description": "The subtitle text position.\nThis field is optional." + }, + "backgroundColor": { + "$ref": "Color", + "description": "The background color of the entire chart.\nNot applicable to Org charts." + }, + "basicChart": { + "$ref": "BasicChartSpec", + "description": "A basic chart specification, can be one of many kinds of charts.\nSee BasicChartType for the list of all\ncharts this supports." + }, + "orgChart": { + "$ref": "OrgChartSpec", + "description": "An org chart specification." + }, + "scorecardChart": { + "description": "A scorecard chart specification.", + "$ref": "ScorecardChartSpec" + }, + "pieChart": { + "$ref": "PieChartSpec", + "description": "A pie chart specification." + }, + "titleTextFormat": { + "$ref": "TextFormat", + "description": "The title text format.\nStrikethrough and underline are not supported." } - }, - "id": "TextRotation" + } }, - "DeleteDimensionGroupResponse": { + "BatchGetValuesByDataFilterResponse": { "type": "object", "properties": { - "dimensionGroups": { - "description": "All groups of a dimension after deleting a group from that dimension.", + "valueRanges": { + "description": "The requested values with the list of data filters that matched them.", "type": "array", "items": { - "$ref": "DimensionGroup" + "$ref": "MatchedValueRange" } + }, + "spreadsheetId": { + "description": "The ID of the spreadsheet the data was retrieved from.", + "type": "string" } }, - "id": "DeleteDimensionGroupResponse", - "description": "The result of deleting a group." + "id": "BatchGetValuesByDataFilterResponse", + "description": "The response when retrieving more than one range of values in a spreadsheet\nselected by DataFilters." }, - "PieChartSpec": { - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/piechart\"\u003epie chart\u003c/a\u003e.", + "LineStyle": { + "description": "Properties that describe the style of a line.", "type": "object", "properties": { - "domain": { - "description": "The data that covers the domain of the pie chart.", - "$ref": "ChartData" - }, - "threeDimensional": { - "type": "boolean", - "description": "True if the pie is three dimensional." - }, - "series": { - "description": "The data that covers the one and only series of the pie chart.", - "$ref": "ChartData" - }, - "legendPosition": { - "description": "Where the legend of the pie chart should be drawn.", + "type": { + "description": "The dash type of the line.", "type": "string", "enumDescriptions": [ "Default value, do not use.", - "The legend is rendered on the bottom of the chart.", - "The legend is rendered on the left of the chart.", - "The legend is rendered on the right of the chart.", - "The legend is rendered on the top of the chart.", - "No legend is rendered.", - "Each pie slice has a label attached to it." + "No dash type, which is equivalent to a non-visible line.", + "A custom dash for a line. Modifying the exact custom dash style is\ncurrently unsupported.", + "A solid line.", + "A dotted line.", + "A dashed line where the dashes have \"medium\" length.", + "A line that alternates between a \"medium\" dash and a dot.", + "A dashed line where the dashes have \"long\" length.", + "A line that alternates between a \"long\" dash and a dot." ], "enum": [ - "PIE_CHART_LEGEND_POSITION_UNSPECIFIED", - "BOTTOM_LEGEND", - "LEFT_LEGEND", - "RIGHT_LEGEND", - "TOP_LEGEND", - "NO_LEGEND", - "LABELED_LEGEND" + "LINE_DASH_TYPE_UNSPECIFIED", + "INVISIBLE", + "CUSTOM", + "SOLID", + "DOTTED", + "MEDIUM_DASHED", + "MEDIUM_DASHED_DOTTED", + "LONG_DASHED", + "LONG_DASHED_DOTTED" ] }, - "pieHole": { - "type": "number", - "description": "The size of the hole in the pie chart.", - "format": "double" + "width": { + "description": "The thickness of the line, in px.", + "format": "int32", + "type": "integer" } }, - "id": "PieChartSpec" - }, - "UpdateDeveloperMetadataRequest": { - "id": "UpdateDeveloperMetadataRequest", - "description": "A request to update properties of developer metadata.\nUpdates the properties of the developer metadata selected by the filters to\nthe values provided in the DeveloperMetadata resource. Callers must\nspecify the properties they wish to update in the fields parameter, as well\nas specify at least one DataFilter matching the metadata they wish to\nupdate.", - "type": "object", - "properties": { - "dataFilters": { - "type": "array", - "items": { - "$ref": "DataFilter" - }, - "description": "The filters matching the developer metadata entries to update." - }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `developerMetadata` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" - }, - "developerMetadata": { - "$ref": "DeveloperMetadata", - "description": "The value that all metadata matched by the data filters will be updated to." - } - } + "id": "LineStyle" }, - "UpdateFilterViewRequest": { - "id": "UpdateFilterViewRequest", - "description": "Updates properties of the filter view.", + "CandlestickDomain": { + "id": "CandlestickDomain", + "description": "The domain of a CandlestickChart.", "type": "object", "properties": { - "filter": { - "$ref": "FilterView", - "description": "The new properties of the filter view." + "data": { + "description": "The data of the CandlestickDomain.", + "$ref": "ChartData" }, - "fields": { - "type": "string", - "description": "The fields that should be updated. At least one field must be specified.\nThe root `filter` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask" + "reversed": { + "description": "True to reverse the order of the domain values (horizontal axis).", + "type": "boolean" } } }, - "UpdateSlicerSpecRequest": { - "description": "Updates a slicer’s specifications.\n(This does not move or resize a slicer. To move or resize a slicer use\nUpdateEmbeddedObjectPositionRequest.", + "SheetProperties": { + "description": "Properties of a sheet.", "type": "object", "properties": { - "spec": { - "$ref": "SlicerSpec", - "description": "The specification to apply to the slicer." - }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `SlicerSpec` is implied and should not be specified. A single \"*\"`\ncan be used as short-hand for listing every field.", - "format": "google-fieldmask", + "title": { + "description": "The name of the sheet.", "type": "string" }, - "slicerId": { - "description": "The id of the slicer to update.", + "tabColor": { + "$ref": "Color", + "description": "The color of the tab in the UI." + }, + "index": { + "description": "The index of the sheet within the spreadsheet.\nWhen adding or updating sheet properties, if this field\nis excluded then the sheet is added or moved to the end\nof the sheet list. When updating sheet indices or inserting\nsheets, movement is considered in \"before the move\" indexes.\nFor example, if there were 3 sheets (S1, S2, S3) in order to\nmove S1 ahead of S2 the index would have to be set to 2. A sheet\nindex update request is ignored if the requested index is\nidentical to the sheets current index or if the requested new\nindex is equal to the current sheet index + 1.", "format": "int32", "type": "integer" - } - }, - "id": "UpdateSlicerSpecRequest" - }, - "ConditionalFormatRule": { - "description": "A rule describing a conditional format.", - "type": "object", - "properties": { - "ranges": { - "description": "The ranges that are formatted if the condition is true.\nAll the ranges must be on the same grid.", - "type": "array", - "items": { - "$ref": "GridRange" - } }, - "gradientRule": { - "$ref": "GradientRule", - "description": "The formatting will vary based on the gradients in the rule." + "sheetId": { + "type": "integer", + "description": "The ID of the sheet. Must be non-negative.\nThis field cannot be changed once set.", + "format": "int32" }, - "booleanRule": { - "$ref": "BooleanRule", - "description": "The formatting is either \"on\" or \"off\" according to the rule." - } - }, - "id": "ConditionalFormatRule" - }, - "CopyPasteRequest": { - "id": "CopyPasteRequest", - "description": "Copies data from the source to the destination.", - "type": "object", - "properties": { - "source": { - "$ref": "GridRange", - "description": "The source range to copy." + "rightToLeft": { + "description": "True if the sheet is an RTL sheet instead of an LTR sheet.", + "type": "boolean" }, - "pasteType": { - "type": "string", - "enumDescriptions": [ - "Paste values, formulas, formats, and merges.", - "Paste the values ONLY without formats, formulas, or merges.", - "Paste the format and data validation only.", - "Like PASTE_NORMAL but without borders.", - "Paste the formulas only.", - "Paste the data validation only.", - "Paste the conditional formatting rules only." - ], - "enum": [ - "PASTE_NORMAL", - "PASTE_VALUES", - "PASTE_FORMAT", - "PASTE_NO_BORDERS", - "PASTE_FORMULA", - "PASTE_DATA_VALIDATION", - "PASTE_CONDITIONAL_FORMATTING" - ], - "description": "What kind of data to paste." + "hidden": { + "description": "True if the sheet is hidden in the UI, false if it's visible.", + "type": "boolean" }, - "destination": { - "description": "The location to paste to. If the range covers a span that's\na multiple of the source's height or width, then the\ndata will be repeated to fill in the destination range.\nIf the range is smaller than the source range, the entire\nsource data will still be copied (beyond the end of the destination range).", - "$ref": "GridRange" + "gridProperties": { + "$ref": "GridProperties", + "description": "Additional properties of the sheet if this sheet is a grid.\n(If the sheet is an object sheet, containing a chart or image, then\nthis field will be absent.)\nWhen writing it is an error to set any grid properties on non-grid sheets." }, - "pasteOrientation": { - "enumDescriptions": [ - "Paste normally.", - "Paste transposed, where all rows become columns and vice versa." - ], - "enum": [ - "NORMAL", - "TRANSPOSE" - ], - "description": "How that data should be oriented when pasting.", - "type": "string" - } - } - }, - "BooleanCondition": { - "description": "A condition that can evaluate to true or false.\nBooleanConditions are used by conditional formatting,\ndata validation, and the criteria in filters.", - "type": "object", - "properties": { - "type": { + "sheetType": { + "description": "The type of sheet. Defaults to GRID.\nThis field cannot be changed once set.", + "type": "string", "enumDescriptions": [ - "The default value, do not use.", - "The cell's value must be greater than the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be greater than or equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be less than the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be less than or equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be not equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be between the two condition values.\nSupported by data validation, conditional formatting and filters.\nRequires exactly two ConditionValues.", - "The cell's value must not be between the two condition values.\nSupported by data validation, conditional formatting and filters.\nRequires exactly two ConditionValues.", - "The cell's value must contain the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must not contain the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must start with the condition's value.\nSupported by conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must end with the condition's value.\nSupported by conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be exactly the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be a valid email address.\nSupported by data validation.\nRequires no ConditionValues.", - "The cell's value must be a valid URL.\nSupported by data validation.\nRequires no ConditionValues.", - "The cell's value must be the same date as the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be before the date of the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue\nthat may be a relative date.", - "The cell's value must be after the date of the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue\nthat may be a relative date.", - "The cell's value must be on or before the date of the condition's value.\nSupported by data validation.\nRequires a single ConditionValue\nthat may be a relative date.", - "The cell's value must be on or after the date of the condition's value.\nSupported by data validation.\nRequires a single ConditionValue\nthat may be a relative date.", - "The cell's value must be between the dates of the two condition values.\nSupported by data validation.\nRequires exactly two ConditionValues.", - "The cell's value must be outside the dates of the two condition values.\nSupported by data validation.\nRequires exactly two ConditionValues.", - "The cell's value must be a date.\nSupported by data validation.\nRequires no ConditionValues.", - "The cell's value must be listed in the grid in condition value's range.\nSupported by data validation.\nRequires a single ConditionValue,\nand the value must be a valid range in A1 notation.", - "The cell's value must be in the list of condition values.\nSupported by data validation.\nSupports any number of condition values,\none per item in the list.\nFormulas are not supported in the values.", - "The cell's value must be empty.\nSupported by conditional formatting and filters.\nRequires no ConditionValues.", - "The cell's value must not be empty.\nSupported by conditional formatting and filters.\nRequires no ConditionValues.", - "The condition's formula must evaluate to true.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be TRUE/FALSE or in the list of condition values.\nSupported by data validation.\nRenders as a cell checkbox.\nSupports zero, one or two ConditionValues. No\nvalues indicates the cell must be TRUE or FALSE, where TRUE renders as\nchecked and FALSE renders as unchecked. One value indicates the cell\nwill render as checked when it contains that value and unchecked when it\nis blank. Two values indicate that the cell will render as checked when\nit contains the first value and unchecked when it contains the second\nvalue. For example, [\"Yes\",\"No\"] indicates that the cell will render a\nchecked box when it has the value \"Yes\" and an unchecked box when it has\nthe value \"No\"." - ], - "enum": [ - "CONDITION_TYPE_UNSPECIFIED", - "NUMBER_GREATER", - "NUMBER_GREATER_THAN_EQ", - "NUMBER_LESS", - "NUMBER_LESS_THAN_EQ", - "NUMBER_EQ", - "NUMBER_NOT_EQ", - "NUMBER_BETWEEN", - "NUMBER_NOT_BETWEEN", - "TEXT_CONTAINS", - "TEXT_NOT_CONTAINS", - "TEXT_STARTS_WITH", - "TEXT_ENDS_WITH", - "TEXT_EQ", - "TEXT_IS_EMAIL", - "TEXT_IS_URL", - "DATE_EQ", - "DATE_BEFORE", - "DATE_AFTER", - "DATE_ON_OR_BEFORE", - "DATE_ON_OR_AFTER", - "DATE_BETWEEN", - "DATE_NOT_BETWEEN", - "DATE_IS_VALID", - "ONE_OF_RANGE", - "ONE_OF_LIST", - "BLANK", - "NOT_BLANK", - "CUSTOM_FORMULA", - "BOOLEAN" + "Default value, do not use.", + "The sheet is a grid.", + "The sheet has no grid and instead has an object like a chart or image." ], - "description": "The type of condition.", - "type": "string" - }, - "values": { - "type": "array", - "items": { - "$ref": "ConditionValue" - }, - "description": "The values of the condition. The number of supported values depends\non the condition type. Some support zero values,\nothers one or two values,\nand ConditionType.ONE_OF_LIST supports an arbitrary number of values." + "enum": [ + "SHEET_TYPE_UNSPECIFIED", + "GRID", + "OBJECT" + ] } }, - "id": "BooleanCondition" + "id": "SheetProperties" }, - "BasicChartSpec": { - "id": "BasicChartSpec", - "description": "The specification for a basic chart. See BasicChartType for the list\nof charts this supports.", + "UpdateDimensionPropertiesRequest": { + "id": "UpdateDimensionPropertiesRequest", + "description": "Updates properties of dimensions within the specified range.", "type": "object", "properties": { - "headerCount": { - "description": "The number of rows or columns in the data that are \"headers\".\nIf not set, Google Sheets will guess how many rows are headers based\non the data.\n\n(Note that BasicChartAxis.title may override the axis title\n inferred from the header values.)", + "properties": { + "description": "Properties to update.", + "$ref": "DimensionProperties" + }, + "range": { + "$ref": "DimensionRange", + "description": "The rows or columns to update." + }, + "fields": { + "type": "string", + "description": "The fields that should be updated. At least one field must be specified.\nThe root `properties` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask" + } + } + }, + "SourceAndDestination": { + "type": "object", + "properties": { + "fillLength": { + "description": "The number of rows or columns that data should be filled into.\nPositive numbers expand beyond the last row or last column\nof the source. Negative numbers expand before the first row\nor first column of the source.", "format": "int32", "type": "integer" }, - "stackedType": { + "source": { + "$ref": "GridRange", + "description": "The location of the data to use as the source of the autofill." + }, + "dimension": { "type": "string", "enumDescriptions": [ - "Default value, do not use.", - "Series are not stacked.", - "Series values are stacked, each value is rendered vertically beginning\nfrom the top of the value below it.", - "Vertical stacks are stretched to reach the top of the chart, with\nvalues laid out as percentages of each other." + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." ], "enum": [ - "BASIC_CHART_STACKED_TYPE_UNSPECIFIED", - "NOT_STACKED", - "STACKED", - "PERCENT_STACKED" + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" ], - "description": "The stacked type for charts that support vertical stacking.\nApplies to Area, Bar, Column, Combo, and Stepped Area charts." + "description": "The dimension that data should be filled into." + } + }, + "id": "SourceAndDestination", + "description": "A combination of a source range and how to extend that source." + }, + "SlicerSpec": { + "description": "The specifications of a slicer.", + "type": "object", + "properties": { + "backgroundColor": { + "$ref": "Color", + "description": "The background color of the slicer." }, - "threeDimensional": { - "type": "boolean", - "description": "True to make the chart 3D.\nApplies to Bar and Column charts." + "filterCriteria": { + "$ref": "FilterCriteria", + "description": "The filtering criteria of the slicer." }, - "axis": { - "type": "array", - "items": { - "$ref": "BasicChartAxis" - }, - "description": "The axis on the chart." + "dataRange": { + "$ref": "GridRange", + "description": "The data range of the slicer." }, - "chartType": { - "description": "The type of the chart.", + "applyToPivotTables": { + "description": "True if the filter should apply to pivot tables.\nIf not set, default to `True`.", + "type": "boolean" + }, + "columnIndex": { + "description": "The column index in the data table on which the filter is applied to.", + "format": "int32", + "type": "integer" + }, + "title": { + "description": "The title of the slicer.", + "type": "string" + }, + "horizontalAlignment": { "type": "string", "enumDescriptions": [ - "Default value, do not use.", - "A \u003ca href=\"/chart/interactive/docs/gallery/barchart\"\u003ebar chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/linechart\"\u003eline chart\u003c/a\u003e.", - "An \u003ca href=\"/chart/interactive/docs/gallery/areachart\"\u003earea chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/columnchart\"\u003ecolumn chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/scatterchart\"\u003escatter\nchart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/combochart\"\u003ecombo chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/steppedareachart\"\u003estepped area\nchart\u003c/a\u003e." + "The horizontal alignment is not specified. Do not use this.", + "The text is explicitly aligned to the left of the cell.", + "The text is explicitly aligned to the center of the cell.", + "The text is explicitly aligned to the right of the cell." ], "enum": [ - "BASIC_CHART_TYPE_UNSPECIFIED", - "BAR", - "LINE", - "AREA", - "COLUMN", - "SCATTER", - "COMBO", - "STEPPED_AREA" - ] + "HORIZONTAL_ALIGN_UNSPECIFIED", + "LEFT", + "CENTER", + "RIGHT" + ], + "description": "The horizontal alignment of title in the slicer.\nIf unspecified, defaults to `LEFT`" }, - "interpolateNulls": { + "textFormat": { + "$ref": "TextFormat", + "description": "The text format of title in the slicer." + } + }, + "id": "SlicerSpec" + }, + "CandlestickSeries": { + "type": "object", + "properties": { + "data": { + "description": "The data of the CandlestickSeries.", + "$ref": "ChartData" + } + }, + "id": "CandlestickSeries", + "description": "The series of a CandlestickData." + }, + "HistogramChartSpec": { + "type": "object", + "properties": { + "outlierPercentile": { + "description": "The outlier percentile is used to ensure that outliers do not adversely\naffect the calculation of bucket sizes. For example, setting an outlier\npercentile of 0.05 indicates that the top and bottom 5% of values when\ncalculating buckets. The values are still included in the chart, they will\nbe added to the first or last buckets instead of their own buckets.\nMust be between 0.0 and 0.5.", + "format": "double", + "type": "number" + }, + "showItemDividers": { "type": "boolean", - "description": "If some values in a series are missing, gaps may appear in the chart (e.g,\nsegments of lines in a line chart will be missing). To eliminate these\ngaps set this to true.\nApplies to Line, Area, and Combo charts." + "description": "Whether horizontal divider lines should be displayed between items in each\ncolumn." }, "series": { "type": "array", "items": { - "$ref": "BasicChartSeries" + "$ref": "HistogramSeries" }, - "description": "The data this chart is visualizing." + "description": "The series for a histogram may be either a single series of values to be\nbucketed or multiple series, each of the same length, containing the name\nof the series followed by the values to be bucketed for that series." }, "legendPosition": { + "enum": [ + "HISTOGRAM_CHART_LEGEND_POSITION_UNSPECIFIED", + "BOTTOM_LEGEND", + "LEFT_LEGEND", + "RIGHT_LEGEND", + "TOP_LEGEND", + "NO_LEGEND", + "INSIDE_LEGEND" + ], + "description": "The position of the chart legend.", "type": "string", "enumDescriptions": [ "Default value, do not use.", @@ -2348,3428 +1720,3389 @@ "The legend is rendered on the left of the chart.", "The legend is rendered on the right of the chart.", "The legend is rendered on the top of the chart.", - "No legend is rendered." - ], - "enum": [ - "BASIC_CHART_LEGEND_POSITION_UNSPECIFIED", - "BOTTOM_LEGEND", - "LEFT_LEGEND", - "RIGHT_LEGEND", - "TOP_LEGEND", - "NO_LEGEND" - ], - "description": "The position of the chart legend." + "No legend is rendered.", + "The legend is rendered inside the chart area." + ] + }, + "bucketSize": { + "description": "By default the bucket size (the range of values stacked in a single\ncolumn) is chosen automatically, but it may be overridden here.\nE.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc.\nCannot be negative.\nThis field is optional.", + "format": "double", + "type": "number" + } + }, + "id": "HistogramChartSpec", + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/histogram\"\u003ehistogram chart\u003c/a\u003e.\nA histogram chart groups data items into bins, displaying each bin as a\ncolumn of stacked items. Histograms are used to display the distribution\nof a dataset. Each column of items represents a range into which those\nitems fall. The number of bins can be chosen automatically or specified\nexplicitly." + }, + "UpdateValuesResponse": { + "id": "UpdateValuesResponse", + "description": "The response when updating a range of values in a spreadsheet.", + "type": "object", + "properties": { + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", + "type": "string" + }, + "updatedRange": { + "description": "The range (in A1 notation) that updates were applied to.", + "type": "string" + }, + "updatedCells": { + "description": "The number of cells updated.", + "format": "int32", + "type": "integer" + }, + "updatedData": { + "description": "The values of the cells after updates were applied.\nThis is only included if the request's `includeValuesInResponse` field\nwas `true`.", + "$ref": "ValueRange" + }, + "updatedRows": { + "description": "The number of rows where at least one cell in the row was updated.", + "format": "int32", + "type": "integer" + }, + "updatedColumns": { + "description": "The number of columns where at least one cell in the column was updated.", + "format": "int32", + "type": "integer" + } + } + }, + "PivotGroupSortValueBucket": { + "type": "object", + "properties": { + "buckets": { + "description": "Determines the bucket from which values are chosen to sort.\n\nFor example, in a pivot table with one row group & two column groups,\nthe row group can list up to two values. The first value corresponds\nto a value within the first column group, and the second value\ncorresponds to a value in the second column group. If no values\nare listed, this would indicate that the row should be sorted according\nto the \"Grand Total\" over the column groups. If a single value is listed,\nthis would correspond to using the \"Total\" of that bucket.", + "type": "array", + "items": { + "$ref": "ExtendedValue" + } + }, + "valuesIndex": { + "description": "The offset in the PivotTable.values list which the values in this\ngrouping should be sorted by.", + "format": "int32", + "type": "integer" + } + }, + "id": "PivotGroupSortValueBucket", + "description": "Information about which values in a pivot group should be used for sorting." + }, + "WaterfallChartSeries": { + "description": "A single series of data for a waterfall chart.", + "type": "object", + "properties": { + "subtotalColumnsStyle": { + "$ref": "WaterfallChartColumnStyle", + "description": "Styles for all subtotal columns in this series." + }, + "positiveColumnsStyle": { + "$ref": "WaterfallChartColumnStyle", + "description": "Styles for all columns in this series with positive values." + }, + "hideTrailingSubtotal": { + "description": "True to hide the subtotal column from the end of the series. By default,\na subtotal column will appear at the end of each series. Setting this\nfield to true will hide that subtotal column for this series.", + "type": "boolean" + }, + "data": { + "$ref": "ChartData", + "description": "The data being visualized in this series." }, - "compareMode": { - "enum": [ - "BASIC_CHART_COMPARE_MODE_UNSPECIFIED", - "DATUM", - "CATEGORY" - ], - "description": "The behavior of tooltips and data highlighting when hovering on data and\nchart area.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "Only the focused data element is highlighted and shown in the tooltip.", - "All data elements with the same category (e.g., domain value) are\nhighlighted and shown in the tooltip." - ] + "negativeColumnsStyle": { + "$ref": "WaterfallChartColumnStyle", + "description": "Styles for all columns in this series with negative values." }, - "domains": { + "customSubtotals": { + "description": "Custom subtotal columns appearing in this series. The order in which\nsubtotals are defined is not significant. Only one subtotal may be\ndefined for each data point.", "type": "array", "items": { - "$ref": "BasicChartDomain" - }, - "description": "The domain of data this is charting.\nOnly a single domain is supported." + "$ref": "WaterfallChartCustomSubtotal" + } + } + }, + "id": "WaterfallChartSeries" + }, + "DeleteDeveloperMetadataRequest": { + "description": "A request to delete developer metadata.", + "type": "object", + "properties": { + "dataFilter": { + "$ref": "DataFilter", + "description": "The data filter describing the criteria used to select which developer\nmetadata entry to delete." + } + }, + "id": "DeleteDeveloperMetadataRequest" + }, + "CandlestickData": { + "id": "CandlestickData", + "description": "The Candlestick chart data, each containing the low, open, close, and high\nvalues for a series.", + "type": "object", + "properties": { + "lowSeries": { + "$ref": "CandlestickSeries", + "description": "The range data (vertical axis) for the low/minimum value for each candle.\nThis is the bottom of the candle's center line." }, - "lineSmoothing": { - "description": "Gets whether all lines should be rendered smooth or straight by default.\nApplies to Line charts.", - "type": "boolean" + "closeSeries": { + "$ref": "CandlestickSeries", + "description": "The range data (vertical axis) for the close/final value for each candle.\nThis is the top of the candle body. If greater than the open value the\ncandle will be filled. Otherwise the candle will be hollow." + }, + "openSeries": { + "$ref": "CandlestickSeries", + "description": "The range data (vertical axis) for the open/initial value for each\ncandle. This is the bottom of the candle body. If less than the close\nvalue the candle will be filled. Otherwise the candle will be hollow." + }, + "highSeries": { + "$ref": "CandlestickSeries", + "description": "The range data (vertical axis) for the high/maximum value for each\ncandle. This is the top of the candle's center line." } } }, - "AddDimensionGroupRequest": { - "description": "Creates a group over the specified range.\n\nIf the requested range is a superset of the range of an existing group G,\nthen the depth of G is incremented and this new group G' has the\ndepth of that group. For example, a group [C:D, depth 1] + [B:E] results in\ngroups [B:E, depth 1] and [C:D, depth 2].\nIf the requested range is a subset of the range of an existing group G,\nthen the depth of the new group G' becomes one greater than the depth of G.\nFor example, a group [B:E, depth 1] + [C:D] results in groups [B:E, depth 1]\nand [C:D, depth 2].\nIf the requested range starts before and ends within, or starts within and\nends after, the range of an existing group G, then the range of the existing\ngroup G becomes the union of the ranges, and the new group G' has\ndepth one greater than the depth of G and range as the intersection of the\nranges. For example, a group [B:D, depth 1] + [C:E] results in groups [B:E,\ndepth 1] and [C:D, depth 2].", + "DeleteProtectedRangeRequest": { + "description": "Deletes the protected range with the given ID.", "type": "object", "properties": { - "range": { - "$ref": "DimensionRange", - "description": "The range over which to create a group." + "protectedRangeId": { + "type": "integer", + "description": "The ID of the protected range to delete.", + "format": "int32" } }, - "id": "AddDimensionGroupRequest" + "id": "DeleteProtectedRangeRequest" }, - "CellData": { - "description": "Data about a specific cell.", + "InterpolationPoint": { + "id": "InterpolationPoint", + "description": "A single interpolation point on a gradient conditional format.\nThese pin the gradient color scale according to the color,\ntype and value chosen.", "type": "object", "properties": { - "hyperlink": { + "value": { "type": "string", - "description": "A hyperlink this cell points to, if any.\nThis field is read-only. (To set it, use a `=HYPERLINK` formula\nin the userEnteredValue.formulaValue\nfield.)" + "description": "The value this interpolation point uses. May be a formula.\nUnused if type is MIN or\nMAX." }, - "pivotTable": { - "$ref": "PivotTable", - "description": "A pivot table anchored at this cell. The size of pivot table itself\nis computed dynamically based on its data, grouping, filters, values,\netc. Only the top-left cell of the pivot table contains the pivot table\ndefinition. The other cells will contain the calculated values of the\nresults of the pivot in their effective_value fields." + "color": { + "description": "The color this interpolation point should use.", + "$ref": "Color" }, - "userEnteredFormat": { - "$ref": "CellFormat", - "description": "The format the user entered for the cell.\n\nWhen writing, the new format will be merged with the existing format." + "type": { + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "The interpolation point uses the minimum value in the\ncells over the range of the conditional format.", + "The interpolation point uses the maximum value in the\ncells over the range of the conditional format.", + "The interpolation point uses exactly the value in\nInterpolationPoint.value.", + "The interpolation point is the given percentage over\nall the cells in the range of the conditional format.\nThis is equivalent to NUMBER if the value was:\n`=(MAX(FLATTEN(range)) * (value / 100))\n + (MIN(FLATTEN(range)) * (1 - (value / 100)))`\n(where errors in the range are ignored when flattening).", + "The interpolation point is the given percentile\nover all the cells in the range of the conditional format.\nThis is equivalent to NUMBER if the value was:\n`=PERCENTILE(FLATTEN(range), value / 100)`\n(where errors in the range are ignored when flattening)." + ], + "enum": [ + "INTERPOLATION_POINT_TYPE_UNSPECIFIED", + "MIN", + "MAX", + "NUMBER", + "PERCENT", + "PERCENTILE" + ], + "description": "How the value should be interpreted." + } + } + }, + "FindReplaceResponse": { + "description": "The result of the find/replace.", + "type": "object", + "properties": { + "valuesChanged": { + "description": "The number of non-formula cells changed.", + "format": "int32", + "type": "integer" }, - "note": { - "description": "Any note on the cell.", - "type": "string" + "occurrencesChanged": { + "description": "The number of occurrences (possibly multiple within a cell) changed.\nFor example, if replacing `\"e\"` with `\"o\"` in `\"Google Sheets\"`, this would\nbe `\"3\"` because `\"Google Sheets\"` -\u003e `\"Googlo Shoots\"`.", + "format": "int32", + "type": "integer" }, - "effectiveFormat": { - "description": "The effective format being used by the cell.\nThis includes the results of applying any conditional formatting and,\nif the cell contains a formula, the computed number format.\nIf the effective format is the default format, effective format will\nnot be written.\nThis field is read-only.", - "$ref": "CellFormat" + "rowsChanged": { + "type": "integer", + "description": "The number of rows changed.", + "format": "int32" }, - "userEnteredValue": { - "description": "The value the user entered in the cell. e.g, `1234`, `'Hello'`, or `=NOW()`\nNote: Dates, Times and DateTimes are represented as doubles in\nserial number format.", - "$ref": "ExtendedValue" + "sheetsChanged": { + "description": "The number of sheets changed.", + "format": "int32", + "type": "integer" }, - "dataValidation": { - "$ref": "DataValidationRule", - "description": "A data validation rule on the cell, if any.\n\nWhen writing, the new data validation rule will overwrite any prior rule." + "formulasChanged": { + "description": "The number of formula cells changed.", + "format": "int32", + "type": "integer" + } + }, + "id": "FindReplaceResponse" + }, + "DuplicateFilterViewRequest": { + "description": "Duplicates a particular filter view.", + "type": "object", + "properties": { + "filterId": { + "description": "The ID of the filter being duplicated.", + "format": "int32", + "type": "integer" + } + }, + "id": "DuplicateFilterViewRequest" + }, + "UpdateConditionalFormatRuleResponse": { + "type": "object", + "properties": { + "oldRule": { + "$ref": "ConditionalFormatRule", + "description": "The old (deleted) rule. Not set if a rule was moved\n(because it is the same as new_rule)." }, - "effectiveValue": { - "description": "The effective value of the cell. For cells with formulas, this is\nthe calculated value. For cells with literals, this is\nthe same as the user_entered_value.\nThis field is read-only.", - "$ref": "ExtendedValue" + "newIndex": { + "type": "integer", + "description": "The index of the new rule.", + "format": "int32" }, - "formattedValue": { - "description": "The formatted value of the cell.\nThis is the value as it's shown to the user.\nThis field is read-only.", - "type": "string" + "oldIndex": { + "description": "The old index of the rule. Not set if a rule was replaced\n(because it is the same as new_index).", + "format": "int32", + "type": "integer" }, - "textFormatRuns": { - "description": "Runs of rich text applied to subsections of the cell. Runs are only valid\non user entered strings, not formulas, bools, or numbers.\nRuns start at specific indexes in the text and continue until the next\nrun. Properties of a run will continue unless explicitly changed\nin a subsequent run (and properties of the first run will continue\nthe properties of the cell unless explicitly changed).\n\nWhen writing, the new runs will overwrite any prior runs. When writing a\nnew user_entered_value, previous runs are erased.", - "type": "array", - "items": { - "$ref": "TextFormatRun" - } + "newRule": { + "description": "The new rule that replaced the old rule (if replacing),\nor the rule that was moved (if moved)", + "$ref": "ConditionalFormatRule" } }, - "id": "CellData" + "id": "UpdateConditionalFormatRuleResponse", + "description": "The result of updating a conditional format rule." }, - "BatchUpdateValuesByDataFilterRequest": { - "description": "The request for updating more than one range of values in a spreadsheet.", + "ConditionValue": { "type": "object", "properties": { - "includeValuesInResponse": { - "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values. The `updatedData` field within\neach of the BatchUpdateValuesResponse.responses will contain\nthe updated values. If the range to write was larger than than the range\nactually written, the response will include all values in the requested\nrange (excluding trailing empty rows and columns).", - "type": "boolean" - }, - "valueInputOption": { - "description": "How the input data should be interpreted.", + "relativeDate": { + "description": "A relative date (based on the current date).\nValid only if the type is\nDATE_BEFORE,\nDATE_AFTER,\nDATE_ON_OR_BEFORE or\nDATE_ON_OR_AFTER.\n\nRelative dates are not supported in data validation.\nThey are supported only in conditional formatting and\nconditional filters.", "type": "string", "enumDescriptions": [ - "Default input value. This value must not be used.", - "The values the user has entered will not be parsed and will be stored\nas-is.", - "The values will be parsed as if the user typed them into the UI.\nNumbers will stay as numbers, but strings may be converted to numbers,\ndates, etc. following the same rules that are applied when entering\ntext into a cell via the Google Sheets UI." + "Default value, do not use.", + "The value is one year before today.", + "The value is one month before today.", + "The value is one week before today.", + "The value is yesterday.", + "The value is today.", + "The value is tomorrow." ], "enum": [ - "INPUT_VALUE_OPTION_UNSPECIFIED", - "RAW", - "USER_ENTERED" + "RELATIVE_DATE_UNSPECIFIED", + "PAST_YEAR", + "PAST_MONTH", + "PAST_WEEK", + "YESTERDAY", + "TODAY", + "TOMORROW" ] }, - "data": { - "description": "The new values to apply to the spreadsheet. If more than one range is\nmatched by the specified DataFilter the specified values will be\napplied to all of those ranges.", - "type": "array", - "items": { - "$ref": "DataFilterValueRange" - } - }, - "responseDateTimeRenderOption": { - "type": "string", - "enumDescriptions": [ - "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", - "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." - ], - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER." - }, - "responseValueRenderOption": { + "userEnteredValue": { + "description": "A value the condition is based on.\nThe value is parsed as if the user typed into a cell.\nFormulas are supported (and must begin with an `=` or a '+').", + "type": "string" + } + }, + "id": "ConditionValue", + "description": "The value of the condition." + }, + "DateTimeRule": { + "id": "DateTimeRule", + "description": "Allows you to organize the date-time values in a source data column into\nbuckets based on selected parts of their date or time values. For example,\nconsider a pivot table showing sales transactions by date:\n\n +----------+--------------+\n | Date | SUM of Sales |\n +----------+--------------+\n | 1/1/2017 | $621.14 |\n | 2/3/2017 | $708.84 |\n | 5/8/2017 | $326.84 |\n ...\n +----------+--------------+\nApplying a date-time group rule with a DateTimeRuleType of YEAR_MONTH\nresults in the following pivot table.\n\n +--------------+--------------+\n | Grouped Date | SUM of Sales |\n +--------------+--------------+\n | 2017-Jan | $53,731.78 |\n | 2017-Feb | $83,475.32 |\n | 2017-Mar | $94,385.05 |\n ...\n +--------------+--------------+", + "type": "object", + "properties": { + "type": { + "description": "The type of date-time grouping to apply.", "type": "string", "enumDescriptions": [ - "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", - "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", - "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." - ], - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" + "The default type, do not use.", + "Group dates by second, from 0 to 59.", + "Group dates by minute, from 0 to 59.", + "Group dates by hour using a 24-hour system, from 0 to 23.", + "Group dates by hour and minute using a 24-hour system, for example 19:45.", + "Group dates by hour and minute using a 12-hour system, for example 7:45\nPM. The AM/PM designation is translated based on the spreadsheet\nlocale.", + "Group dates by day of week, for example Sunday. The days of the week will\nbe translated based on the spreadsheet locale.", + "Group dates by day of year, from 1 to 366. Note that dates after Feb. 29\nfall in different buckets in leap years than in non-leap years.", + "Group dates by day of month, from 1 to 31.", + "Group dates by day and month, for example 22-Nov. The month is\ntranslated based on the spreadsheet locale.", + "Group dates by month, for example Nov. The month is translated based\non the spreadsheet locale.", + "Group dates by quarter, for example Q1 (which represents Jan-Mar).", + "Group dates by year, for example 2008.", + "Group dates by year and month, for example 2008-Nov. The month is\ntranslated based on the spreadsheet locale.", + "Group dates by year and quarter, for example 2008 Q4.", + "Group dates by year, month, and day, for example 2008-11-22." ], - "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE." + "enum": [ + "DATE_TIME_RULE_TYPE_UNSPECIFIED", + "SECOND", + "MINUTE", + "HOUR", + "HOUR_MINUTE", + "HOUR_MINUTE_AMPM", + "DAY_OF_WEEK", + "DAY_OF_YEAR", + "DAY_OF_MONTH", + "DAY_MONTH", + "MONTH", + "QUARTER", + "YEAR", + "YEAR_MONTH", + "YEAR_QUARTER", + "YEAR_MONTH_DAY" + ] } - }, - "id": "BatchUpdateValuesByDataFilterRequest" + } }, - "UpdateDimensionGroupRequest": { + "HistogramSeries": { "type": "object", "properties": { - "dimensionGroup": { - "$ref": "DimensionGroup", - "description": "The group whose state should be updated. The range and depth of the group\nshould specify a valid group on the sheet, and all other fields updated." + "barColor": { + "$ref": "Color", + "description": "The color of the column representing this series in each bucket.\nThis field is optional." }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `dimensionGroup` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" + "data": { + "$ref": "ChartData", + "description": "The data for this histogram series." } }, - "id": "UpdateDimensionGroupRequest", - "description": "Updates the state of the specified group." + "id": "HistogramSeries", + "description": "A histogram series containing the series color and data." }, - "DeleteDeveloperMetadataResponse": { - "id": "DeleteDeveloperMetadataResponse", - "description": "The response from deleting developer metadata.", + "Spreadsheet": { "type": "object", "properties": { - "deletedDeveloperMetadata": { - "description": "The metadata that was deleted.", + "spreadsheetId": { + "type": "string", + "description": "The ID of the spreadsheet.\nThis field is read-only." + }, + "namedRanges": { "type": "array", "items": { - "$ref": "DeveloperMetadata" - } - } - } - }, - "SortRangeRequest": { - "type": "object", - "properties": { - "range": { - "$ref": "GridRange", - "description": "The range to sort." + "$ref": "NamedRange" + }, + "description": "The named ranges defined in a spreadsheet." }, - "sortSpecs": { - "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications.", + "developerMetadata": { + "description": "The developer metadata associated with a spreadsheet.", "type": "array", "items": { - "$ref": "SortSpec" + "$ref": "DeveloperMetadata" } - } - }, - "id": "SortRangeRequest", - "description": "Sorts data in rows based on a sort order per column." - }, - "MatchedDeveloperMetadata": { - "type": "object", - "properties": { - "dataFilters": { - "description": "All filters matching the returned developer metadata.", + }, + "sheets": { + "description": "The sheets that are part of a spreadsheet.", "type": "array", "items": { - "$ref": "DataFilter" + "$ref": "Sheet" } }, - "developerMetadata": { - "$ref": "DeveloperMetadata", - "description": "The developer metadata matching the specified filters." + "spreadsheetUrl": { + "description": "The url of the spreadsheet.\nThis field is read-only.", + "type": "string" + }, + "properties": { + "$ref": "SpreadsheetProperties", + "description": "Overall properties of a spreadsheet." } }, - "id": "MatchedDeveloperMetadata", - "description": "A developer metadata entry and the data filters specified in the original\nrequest that matched it." + "id": "Spreadsheet", + "description": "Resource that represents a spreadsheet." }, - "MergeCellsRequest": { - "description": "Merges all cells in the range.", + "BandedRange": { "type": "object", "properties": { + "rowProperties": { + "$ref": "BandingProperties", + "description": "Properties for row bands. These properties are applied on a row-by-row\nbasis throughout all the rows in the range. At least one of\nrow_properties or column_properties must be specified." + }, + "columnProperties": { + "$ref": "BandingProperties", + "description": "Properties for column bands. These properties are applied on a column-\nby-column basis throughout all the columns in the range. At least one of\nrow_properties or column_properties must be specified." + }, "range": { - "description": "The range of cells to merge.", + "description": "The range over which these properties are applied.", "$ref": "GridRange" }, - "mergeType": { - "description": "How the cells should be merged.", - "type": "string", - "enumDescriptions": [ - "Create a single merge from the range", - "Create a merge for each column in the range", - "Create a merge for each row in the range" - ], - "enum": [ - "MERGE_ALL", - "MERGE_COLUMNS", - "MERGE_ROWS" - ] + "bandedRangeId": { + "description": "The id of the banded range.", + "format": "int32", + "type": "integer" } }, - "id": "MergeCellsRequest" + "id": "BandedRange", + "description": "A banded (alternating colors) range in a sheet." }, - "AddProtectedRangeRequest": { - "id": "AddProtectedRangeRequest", - "description": "Adds a new protected range.", + "AddChartRequest": { "type": "object", "properties": { - "protectedRange": { - "description": "The protected range to be added. The\nprotectedRangeId field is optional; if\none is not set, an id will be randomly generated. (It is an error to\nspecify the ID of a range that already exists.)", - "$ref": "ProtectedRange" + "chart": { + "$ref": "EmbeddedChart", + "description": "The chart that should be added to the spreadsheet, including the position\nwhere it should be placed. The chartId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of an embedded object that already exists.)" } - } + }, + "id": "AddChartRequest", + "description": "Adds a chart to a sheet in the spreadsheet." }, - "DuplicateFilterViewResponse": { - "description": "The result of a filter view being duplicated.", + "HistogramRule": { + "description": "Allows you to organize the numeric values in a source data column into\nbuckets of a constant size. All values from HistogramRule.start to\nHistogramRule.end are placed into groups of size\nHistogramRule.interval. In addition, all values below\nHistogramRule.start are placed in one group, and all values above\nHistogramRule.end are placed in another. Only\nHistogramRule.interval is required, though if HistogramRule.start\nand HistogramRule.end are both provided, HistogramRule.start must\nbe less than HistogramRule.end. For example, a pivot table showing\naverage purchase amount by age that has 50+ rows:\n\n +-----+-------------------+\n | Age | AVERAGE of Amount |\n +-----+-------------------+\n | 16 | $27.13 |\n | 17 | $5.24 |\n | 18 | $20.15 |\n ...\n +-----+-------------------+\ncould be turned into a pivot table that looks like the one below by\napplying a histogram group rule with a HistogramRule.start of 25,\nan HistogramRule.interval of 20, and an HistogramRule.end\nof 65.\n\n +-------------+-------------------+\n | Grouped Age | AVERAGE of Amount |\n +-------------+-------------------+\n | \u003c 25 | $19.34 |\n | 25-45 | $31.43 |\n | 45-65 | $35.87 |\n | \u003e 65 | $27.55 |\n +-------------+-------------------+\n | Grand Total | $29.12 |\n +-------------+-------------------+", "type": "object", "properties": { - "filter": { - "$ref": "FilterView", - "description": "The newly created filter." + "start": { + "description": "The minimum value at which items are placed into buckets\nof constant size. Values below start are lumped into a single bucket.\nThis field is optional.", + "format": "double", + "type": "number" + }, + "end": { + "description": "The maximum value at which items are placed into buckets\nof constant size. Values above end are lumped into a single bucket.\nThis field is optional.", + "format": "double", + "type": "number" + }, + "interval": { + "description": "The size of the buckets that are created. Must be positive.", + "format": "double", + "type": "number" } }, - "id": "DuplicateFilterViewResponse" + "id": "HistogramRule" }, - "DuplicateSheetResponse": { + "UpdateProtectedRangeRequest": { + "id": "UpdateProtectedRangeRequest", + "description": "Updates an existing protected range with the specified\nprotectedRangeId.", + "type": "object", + "properties": { + "protectedRange": { + "$ref": "ProtectedRange", + "description": "The protected range to update with the new properties." + }, + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `protectedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" + } + } + }, + "AddSheetResponse": { "type": "object", "properties": { "properties": { "$ref": "SheetProperties", - "description": "The properties of the duplicate sheet." + "description": "The properties of the newly added sheet." } }, - "id": "DuplicateSheetResponse", - "description": "The result of duplicating a sheet." + "id": "AddSheetResponse", + "description": "The result of adding a sheet." }, - "BatchUpdateSpreadsheetResponse": { + "PivotGroupRule": { + "description": "An optional setting on a PivotGroup that defines buckets for the values\nin the source data column rather than breaking out each individual value.\nOnly one PivotGroup with a group rule may be added for each column in\nthe source data, though on any given column you may add both a\nPivotGroup that has a rule and a PivotGroup that does not.", "type": "object", "properties": { - "replies": { - "description": "The reply of the updates. This maps 1:1 with the updates, although\nreplies to some requests may be empty.", - "type": "array", - "items": { - "$ref": "Response" - } + "histogramRule": { + "description": "A HistogramRule.", + "$ref": "HistogramRule" }, - "updatedSpreadsheet": { - "description": "The spreadsheet after updates were applied. This is only set if\n[BatchUpdateSpreadsheetRequest.include_spreadsheet_in_response] is `true`.", - "$ref": "Spreadsheet" + "dateTimeRule": { + "description": "A DateTimeRule.", + "$ref": "DateTimeRule" }, - "spreadsheetId": { - "type": "string", - "description": "The spreadsheet the updates were applied to." + "manualRule": { + "description": "A ManualRule.", + "$ref": "ManualRule" } }, - "id": "BatchUpdateSpreadsheetResponse", - "description": "The reply for batch updating a spreadsheet." + "id": "PivotGroupRule" }, - "AddFilterViewRequest": { - "id": "AddFilterViewRequest", - "description": "Adds a filter view.", + "AddFilterViewResponse": { "type": "object", "properties": { "filter": { "$ref": "FilterView", - "description": "The filter to add. The filterViewId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a filter that already exists.)" - } - } - }, - "DataFilterValueRange": { - "type": "object", - "properties": { - "majorDimension": { - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ], - "description": "The major dimension of the values." - }, - "values": { - "description": "The data to be written. If the provided values exceed any of the ranges\nmatched by the data filter then the request will fail. If the provided\nvalues are less than the matched ranges only the specified values will be\nwritten, existing values in the matched ranges will remain unaffected.", - "type": "array", - "items": { - "type": "array", - "items": { - "type": "any" - } - } - }, - "dataFilter": { - "$ref": "DataFilter", - "description": "The data filter describing the location of the values in the spreadsheet." + "description": "The newly added filter view." } }, - "id": "DataFilterValueRange", - "description": "A range of values whose location is specified by a DataFilter." + "id": "AddFilterViewResponse", + "description": "The result of adding a filter view." }, - "NumberFormat": { - "id": "NumberFormat", - "description": "The number format of a cell.", + "IterativeCalculationSettings": { + "description": "Settings to control how circular dependencies are resolved with iterative\ncalculation.", "type": "object", "properties": { - "pattern": { - "description": "Pattern string used for formatting. If not set, a default pattern based on\nthe user's locale will be used if necessary for the given type.\nSee the [Date and Number Formats guide](/sheets/api/guides/formats) for\nmore information about the supported patterns.", - "type": "string" - }, - "type": { - "description": "The type of the number format.\nWhen writing, this field must be set.", - "type": "string", - "enumDescriptions": [ - "The number format is not specified\nand is based on the contents of the cell.\nDo not explicitly use this.", - "Text formatting, e.g `1000.12`", - "Number formatting, e.g, `1,000.12`", - "Percent formatting, e.g `10.12%`", - "Currency formatting, e.g `$1,000.12`", - "Date formatting, e.g `9/26/2008`", - "Time formatting, e.g `3:59:00 PM`", - "Date+Time formatting, e.g `9/26/08 15:59:00`", - "Scientific number formatting, e.g `1.01E+03`" - ], - "enum": [ - "NUMBER_FORMAT_TYPE_UNSPECIFIED", - "TEXT", - "NUMBER", - "PERCENT", - "CURRENCY", - "DATE", - "TIME", - "DATE_TIME", - "SCIENTIFIC" - ] + "convergenceThreshold": { + "type": "number", + "description": "When iterative calculation is enabled and successive results differ by\nless than this threshold value, the calculation rounds stop.", + "format": "double" + }, + "maxIterations": { + "type": "integer", + "description": "When iterative calculation is enabled, the maximum number of calculation\nrounds to perform.", + "format": "int32" } - } + }, + "id": "IterativeCalculationSettings" }, - "OrgChartSpec": { + "ScorecardChartSpec": { + "description": "A scorecard chart. Scorecard charts are used to highlight key performance\nindicators, known as KPIs, on the spreadsheet. A scorecard chart can\nrepresent things like total sales, average cost, or a top selling item. You\ncan specify a single data value, or aggregate over a range of data.\nPercentage or absolute difference from a baseline value can be highlighted,\nlike changes over time.", "type": "object", "properties": { - "parentLabels": { - "$ref": "ChartData", - "description": "The data containing the label of the parent for the corresponding node.\nA blank value indicates that the node has no parent and is a top-level\nnode.\nThis field is optional." - }, - "labels": { - "$ref": "ChartData", - "description": "The data containing the labels for all the nodes in the chart. Labels\nmust be unique." + "keyValueFormat": { + "$ref": "KeyValueFormat", + "description": "Formatting options for key value." }, - "nodeSize": { + "numberFormatSource": { "type": "string", "enumDescriptions": [ "Default value, do not use.", - "The small org chart node size.", - "The medium org chart node size.", - "The large org chart node size." + "Inherit number formatting from data.", + "Apply custom formatting as specified by ChartCustomNumberFormatOptions." ], "enum": [ - "ORG_CHART_LABEL_SIZE_UNSPECIFIED", - "SMALL", - "MEDIUM", - "LARGE" + "CHART_NUMBER_FORMAT_SOURCE_UNDEFINED", + "FROM_DATA", + "CUSTOM" ], - "description": "The size of the org chart nodes." + "description": "The number format source used in the scorecard chart.\nThis field is optional." }, - "nodeColor": { - "description": "The color of the org chart nodes.", - "$ref": "Color" + "customFormatOptions": { + "$ref": "ChartCustomNumberFormatOptions", + "description": "Custom formatting options for numeric key/baseline values in scorecard\nchart. This field is used only when number_format_source is set to\nCUSTOM. This field is optional." }, - "tooltips": { + "scaleFactor": { + "description": "Value to scale scorecard key and baseline value. For example, a factor of\n10 can be used to divide all values in the chart by 10.\nThis field is optional.", + "format": "double", + "type": "number" + }, + "baselineValueFormat": { + "$ref": "BaselineValueFormat", + "description": "Formatting options for baseline value.\nThis field is needed only if baseline_value_data is specified." + }, + "baselineValueData": { "$ref": "ChartData", - "description": "The data containing the tooltip for the corresponding node. A blank value\nresults in no tooltip being displayed for the node.\nThis field is optional." + "description": "The data for scorecard baseline value.\nThis field is optional." }, - "selectedNodeColor": { - "$ref": "Color", - "description": "The color of the selected org chart nodes." + "keyValueData": { + "$ref": "ChartData", + "description": "The data for scorecard key value." + }, + "aggregateType": { + "enumDescriptions": [ + "Default value, do not use.", + "Average aggregate function.", + "Count aggregate function.", + "Maximum aggregate function.", + "Median aggregate function.", + "Minimum aggregate function.", + "Sum aggregate function." + ], + "enum": [ + "CHART_AGGREGATE_TYPE_UNSPECIFIED", + "AVERAGE", + "COUNT", + "MAX", + "MEDIAN", + "MIN", + "SUM" + ], + "description": "The aggregation type for key and baseline chart data in scorecard chart.\nThis field is optional.", + "type": "string" } }, - "id": "OrgChartSpec", - "description": "An \u003ca href=\"/chart/interactive/docs/gallery/orgchart\"\u003eorg chart\u003c/a\u003e.\nOrg charts require a unique set of labels in labels and may\noptionally include parent_labels and tooltips.\nparent_labels contain, for each node, the label identifying the parent\nnode. tooltips contain, for each node, an optional tooltip.\n\nFor example, to describe an OrgChart with Alice as the CEO, Bob as the\nPresident (reporting to Alice) and Cathy as VP of Sales (also reporting to\nAlice), have labels contain \"Alice\", \"Bob\", \"Cathy\",\nparent_labels contain \"\", \"Alice\", \"Alice\" and tooltips contain\n\"CEO\", \"President\", \"VP Sales\"." + "id": "ScorecardChartSpec" }, - "FilterView": { - "description": "A filter view.", + "OverlayPosition": { + "description": "The location an object is overlaid on top of a grid.", "type": "object", "properties": { - "namedRangeId": { - "type": "string", - "description": "The named range this filter view is backed by, if any.\n\nWhen writing, only one of range or named_range_id\nmay be set." + "widthPixels": { + "type": "integer", + "description": "The width of the object, in pixels. Defaults to 600.", + "format": "int32" }, - "filterViewId": { - "description": "The ID of the filter view.", + "offsetXPixels": { + "description": "The horizontal offset, in pixels, that the object is offset\nfrom the anchor cell.", "format": "int32", "type": "integer" }, - "criteria": { - "additionalProperties": { - "$ref": "FilterCriteria" - }, - "description": "The criteria for showing/hiding values per column.\nThe map's key is the column index, and the value is the criteria for\nthat column.", - "type": "object" - }, - "title": { - "description": "The name of the filter view.", - "type": "string" - }, - "range": { - "$ref": "GridRange", - "description": "The range this filter view covers.\n\nWhen writing, only one of range or named_range_id\nmay be set." - }, - "sortSpecs": { - "type": "array", - "items": { - "$ref": "SortSpec" - }, - "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications." - } - }, - "id": "FilterView" - }, - "Slicer": { - "description": "A slicer in a sheet.", - "type": "object", - "properties": { - "position": { - "description": "The position of the slicer. Note that slicer can be positioned only on\nexisting sheet. Also, width and height of slicer can be automatically\nadjusted to keep it within permitted limits.", - "$ref": "EmbeddedObjectPosition" + "anchorCell": { + "$ref": "GridCoordinate", + "description": "The cell the object is anchored to." }, - "spec": { - "description": "The specification of the slicer.", - "$ref": "SlicerSpec" + "offsetYPixels": { + "description": "The vertical offset, in pixels, that the object is offset\nfrom the anchor cell.", + "format": "int32", + "type": "integer" }, - "slicerId": { - "description": "The ID of the slicer.", + "heightPixels": { + "description": "The height of the object, in pixels. Defaults to 371.", "format": "int32", "type": "integer" } }, - "id": "Slicer" - }, - "SearchDeveloperMetadataRequest": { - "description": "A request to retrieve all developer metadata matching the set of specified\ncriteria.", - "type": "object", - "properties": { - "dataFilters": { - "type": "array", - "items": { - "$ref": "DataFilter" - }, - "description": "The data filters describing the criteria used to determine which\nDeveloperMetadata entries to return. DeveloperMetadata matching any of the\nspecified filters will be included in the response." - } - }, - "id": "SearchDeveloperMetadataRequest" + "id": "OverlayPosition" }, - "BandingProperties": { - "description": "Properties referring a single dimension (either row or column). If both\nBandedRange.row_properties and BandedRange.column_properties are\nset, the fill colors are applied to cells according to the following rules:\n\n* header_color and footer_color take priority over band colors.\n* first_band_color takes priority over second_band_color.\n* row_properties takes priority over column_properties.\n\nFor example, the first row color takes priority over the first column\ncolor, but the first column color takes priority over the second row color.\nSimilarly, the row header takes priority over the column header in the\ntop left cell, but the column header takes priority over the first row\ncolor if the row header is not set.", + "SpreadsheetProperties": { "type": "object", "properties": { - "headerColor": { - "$ref": "Color", - "description": "The color of the first row or column. If this field is set, the first\nrow or column will be filled with this color and the colors will\nalternate between first_band_color and second_band_color starting\nfrom the second row or column. Otherwise, the first row or column will be\nfilled with first_band_color and the colors will proceed to alternate\nas they normally would." + "locale": { + "type": "string", + "description": "The locale of the spreadsheet in one of the following formats:\n\n* an ISO 639-1 language code such as `en`\n\n* an ISO 639-2 language code such as `fil`, if no 639-1 code exists\n\n* a combination of the ISO language code and country code, such as `en_US`\n\nNote: when updating this field, not all locales/languages are supported." }, - "firstBandColor": { - "description": "The first color that is alternating. (Required)", - "$ref": "Color" + "iterativeCalculationSettings": { + "$ref": "IterativeCalculationSettings", + "description": "Determines whether and how circular references are resolved with iterative\ncalculation. Absence of this field means that circular references will\nresult in calculation errors." }, - "secondBandColor": { - "$ref": "Color", - "description": "The second color that is alternating. (Required)" + "autoRecalc": { + "type": "string", + "enumDescriptions": [ + "Default value. This value must not be used.", + "Volatile functions are updated on every change.", + "Volatile functions are updated on every change and every minute.", + "Volatile functions are updated on every change and hourly." + ], + "enum": [ + "RECALCULATION_INTERVAL_UNSPECIFIED", + "ON_CHANGE", + "MINUTE", + "HOUR" + ], + "description": "The amount of time to wait before volatile functions are recalculated." }, - "footerColor": { - "$ref": "Color", - "description": "The color of the last row or column. If this field is not set, the last\nrow or column will be filled with either first_band_color or\nsecond_band_color, depending on the color of the previous row or\ncolumn." - } - }, - "id": "BandingProperties" - }, - "BasicFilter": { - "id": "BasicFilter", - "description": "The default filter associated with a sheet.", - "type": "object", - "properties": { - "range": { - "$ref": "GridRange", - "description": "The range the filter covers." + "defaultFormat": { + "description": "The default format of all cells in the spreadsheet.\nCellData.effectiveFormat will not be set if\nthe cell's format is equal to this default format. This field is read-only.", + "$ref": "CellFormat" }, - "criteria": { - "additionalProperties": { - "$ref": "FilterCriteria" - }, - "description": "The criteria for showing/hiding values per column.\nThe map's key is the column index, and the value is the criteria for\nthat column.", - "type": "object" + "timeZone": { + "description": "The time zone of the spreadsheet, in CLDR format such as\n`America/New_York`. If the time zone isn't recognized, this may\nbe a custom time zone such as `GMT-07:00`.", + "type": "string" }, - "sortSpecs": { - "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications.", - "type": "array", - "items": { - "$ref": "SortSpec" - } + "title": { + "type": "string", + "description": "The title of the spreadsheet." } - } + }, + "id": "SpreadsheetProperties", + "description": "Properties of a spreadsheet." }, - "AddProtectedRangeResponse": { - "description": "The result of adding a new protected range.", + "AddChartResponse": { + "description": "The result of adding a chart to a spreadsheet.", "type": "object", "properties": { - "protectedRange": { - "$ref": "ProtectedRange", - "description": "The newly added protected range." + "chart": { + "$ref": "EmbeddedChart", + "description": "The newly added chart." } }, - "id": "AddProtectedRangeResponse" + "id": "AddChartResponse" }, - "PivotValue": { - "description": "The definition of how a value in a pivot table should be calculated.", + "InsertDimensionRequest": { + "id": "InsertDimensionRequest", + "description": "Inserts rows or columns in a sheet at a particular index.", "type": "object", "properties": { - "sourceColumnOffset": { - "description": "The column offset of the source range that this value reads from.\n\nFor example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`\nmeans this value refers to column `C`, whereas the offset `1` would\nrefer to column `D`.", - "format": "int32", - "type": "integer" - }, - "name": { - "description": "A name to use for the value.", - "type": "string" - }, - "formula": { - "description": "A custom formula to calculate the value. The formula must start\nwith an `=` character.", - "type": "string" + "range": { + "$ref": "DimensionRange", + "description": "The dimensions to insert. Both the start and end indexes must be bounded." }, - "calculatedDisplayType": { - "enum": [ - "PIVOT_VALUE_CALCULATED_DISPLAY_TYPE_UNSPECIFIED", - "PERCENT_OF_ROW_TOTAL", - "PERCENT_OF_COLUMN_TOTAL", - "PERCENT_OF_GRAND_TOTAL" - ], - "description": "If specified, indicates that pivot values should be displayed as\nthe result of a calculation with another pivot value. For example, if\ncalculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the\npivot values are displayed as the percentage of the grand total. In\nthe Sheets UI, this is referred to as \"Show As\" in the value section of a\npivot table.", + "inheritFromBefore": { + "type": "boolean", + "description": "Whether dimension properties should be extended from the dimensions\nbefore or after the newly inserted dimensions.\nTrue to inherit from the dimensions before (in which case the start\nindex must be greater than 0), and false to inherit from the dimensions\nafter.\n\nFor example, if row index 0 has red background and row index 1\nhas a green background, then inserting 2 rows at index 1 can inherit\neither the green or red background. If `inheritFromBefore` is true,\nthe two new rows will be red (because the row before the insertion point\nwas red), whereas if `inheritFromBefore` is false, the two new rows will\nbe green (because the row after the insertion point was green)." + } + } + }, + "BatchUpdateValuesRequest": { + "description": "The request for updating more than one range of values in a spreadsheet.", + "type": "object", + "properties": { + "responseValueRenderOption": { + "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", "type": "string", "enumDescriptions": [ - "Default value, do not use.", - "Shows the pivot values as percentage of the row total values.", - "Shows the pivot values as percentage of the column total values.", - "Shows the pivot values as percentage of the grand total values." + "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", + "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", + "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." + ], + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" ] }, - "summarizeFunction": { + "includeValuesInResponse": { + "type": "boolean", + "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values. The `updatedData` field within\neach of the BatchUpdateValuesResponse.responses will contain\nthe updated values. If the range to write was larger than than the range\nactually written, the response will include all values in the requested\nrange (excluding trailing empty rows and columns)." + }, + "valueInputOption": { + "type": "string", + "enumDescriptions": [ + "Default input value. This value must not be used.", + "The values the user has entered will not be parsed and will be stored\nas-is.", + "The values will be parsed as if the user typed them into the UI.\nNumbers will stay as numbers, but strings may be converted to numbers,\ndates, etc. following the same rules that are applied when entering\ntext into a cell via the Google Sheets UI." + ], "enum": [ - "PIVOT_STANDARD_VALUE_FUNCTION_UNSPECIFIED", - "SUM", - "COUNTA", - "COUNT", - "COUNTUNIQUE", - "AVERAGE", - "MAX", - "MIN", - "MEDIAN", - "PRODUCT", - "STDEV", - "STDEVP", - "VAR", - "VARP", - "CUSTOM" + "INPUT_VALUE_OPTION_UNSPECIFIED", + "RAW", + "USER_ENTERED" ], - "description": "A function to summarize the value.\nIf formula is set, the only supported values are\nSUM and\nCUSTOM.\nIf sourceColumnOffset is set, then `CUSTOM`\nis not supported.", + "description": "How the input data should be interpreted." + }, + "data": { + "description": "The new values to apply to the spreadsheet.", + "type": "array", + "items": { + "$ref": "ValueRange" + } + }, + "responseDateTimeRenderOption": { + "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER.", "type": "string", "enumDescriptions": [ - "The default, do not use.", - "Corresponds to the `SUM` function.", - "Corresponds to the `COUNTA` function.", - "Corresponds to the `COUNT` function.", - "Corresponds to the `COUNTUNIQUE` function.", - "Corresponds to the `AVERAGE` function.", - "Corresponds to the `MAX` function.", - "Corresponds to the `MIN` function.", - "Corresponds to the `MEDIAN` function.", - "Corresponds to the `PRODUCT` function.", - "Corresponds to the `STDEV` function.", - "Corresponds to the `STDEVP` function.", - "Corresponds to the `VAR` function.", - "Corresponds to the `VARP` function.", - "Indicates the formula should be used as-is.\nOnly valid if PivotValue.formula was set." + "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", + "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." + ], + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" ] } }, - "id": "PivotValue" + "id": "BatchUpdateValuesRequest" }, - "ErrorValue": { + "CutPasteRequest": { + "id": "CutPasteRequest", + "description": "Moves data from the source to the destination.", "type": "object", "properties": { - "type": { + "source": { + "$ref": "GridRange", + "description": "The source data to cut." + }, + "pasteType": { + "type": "string", "enumDescriptions": [ - "The default error type, do not use this.", - "Corresponds to the `#ERROR!` error.", - "Corresponds to the `#NULL!` error.", - "Corresponds to the `#DIV/0` error.", - "Corresponds to the `#VALUE!` error.", - "Corresponds to the `#REF!` error.", - "Corresponds to the `#NAME?` error.", - "Corresponds to the `#NUM`! error.", - "Corresponds to the `#N/A` error.", - "Corresponds to the `Loading...` state." + "Paste values, formulas, formats, and merges.", + "Paste the values ONLY without formats, formulas, or merges.", + "Paste the format and data validation only.", + "Like PASTE_NORMAL but without borders.", + "Paste the formulas only.", + "Paste the data validation only.", + "Paste the conditional formatting rules only." ], "enum": [ - "ERROR_TYPE_UNSPECIFIED", - "ERROR", - "NULL_VALUE", - "DIVIDE_BY_ZERO", - "VALUE", - "REF", - "NAME", - "NUM", - "N_A", - "LOADING" + "PASTE_NORMAL", + "PASTE_VALUES", + "PASTE_FORMAT", + "PASTE_NO_BORDERS", + "PASTE_FORMULA", + "PASTE_DATA_VALIDATION", + "PASTE_CONDITIONAL_FORMATTING" ], - "description": "The type of error.", - "type": "string" + "description": "What kind of data to paste. All the source data will be cut, regardless\nof what is pasted." }, - "message": { - "description": "A message with more information about the error\n(in the spreadsheet's locale).", - "type": "string" - } - }, - "id": "ErrorValue", - "description": "An error in a cell." - }, - "CopySheetToAnotherSpreadsheetRequest": { - "id": "CopySheetToAnotherSpreadsheetRequest", - "description": "The request to copy a sheet across spreadsheets.", - "type": "object", - "properties": { - "destinationSpreadsheetId": { - "description": "The ID of the spreadsheet to copy the sheet to.", - "type": "string" + "destination": { + "$ref": "GridCoordinate", + "description": "The top-left coordinate where the data should be pasted." } } }, - "CandlestickChartSpec": { - "id": "CandlestickChartSpec", - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/candlestickchart\"\u003ecandlestick\nchart\u003c/a\u003e.", + "ChartAxisViewWindowOptions": { + "id": "ChartAxisViewWindowOptions", + "description": "The options that define a \"view window\" for a chart (such as the visible\nvalues in an axis).", "type": "object", "properties": { - "domain": { - "$ref": "CandlestickDomain", - "description": "The domain data (horizontal axis) for the candlestick chart. String data\nwill be treated as discrete labels, other data will be treated as\ncontinuous values." + "viewWindowMin": { + "description": "The minimum numeric value to be shown in this view window. If unset, will\nautomatically determine a minimum value that looks good for the data.", + "format": "double", + "type": "number" }, - "data": { - "description": "The Candlestick chart data.\nOnly one CandlestickData is supported.", - "type": "array", - "items": { - "$ref": "CandlestickData" - } + "viewWindowMax": { + "description": "The maximum numeric value to be shown in this view window. If unset, will\nautomatically determine a maximum value that looks good for the data.", + "format": "double", + "type": "number" + }, + "viewWindowMode": { + "description": "The view window's mode.", + "type": "string", + "enumDescriptions": [ + "The default view window mode used in the Sheets editor for this chart\ntype. In most cases, if set, the default mode is equivalent to\n`PRETTY`.", + "Do not use. Represents that the currently set mode is not supported by\nthe API.", + "Follows the min and max exactly if specified. If a value is unspecified,\nit will fall back to the `PRETTY` value.", + "Chooses a min and max that make the chart look good. Both min and max are\nignored in this mode." + ], + "enum": [ + "DEFAULT_VIEW_WINDOW_MODE", + "VIEW_WINDOW_MODE_UNSUPPORTED", + "EXPLICIT", + "PRETTY" + ] } } }, - "BatchClearValuesByDataFilterResponse": { - "id": "BatchClearValuesByDataFilterResponse", - "description": "The response when clearing a range of values selected with\nDataFilters in a spreadsheet.", + "BasicChartSeries": { + "id": "BasicChartSeries", + "description": "A single series of data in a chart.\nFor example, if charting stock prices over time, multiple series may exist,\none for the \"Open Price\", \"High Price\", \"Low Price\" and \"Close Price\".", "type": "object", "properties": { - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", + "color": { + "$ref": "Color", + "description": "The color for elements (i.e. bars, lines, points) associated with this\nseries. If empty, a default color is used." + }, + "lineStyle": { + "description": "The line style of this series. Valid only if the\nchartType is AREA,\nLINE, or SCATTER.\nCOMBO charts are also supported if the\nseries chart type is\nAREA or LINE.", + "$ref": "LineStyle" + }, + "series": { + "$ref": "ChartData", + "description": "The data being visualized in this chart series." + }, + "type": { + "enumDescriptions": [ + "Default value, do not use.", + "A \u003ca href=\"/chart/interactive/docs/gallery/barchart\"\u003ebar chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/linechart\"\u003eline chart\u003c/a\u003e.", + "An \u003ca href=\"/chart/interactive/docs/gallery/areachart\"\u003earea chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/columnchart\"\u003ecolumn chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/scatterchart\"\u003escatter\nchart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/combochart\"\u003ecombo chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/steppedareachart\"\u003estepped area\nchart\u003c/a\u003e." + ], + "enum": [ + "BASIC_CHART_TYPE_UNSPECIFIED", + "BAR", + "LINE", + "AREA", + "COLUMN", + "SCATTER", + "COMBO", + "STEPPED_AREA" + ], + "description": "The type of this series. Valid only if the\nchartType is\nCOMBO.\nDifferent types will change the way the series is visualized.\nOnly LINE, AREA,\nand COLUMN are supported.", "type": "string" }, - "clearedRanges": { - "description": "The ranges that were cleared, in A1 notation.\n(If the requests were for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual ranges\n that were cleared, bounded to the sheet's limits.)", - "type": "array", - "items": { - "type": "string" - } + "targetAxis": { + "enumDescriptions": [ + "Default value, do not use.", + "The axis rendered at the bottom of a chart.\nFor most charts, this is the standard major axis.\nFor bar charts, this is a minor axis.", + "The axis rendered at the left of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is the standard major axis.", + "The axis rendered at the right of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is an unusual major axis." + ], + "enum": [ + "BASIC_CHART_AXIS_POSITION_UNSPECIFIED", + "BOTTOM_AXIS", + "LEFT_AXIS", + "RIGHT_AXIS" + ], + "description": "The minor axis that will specify the range of values for this series.\nFor example, if charting stocks over time, the \"Volume\" series\nmay want to be pinned to the right with the prices pinned to the left,\nbecause the scale of trading volume is different than the scale of\nprices.\nIt is an error to specify an axis that isn't a valid minor axis\nfor the chart's type.", + "type": "string" } } }, - "TreemapChartColorScale": { - "description": "A color scale for a treemap chart.", + "AutoResizeDimensionsRequest": { + "id": "AutoResizeDimensionsRequest", + "description": "Automatically resizes one or more dimensions based on the contents\nof the cells in that dimension.", "type": "object", "properties": { - "minValueColor": { - "$ref": "Color", - "description": "The background color for cells with a color value less than or equal to\nminValue. Defaults to #dc3912 if not\nspecified." - }, - "noDataColor": { - "$ref": "Color", - "description": "The background color for cells that have no color data associated with\nthem. Defaults to #000000 if not specified." - }, - "midValueColor": { - "description": "The background color for cells with a color value at the midpoint between\nminValue and\nmaxValue. Defaults to #efe6dc if not\nspecified.", - "$ref": "Color" - }, - "maxValueColor": { - "$ref": "Color", - "description": "The background color for cells with a color value greater than or equal\nto maxValue. Defaults to #109618 if not\nspecified." + "dimensions": { + "$ref": "DimensionRange", + "description": "The dimensions to automatically resize." } - }, - "id": "TreemapChartColorScale" + } }, - "EmbeddedObjectPosition": { + "UpdateBordersRequest": { "type": "object", "properties": { - "newSheet": { - "type": "boolean", - "description": "If true, the embedded object is put on a new sheet whose ID\nis chosen for you. Used only when writing." + "bottom": { + "$ref": "Border", + "description": "The border to put at the bottom of the range." }, - "sheetId": { - "description": "The sheet this is on. Set only if the embedded object\nis on its own sheet. Must be non-negative.", - "format": "int32", - "type": "integer" + "innerVertical": { + "description": "The vertical border to put within the range.", + "$ref": "Border" }, - "overlayPosition": { - "$ref": "OverlayPosition", - "description": "The position at which the object is overlaid on top of a grid." + "right": { + "description": "The border to put at the right of the range.", + "$ref": "Border" + }, + "range": { + "$ref": "GridRange", + "description": "The range whose borders should be updated." + }, + "innerHorizontal": { + "$ref": "Border", + "description": "The horizontal border to put within the range." + }, + "top": { + "$ref": "Border", + "description": "The border to put at the top of the range." + }, + "left": { + "$ref": "Border", + "description": "The border to put at the left of the range." } }, - "id": "EmbeddedObjectPosition", - "description": "The position of an embedded object such as a chart." + "id": "UpdateBordersRequest", + "description": "Updates the borders of a range.\nIf a field is not set in the request, that means the border remains as-is.\nFor example, with two subsequent UpdateBordersRequest:\n\n 1. range: A1:A5 `{ top: RED, bottom: WHITE }`\n 2. range: A1:A5 `{ left: BLUE }`\n\nThat would result in A1:A5 having a borders of\n`{ top: RED, bottom: WHITE, left: BLUE }`.\nIf you want to clear a border, explicitly set the style to\nNONE." }, - "DeveloperMetadataLookup": { - "id": "DeveloperMetadataLookup", - "description": "Selects DeveloperMetadata that matches all of the specified fields. For\nexample, if only a metadata ID is specified this considers the\nDeveloperMetadata with that particular unique ID. If a metadata key is\nspecified, this considers all developer metadata with that key. If a\nkey, visibility, and location type are all specified, this considers all\ndeveloper metadata with that key and visibility that are associated with a\nlocation of that type. In general, this\nselects all DeveloperMetadata that matches the intersection of all the\nspecified fields; any field or combination of fields may be specified.", + "CellFormat": { "type": "object", "properties": { - "metadataLocation": { - "description": "Limits the selected developer metadata to those entries associated with\nthe specified location. This field either matches exact locations or all\nintersecting locations according the specified\nlocationMatchingStrategy.", - "$ref": "DeveloperMetadataLocation" + "textFormat": { + "description": "The format of the text in the cell (unless overridden by a format run).", + "$ref": "TextFormat" }, - "locationMatchingStrategy": { + "backgroundColor": { + "description": "The background color of the cell.", + "$ref": "Color" + }, + "padding": { + "$ref": "Padding", + "description": "The padding of the cell." + }, + "verticalAlignment": { + "enumDescriptions": [ + "The vertical alignment is not specified. Do not use this.", + "The text is explicitly aligned to the top of the cell.", + "The text is explicitly aligned to the middle of the cell.", + "The text is explicitly aligned to the bottom of the cell." + ], "enum": [ - "DEVELOPER_METADATA_LOCATION_MATCHING_STRATEGY_UNSPECIFIED", - "EXACT_LOCATION", - "INTERSECTING_LOCATION" + "VERTICAL_ALIGN_UNSPECIFIED", + "TOP", + "MIDDLE", + "BOTTOM" ], - "description": "Determines how this lookup matches the location. If this field is\nspecified as EXACT, only developer metadata associated on the exact\nlocation specified is matched. If this field is specified to INTERSECTING,\ndeveloper metadata associated on intersecting locations is also\nmatched. If left unspecified, this field assumes a default value of\nINTERSECTING.\nIf this field is specified, a metadataLocation\nmust also be specified.", + "description": "The vertical alignment of the value in the cell.", + "type": "string" + }, + "borders": { + "$ref": "Borders", + "description": "The borders of the cell." + }, + "textDirection": { "type": "string", "enumDescriptions": [ - "Default value. This value must not be used.", - "Indicates that a specified location should be matched exactly. For\nexample, if row three were specified as a location this matching strategy\nwould only match developer metadata also associated on row three. Metadata\nassociated on other locations would not be considered.", - "Indicates that a specified location should match that exact location as\nwell as any intersecting locations. For example, if row three were\nspecified as a location this matching strategy would match developer\nmetadata associated on row three as well as metadata associated on\nlocations that intersect row three. If, for instance, there was developer\nmetadata associated on column B, this matching strategy would also match\nthat location because column B intersects row three." - ] + "The text direction is not specified. Do not use this.", + "The text direction of left-to-right was set by the user.", + "The text direction of right-to-left was set by the user." + ], + "enum": [ + "TEXT_DIRECTION_UNSPECIFIED", + "LEFT_TO_RIGHT", + "RIGHT_TO_LEFT" + ], + "description": "The direction of the text in the cell." }, - "locationType": { - "description": "Limits the selected developer metadata to those entries which are\nassociated with locations of the specified type. For example, when this\nfield is specified as ROW this lookup\nonly considers developer metadata associated on rows. If the field is left\nunspecified, all location types are considered. This field cannot be\nspecified as SPREADSHEET when\nthe locationMatchingStrategy\nis specified as INTERSECTING or when the\nmetadataLocation is specified as a\nnon-spreadsheet location: spreadsheet metadata cannot intersect any other\ndeveloper metadata location. This field also must be left unspecified when\nthe locationMatchingStrategy\nis specified as EXACT.", + "wrapStrategy": { "type": "string", "enumDescriptions": [ - "Default value.", - "Developer metadata associated on an entire row dimension.", - "Developer metadata associated on an entire column dimension.", - "Developer metadata associated on an entire sheet.", - "Developer metadata associated on the entire spreadsheet." + "The default value, do not use.", + "Lines that are longer than the cell width will be written in the next\ncell over, so long as that cell is empty. If the next cell over is\nnon-empty, this behaves the same as CLIP. The text will never wrap\nto the next line unless the user manually inserts a new line.\nExample:\n\n | First sentence. |\n | Manual newline that is very long. \u003c- Text continues into next cell\n | Next newline. |", + "This wrap strategy represents the old Google Sheets wrap strategy where\nwords that are longer than a line are clipped rather than broken. This\nstrategy is not supported on all platforms and is being phased out.\nExample:\n\n | Cell has a |\n | loooooooooo| \u003c- Word is clipped.\n | word. |", + "Lines that are longer than the cell width will be clipped.\nThe text will never wrap to the next line unless the user manually\ninserts a new line.\nExample:\n\n | First sentence. |\n | Manual newline t| \u003c- Text is clipped\n | Next newline. |", + "Words that are longer than a line are wrapped at the character level\nrather than clipped.\nExample:\n\n | Cell has a |\n | loooooooooo| \u003c- Word is broken.\n | ong word. |" ], "enum": [ - "DEVELOPER_METADATA_LOCATION_TYPE_UNSPECIFIED", - "ROW", - "COLUMN", - "SHEET", - "SPREADSHEET" - ] + "WRAP_STRATEGY_UNSPECIFIED", + "OVERFLOW_CELL", + "LEGACY_WRAP", + "CLIP", + "WRAP" + ], + "description": "The wrap strategy for the value in the cell." }, - "metadataKey": { - "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_key.", - "type": "string" + "textRotation": { + "$ref": "TextRotation", + "description": "The rotation applied to text in a cell" }, - "visibility": { + "numberFormat": { + "$ref": "NumberFormat", + "description": "A format describing how number values should be represented to the user." + }, + "hyperlinkDisplayType": { + "description": "How a hyperlink, if it exists, should be displayed in the cell.", "type": "string", "enumDescriptions": [ - "Default value.", - "Document-visible metadata is accessible from any developer project with\naccess to the document.", - "Project-visible metadata is only visible to and accessible by the developer\nproject that created the metadata." + "The default value: the hyperlink is rendered. Do not use this.", + "A hyperlink should be explicitly rendered.", + "A hyperlink should not be rendered." ], "enum": [ - "DEVELOPER_METADATA_VISIBILITY_UNSPECIFIED", - "DOCUMENT", - "PROJECT" - ], - "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.visibility. If left unspecified, all developer\nmetadata visibile to the requesting project is considered." - }, - "metadataId": { - "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_id.", - "format": "int32", - "type": "integer" + "HYPERLINK_DISPLAY_TYPE_UNSPECIFIED", + "LINKED", + "PLAIN_TEXT" + ] }, - "metadataValue": { - "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_value.", + "horizontalAlignment": { + "enumDescriptions": [ + "The horizontal alignment is not specified. Do not use this.", + "The text is explicitly aligned to the left of the cell.", + "The text is explicitly aligned to the center of the cell.", + "The text is explicitly aligned to the right of the cell." + ], + "enum": [ + "HORIZONTAL_ALIGN_UNSPECIFIED", + "LEFT", + "CENTER", + "RIGHT" + ], + "description": "The horizontal alignment of the value in the cell.", "type": "string" } - } + }, + "id": "CellFormat", + "description": "The format of a cell." }, - "AutoFillRequest": { - "description": "Fills in more data based on existing data.", + "ClearValuesResponse": { + "description": "The response when clearing a range of values in a spreadsheet.", "type": "object", "properties": { - "range": { - "$ref": "GridRange", - "description": "The range to autofill. This will examine the range and detect\nthe location that has data and automatically fill that data\nin to the rest of the range." - }, - "useAlternateSeries": { - "description": "True if we should generate data with the \"alternate\" series.\nThis differs based on the type and amount of source data.", - "type": "boolean" + "spreadsheetId": { + "type": "string", + "description": "The spreadsheet the updates were applied to." }, - "sourceAndDestination": { - "$ref": "SourceAndDestination", - "description": "The source and destination areas to autofill.\nThis explicitly lists the source of the autofill and where to\nextend that data." + "clearedRange": { + "description": "The range (in A1 notation) that was cleared.\n(If the request was for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual range\n that was cleared, bounded to the sheet's limits.)", + "type": "string" } }, - "id": "AutoFillRequest" + "id": "ClearValuesResponse" }, - "GradientRule": { + "WaterfallChartCustomSubtotal": { + "id": "WaterfallChartCustomSubtotal", + "description": "A custom subtotal column for a waterfall chart series.", "type": "object", "properties": { - "midpoint": { - "$ref": "InterpolationPoint", - "description": "An optional midway interpolation point." + "subtotalIndex": { + "type": "integer", + "description": "The 0-based index of a data point within the series. If\ndata_is_subtotal is true, the data point at this index is the\nsubtotal. Otherwise, the subtotal appears after the data point with\nthis index. A series can have multiple subtotals at arbitrary indices,\nbut subtotals do not affect the indices of the data points. For\nexample, if a series has three data points, their indices will always\nbe 0, 1, and 2, regardless of how many subtotals exist on the series or\nwhat data points they are associated with.", + "format": "int32" }, - "minpoint": { - "$ref": "InterpolationPoint", - "description": "The starting interpolation point." + "dataIsSubtotal": { + "description": "True if the data point at subtotal_index is the subtotal. If false,\nthe subtotal will be computed and appear after the data point.", + "type": "boolean" }, - "maxpoint": { - "$ref": "InterpolationPoint", - "description": "The final interpolation point." + "label": { + "type": "string", + "description": "A label for the subtotal column." } - }, - "id": "GradientRule", - "description": "A rule that applies a gradient color scale format, based on\nthe interpolation points listed. The format of a cell will vary\nbased on its contents as compared to the values of the interpolation\npoints." - }, - "ClearValuesRequest": { - "description": "The request for clearing a range of values in a spreadsheet.", - "type": "object", - "properties": {}, - "id": "ClearValuesRequest" + } }, - "SetBasicFilterRequest": { - "id": "SetBasicFilterRequest", - "description": "Sets the basic filter associated with a sheet.", + "ChartData": { + "description": "The data included in a domain or series.", "type": "object", "properties": { - "filter": { - "description": "The filter to set.", - "$ref": "BasicFilter" + "sourceRange": { + "$ref": "ChartSourceRange", + "description": "The source ranges of the data." } - } + }, + "id": "ChartData" }, - "BatchClearValuesByDataFilterRequest": { - "id": "BatchClearValuesByDataFilterRequest", - "description": "The request for clearing more than one range selected by a\nDataFilter in a spreadsheet.", + "BatchGetValuesResponse": { "type": "object", "properties": { - "dataFilters": { + "valueRanges": { "type": "array", "items": { - "$ref": "DataFilter" + "$ref": "ValueRange" }, - "description": "The DataFilters used to determine which ranges to clear." + "description": "The requested values. The order of the ValueRanges is the same as the\norder of the requested ranges." + }, + "spreadsheetId": { + "description": "The ID of the spreadsheet the data was retrieved from.", + "type": "string" } - } + }, + "id": "BatchGetValuesResponse", + "description": "The response when retrieving more than one range of values in a spreadsheet." }, - "GetSpreadsheetByDataFilterRequest": { - "id": "GetSpreadsheetByDataFilterRequest", - "description": "The request for retrieving a Spreadsheet.", + "UpdateBandingRequest": { + "id": "UpdateBandingRequest", + "description": "Updates properties of the supplied banded range.", "type": "object", "properties": { - "includeGridData": { - "description": "True if grid data should be returned.\nThis parameter is ignored if a field mask was set in the request.", - "type": "boolean" + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `bandedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" }, - "dataFilters": { - "description": "The DataFilters used to select which ranges to retrieve from\nthe spreadsheet.", - "type": "array", - "items": { - "$ref": "DataFilter" - } + "bandedRange": { + "$ref": "BandedRange", + "description": "The banded range to update with the new properties." } } }, - "DeleteEmbeddedObjectRequest": { - "description": "Deletes the embedded object with the given ID.", + "Color": { "type": "object", "properties": { - "objectId": { - "description": "The ID of the embedded object to delete.", - "format": "int32", - "type": "integer" + "red": { + "description": "The amount of red in the color as a value in the interval [0, 1].", + "format": "float", + "type": "number" + }, + "green": { + "description": "The amount of green in the color as a value in the interval [0, 1].", + "format": "float", + "type": "number" + }, + "blue": { + "description": "The amount of blue in the color as a value in the interval [0, 1].", + "format": "float", + "type": "number" + }, + "alpha": { + "description": "The fraction of this color that should be applied to the pixel. That is,\nthe final pixel color is defined by the equation:\n\n pixel color = alpha * (this color) + (1.0 - alpha) * (background color)\n\nThis means that a value of 1.0 corresponds to a solid color, whereas\na value of 0.0 corresponds to a completely transparent color. This\nuses a wrapper message rather than a simple float scalar so that it is\npossible to distinguish between a default value and the value being unset.\nIf omitted, this color object is to be rendered as a solid color\n(as if the alpha value had been explicitly given with a value of 1.0).", + "format": "float", + "type": "number" } }, - "id": "DeleteEmbeddedObjectRequest" + "id": "Color", + "description": "Represents a color in the RGBA color space. This representation is designed\nfor simplicity of conversion to/from color representations in various\nlanguages over compactness; for example, the fields of this representation\ncan be trivially provided to the constructor of \"java.awt.Color\" in Java; it\ncan also be trivially provided to UIColor's \"+colorWithRed:green:blue:alpha\"\nmethod in iOS; and, with just a little work, it can be easily formatted into\na CSS \"rgba()\" string in JavaScript, as well.\n\nNote: this proto does not carry information about the absolute color space\nthat should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,\nDCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color\nspace.\n\nExample (Java):\n\n import com.google.type.Color;\n\n // ...\n public static java.awt.Color fromProto(Color protocolor) {\n float alpha = protocolor.hasAlpha()\n ? protocolor.getAlpha().getValue()\n : 1.0;\n\n return new java.awt.Color(\n protocolor.getRed(),\n protocolor.getGreen(),\n protocolor.getBlue(),\n alpha);\n }\n\n public static Color toProto(java.awt.Color color) {\n float red = (float) color.getRed();\n float green = (float) color.getGreen();\n float blue = (float) color.getBlue();\n float denominator = 255.0;\n Color.Builder resultBuilder =\n Color\n .newBuilder()\n .setRed(red / denominator)\n .setGreen(green / denominator)\n .setBlue(blue / denominator);\n int alpha = color.getAlpha();\n if (alpha != 255) {\n result.setAlpha(\n FloatValue\n .newBuilder()\n .setValue(((float) alpha) / denominator)\n .build());\n }\n return resultBuilder.build();\n }\n // ...\n\nExample (iOS / Obj-C):\n\n // ...\n static UIColor* fromProto(Color* protocolor) {\n float red = [protocolor red];\n float green = [protocolor green];\n float blue = [protocolor blue];\n FloatValue* alpha_wrapper = [protocolor alpha];\n float alpha = 1.0;\n if (alpha_wrapper != nil) {\n alpha = [alpha_wrapper value];\n }\n return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];\n }\n\n static Color* toProto(UIColor* color) {\n CGFloat red, green, blue, alpha;\n if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {\n return nil;\n }\n Color* result = [[Color alloc] init];\n [result setRed:red];\n [result setGreen:green];\n [result setBlue:blue];\n if (alpha \u003c= 0.9999) {\n [result setAlpha:floatWrapperWithValue(alpha)];\n }\n [result autorelease];\n return result;\n }\n // ...\n\n Example (JavaScript):\n\n // ...\n\n var protoToCssColor = function(rgb_color) {\n var redFrac = rgb_color.red || 0.0;\n var greenFrac = rgb_color.green || 0.0;\n var blueFrac = rgb_color.blue || 0.0;\n var red = Math.floor(redFrac * 255);\n var green = Math.floor(greenFrac * 255);\n var blue = Math.floor(blueFrac * 255);\n\n if (!('alpha' in rgb_color)) {\n return rgbToCssColor_(red, green, blue);\n }\n\n var alphaFrac = rgb_color.alpha.value || 0.0;\n var rgbParams = [red, green, blue].join(',');\n return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');\n };\n\n var rgbToCssColor_ = function(red, green, blue) {\n var rgbNumber = new Number((red \u003c\u003c 16) | (green \u003c\u003c 8) | blue);\n var hexString = rgbNumber.toString(16);\n var missingZeros = 6 - hexString.length;\n var resultBuilder = ['#'];\n for (var i = 0; i \u003c missingZeros; i++) {\n resultBuilder.push('0');\n }\n resultBuilder.push(hexString);\n return resultBuilder.join('');\n };\n\n // ..." }, - "UpdateValuesByDataFilterResponse": { - "description": "The response when updating a range of values by a data filter in a\nspreadsheet.", + "TrimWhitespaceRequest": { "type": "object", "properties": { - "updatedCells": { - "description": "The number of cells updated.", - "format": "int32", - "type": "integer" - }, - "dataFilter": { - "description": "The data filter that selected the range that was updated.", - "$ref": "DataFilter" - }, - "updatedData": { - "description": "The values of the cells in the range matched by the dataFilter after all\nupdates were applied. This is only included if the request's\n`includeValuesInResponse` field was `true`.", - "$ref": "ValueRange" - }, - "updatedRows": { - "description": "The number of rows where at least one cell in the row was updated.", - "format": "int32", - "type": "integer" - }, - "updatedColumns": { - "description": "The number of columns where at least one cell in the column was updated.", - "format": "int32", - "type": "integer" - }, - "updatedRange": { - "description": "The range (in A1 notation) that updates were applied to.", - "type": "string" + "range": { + "$ref": "GridRange", + "description": "The range whose cells to trim." } }, - "id": "UpdateValuesByDataFilterResponse" + "id": "TrimWhitespaceRequest", + "description": "Trims the whitespace (such as spaces, tabs, or new lines) in every cell in\nthe specified range. This request removes all whitespace from the start and\nend of each cell's text, and reduces any subsequence of remaining whitespace\ncharacters to a single space. If the resulting trimmed text starts with a '+'\nor '=' character, the text remains as a string value and isn't interpreted\nas a formula." }, - "DeleteSheetRequest": { + "ChartSourceRange": { + "description": "Source ranges for a chart.", "type": "object", "properties": { - "sheetId": { - "type": "integer", - "description": "The ID of the sheet to delete.", - "format": "int32" + "sources": { + "type": "array", + "items": { + "$ref": "GridRange" + }, + "description": "The ranges of data for a series or domain.\nExactly one dimension must have a length of 1,\nand all sources in the list must have the same dimension\nwith length 1.\nThe domain (if it exists) & all series must have the same number\nof source ranges. If using more than one source range, then the source\nrange at a given offset must be in order and contiguous across the domain\nand series.\n\nFor example, these are valid configurations:\n\n domain sources: A1:A5\n series1 sources: B1:B5\n series2 sources: D6:D10\n\n domain sources: A1:A5, C10:C12\n series1 sources: B1:B5, D10:D12\n series2 sources: C1:C5, E10:E12" } }, - "id": "DeleteSheetRequest", - "description": "Deletes the requested sheet." + "id": "ChartSourceRange" }, - "DeveloperMetadataLocation": { + "ValueRange": { "type": "object", "properties": { - "spreadsheet": { - "type": "boolean", - "description": "True when metadata is associated with an entire spreadsheet." - }, - "sheetId": { - "description": "The ID of the sheet when metadata is associated with an entire sheet.", - "format": "int32", - "type": "integer" - }, - "locationType": { + "majorDimension": { + "description": "The major dimension of the values.\n\nFor output, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.\n\nFor input, with `range=A1:B2,majorDimension=ROWS` then `[[1,2],[3,4]]`\nwill set `A1=1,B1=2,A2=3,B2=4`. With `range=A1:B2,majorDimension=COLUMNS`\nthen `[[1,2],[3,4]]` will set `A1=1,B1=3,A2=2,B2=4`.\n\nWhen writing, if this field is not set, it defaults to ROWS.", "type": "string", "enumDescriptions": [ - "Default value.", - "Developer metadata associated on an entire row dimension.", - "Developer metadata associated on an entire column dimension.", - "Developer metadata associated on an entire sheet.", - "Developer metadata associated on the entire spreadsheet." + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." ], "enum": [ - "DEVELOPER_METADATA_LOCATION_TYPE_UNSPECIFIED", - "ROW", - "COLUMN", - "SHEET", - "SPREADSHEET" - ], - "description": "The type of location this object represents. This field is read-only." + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ] }, - "dimensionRange": { - "description": "Represents the row or column when metadata is associated with\na dimension. The specified DimensionRange must represent a single row\nor column; it cannot be unbounded or span multiple rows or columns.", - "$ref": "DimensionRange" - } - }, - "id": "DeveloperMetadataLocation", - "description": "A location where metadata may be associated in a spreadsheet." - }, - "MatchedValueRange": { - "description": "A value range that was matched by one or more data filers.", - "type": "object", - "properties": { - "dataFilters": { - "description": "The DataFilters from the request that matched the range of\nvalues.", + "values": { + "description": "The data that was read or to be written. This is an array of arrays,\nthe outer array representing all the data and each inner array\nrepresenting a major dimension. Each item in the inner array\ncorresponds with one cell.\n\nFor output, empty trailing rows and columns will not be included.\n\nFor input, supported value types are: bool, string, and double.\nNull values will be skipped.\nTo set a cell to an empty value, set the string value to an empty string.", "type": "array", "items": { - "$ref": "DataFilter" + "type": "array", + "items": { + "type": "any" + } } }, - "valueRange": { - "description": "The values matched by the DataFilter.", - "$ref": "ValueRange" + "range": { + "description": "The range the values cover, in A1 notation.\nFor output, this range indicates the entire requested range,\neven though the values will exclude trailing rows and columns.\nWhen appending values, this field represents the range to search for a\ntable, after which values will be appended.", + "type": "string" } }, - "id": "MatchedValueRange" + "id": "ValueRange", + "description": "Data within a range of the spreadsheet." }, - "DuplicateSheetRequest": { + "AddBandingRequest": { + "id": "AddBandingRequest", + "description": "Adds a new banded range to the spreadsheet.", "type": "object", "properties": { - "newSheetName": { - "description": "The name of the new sheet. If empty, a new name is chosen for you.", - "type": "string" - }, - "sourceSheetId": { - "description": "The sheet to duplicate.", - "format": "int32", - "type": "integer" - }, - "newSheetId": { - "description": "If set, the ID of the new sheet. If not set, an ID is chosen.\nIf set, the ID must not conflict with any existing sheet ID.\nIf set, it must be non-negative.", - "format": "int32", - "type": "integer" - }, - "insertSheetIndex": { - "type": "integer", - "description": "The zero-based index where the new sheet should be inserted.\nThe index of all sheets after this are incremented.", - "format": "int32" + "bandedRange": { + "$ref": "BandedRange", + "description": "The banded range to add. The bandedRangeId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a range that already exists.)" } - }, - "id": "DuplicateSheetRequest", - "description": "Duplicates the contents of a sheet." + } }, - "TreemapChartSpec": { - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/treemap\"\u003eTreemap chart\u003c/a\u003e.", + "Response": { "type": "object", "properties": { - "headerColor": { - "$ref": "Color", - "description": "The background color for header cells." + "addSheet": { + "$ref": "AddSheetResponse", + "description": "A reply from adding a sheet." }, - "parentLabels": { - "description": "The data the contains the treemap cells' parent labels.", - "$ref": "ChartData" + "updateConditionalFormatRule": { + "$ref": "UpdateConditionalFormatRuleResponse", + "description": "A reply from updating a conditional format rule." }, - "labels": { - "$ref": "ChartData", - "description": "The data that contains the treemap cell labels." + "createDeveloperMetadata": { + "$ref": "CreateDeveloperMetadataResponse", + "description": "A reply from creating a developer metadata entry." }, - "colorData": { - "$ref": "ChartData", - "description": "The data that determines the background color of each treemap data cell.\nThis field is optional. If not specified, size_data is used to\ndetermine background colors. If specified, the data is expected to be\nnumeric. color_scale will determine how the values in this data map to\ndata cell background colors." + "addNamedRange": { + "$ref": "AddNamedRangeResponse", + "description": "A reply from adding a named range." }, - "maxValue": { - "type": "number", - "description": "The maximum possible data value. Cells with values greater than this will\nhave the same color as cells with this value. If not specified, defaults\nto the actual maximum value from color_data, or the maximum value from\nsize_data if color_data is not specified.", - "format": "double" + "deleteDeveloperMetadata": { + "$ref": "DeleteDeveloperMetadataResponse", + "description": "A reply from deleting a developer metadata entry." }, - "colorScale": { - "$ref": "TreemapChartColorScale", - "description": "The color scale for data cells in the treemap chart. Data cells are\nassigned colors based on their color values. These color values come from\ncolor_data, or from size_data if color_data is not specified.\nCells with color values less than or equal to min_value will\nhave minValueColor as their\nbackground color. Cells with color values greater than or equal to\nmax_value will have\nmaxValueColor as their background\ncolor. Cells with color values between min_value and max_value will\nhave background colors on a gradient between\nminValueColor and\nmaxValueColor, the midpoint of\nthe gradient being midValueColor.\nCells with missing or non-numeric color values will have\nnoDataColor as their background\ncolor." + "trimWhitespace": { + "$ref": "TrimWhitespaceResponse", + "description": "A reply from trimming whitespace." }, - "hideTooltips": { - "description": "True to hide tooltips.", - "type": "boolean" + "addFilterView": { + "$ref": "AddFilterViewResponse", + "description": "A reply from adding a filter view." }, - "hintedLevels": { - "description": "The number of additional data levels beyond the labeled levels to be shown\non the treemap chart. These levels are not interactive and are shown\nwithout their labels. Defaults to 0 if not specified.", - "format": "int32", - "type": "integer" + "deleteDuplicates": { + "$ref": "DeleteDuplicatesResponse", + "description": "A reply from removing rows containing duplicate values." }, - "levels": { - "description": "The number of data levels to show on the treemap chart. These levels are\ninteractive and are shown with their labels. Defaults to 2 if not\nspecified.", - "format": "int32", - "type": "integer" + "addBanding": { + "$ref": "AddBandingResponse", + "description": "A reply from adding a banded range." }, - "minValue": { - "type": "number", - "description": "The minimum possible data value. Cells with values less than this will\nhave the same color as cells with this value. If not specified, defaults\nto the actual minimum value from color_data, or the minimum value from\nsize_data if color_data is not specified.", - "format": "double" + "addProtectedRange": { + "$ref": "AddProtectedRangeResponse", + "description": "A reply from adding a protected range." }, - "sizeData": { - "$ref": "ChartData", - "description": "The data that determines the size of each treemap data cell. This data is\nexpected to be numeric. The cells corresponding to non-numeric or missing\ndata will not be rendered. If color_data is not specified, this data\nis used to determine data cell background colors as well." + "duplicateSheet": { + "$ref": "DuplicateSheetResponse", + "description": "A reply from duplicating a sheet." + }, + "addSlicer": { + "description": "A reply from adding a slicer.", + "$ref": "AddSlicerResponse" + }, + "updateEmbeddedObjectPosition": { + "$ref": "UpdateEmbeddedObjectPositionResponse", + "description": "A reply from updating an embedded object's position." + }, + "deleteConditionalFormatRule": { + "$ref": "DeleteConditionalFormatRuleResponse", + "description": "A reply from deleting a conditional format rule." + }, + "deleteDimensionGroup": { + "$ref": "DeleteDimensionGroupResponse", + "description": "A reply from deleting a dimension group." + }, + "duplicateFilterView": { + "description": "A reply from duplicating a filter view.", + "$ref": "DuplicateFilterViewResponse" + }, + "addDimensionGroup": { + "description": "A reply from adding a dimension group.", + "$ref": "AddDimensionGroupResponse" + }, + "addChart": { + "$ref": "AddChartResponse", + "description": "A reply from adding a chart." + }, + "updateDeveloperMetadata": { + "description": "A reply from updating a developer metadata entry.", + "$ref": "UpdateDeveloperMetadataResponse" + }, + "findReplace": { + "$ref": "FindReplaceResponse", + "description": "A reply from doing a find/replace." + } + }, + "id": "Response", + "description": "A single response from an update." + }, + "InsertRangeRequest": { + "description": "Inserts cells into a range, shifting the existing cells over or down.", + "type": "object", + "properties": { + "shiftDimension": { + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The dimension which will be shifted when inserting cells.\nIf ROWS, existing cells will be shifted down.\nIf COLUMNS, existing cells will be shifted right." }, - "textFormat": { - "$ref": "TextFormat", - "description": "The text format for all labels on the chart." + "range": { + "$ref": "GridRange", + "description": "The range to insert new cells into." } }, - "id": "TreemapChartSpec" + "id": "InsertRangeRequest" }, - "ExtendedValue": { + "EmbeddedChart": { + "description": "A chart embedded in a sheet.", "type": "object", "properties": { - "errorValue": { - "description": "Represents an error.\nThis field is read-only.", - "$ref": "ErrorValue" - }, - "stringValue": { - "description": "Represents a string value.\nLeading single quotes are not included. For example, if the user typed\n`'123` into the UI, this would be represented as a `stringValue` of\n`\"123\"`.", - "type": "string" - }, - "boolValue": { - "description": "Represents a boolean value.", - "type": "boolean" + "chartId": { + "description": "The ID of the chart.", + "format": "int32", + "type": "integer" }, - "formulaValue": { - "type": "string", - "description": "Represents a formula." + "position": { + "$ref": "EmbeddedObjectPosition", + "description": "The position of the chart." }, - "numberValue": { - "type": "number", - "description": "Represents a double value.\nNote: Dates, Times and DateTimes are represented as doubles in\n\"serial number\" format.", - "format": "double" + "spec": { + "$ref": "ChartSpec", + "description": "The specification of the chart." } }, - "id": "ExtendedValue", - "description": "The kinds of value that a cell in a spreadsheet can have." + "id": "EmbeddedChart" }, - "BatchClearValuesResponse": { - "description": "The response when clearing a range of values in a spreadsheet.", + "AddNamedRangeResponse": { + "description": "The result of adding a named range.", "type": "object", "properties": { - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", - "type": "string" - }, - "clearedRanges": { - "description": "The ranges that were cleared, in A1 notation.\n(If the requests were for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual ranges\n that were cleared, bounded to the sheet's limits.)", - "type": "array", - "items": { - "type": "string" - } + "namedRange": { + "$ref": "NamedRange", + "description": "The named range to add." } }, - "id": "BatchClearValuesResponse" + "id": "AddNamedRangeResponse" }, - "DataFilter": { - "id": "DataFilter", - "description": "Filter that describes what data should be selected or returned from a\nrequest.", + "AddSheetRequest": { + "description": "Adds a new sheet.\nWhen a sheet is added at a given index,\nall subsequent sheets' indexes are incremented.\nTo add an object sheet, use AddChartRequest instead and specify\nEmbeddedObjectPosition.sheetId or\nEmbeddedObjectPosition.newSheet.", "type": "object", "properties": { - "gridRange": { - "$ref": "GridRange", - "description": "Selects data that matches the range described by the GridRange." - }, - "developerMetadataLookup": { - "description": "Selects data associated with the developer metadata matching the criteria\ndescribed by this DeveloperMetadataLookup.", - "$ref": "DeveloperMetadataLookup" - }, - "a1Range": { - "description": "Selects data that matches the specified A1 range.", - "type": "string" + "properties": { + "description": "The properties the new sheet should have.\nAll properties are optional.\nThe sheetId field is optional; if one is not\nset, an id will be randomly generated. (It is an error to specify the ID\nof a sheet that already exists.)", + "$ref": "SheetProperties" } - } + }, + "id": "AddSheetRequest" }, - "TextFormat": { - "description": "The format of a run of text in a cell.\nAbsent values indicate that the field isn't specified.", + "DeleteConditionalFormatRuleResponse": { + "description": "The result of deleting a conditional format rule.", "type": "object", "properties": { - "strikethrough": { - "description": "True if the text has a strikethrough.", - "type": "boolean" - }, - "italic": { - "description": "True if the text is italicized.", - "type": "boolean" - }, - "fontSize": { - "type": "integer", - "description": "The size of the font.", - "format": "int32" - }, - "underline": { - "type": "boolean", - "description": "True if the text is underlined." - }, - "bold": { - "description": "True if the text is bold.", - "type": "boolean" - }, - "foregroundColor": { - "description": "The foreground color of the text.", - "$ref": "Color" - }, - "fontFamily": { - "description": "The font family.", - "type": "string" + "rule": { + "$ref": "ConditionalFormatRule", + "description": "The rule that was deleted." } }, - "id": "TextFormat" + "id": "DeleteConditionalFormatRuleResponse" }, - "DeleteDuplicatesRequest": { - "id": "DeleteDuplicatesRequest", - "description": "Removes rows within this range that contain values in the specified columns\nthat are duplicates of values in any previous row. Rows with identical values\nbut different letter cases, formatting, or formulas are considered to be\nduplicates.\n\nThis request also removes duplicate rows hidden from view (for example, due\nto a filter). When removing duplicates, the first instance of each duplicate\nrow scanning from the top downwards is kept in the resulting range. Content\noutside of the specified range isn't removed, and rows considered duplicates\ndo not have to be adjacent to each other in the range.", + "AddSlicerRequest": { + "description": "Adds a slicer to a sheet in the spreadsheet.", "type": "object", "properties": { - "range": { - "$ref": "GridRange", - "description": "The range to remove duplicates rows from." - }, - "comparisonColumns": { - "description": "The columns in the range to analyze for duplicate values. If no columns are\nselected then all columns are analyzed for duplicates.", - "type": "array", - "items": { - "$ref": "DimensionRange" - } + "slicer": { + "description": "The slicer that should be added to the spreadsheet, including\nthe position where it should be placed. The slicerId field is optional; if one is not set, an id\nwill be randomly generated. (It is an error to specify the ID\nof a slicer that already exists.)", + "$ref": "Slicer" } - } + }, + "id": "AddSlicerRequest" }, - "RepeatCellRequest": { - "description": "Updates all cells in the range to the values in the given Cell object.\nOnly the fields listed in the fields field are updated; others are\nunchanged.\n\nIf writing a cell with a formula, the formula's ranges will automatically\nincrement for each field in the range.\nFor example, if writing a cell with formula `=A1` into range B2:C4,\nB2 would be `=A1`, B3 would be `=A2`, B4 would be `=A3`,\nC2 would be `=B1`, C3 would be `=B2`, C4 would be `=B3`.\n\nTo keep the formula's ranges static, use the `$` indicator.\nFor example, use the formula `=$A$1` to prevent both the row and the\ncolumn from incrementing.", + "GridCoordinate": { + "description": "A coordinate in a sheet.\nAll indexes are zero-based.", "type": "object", "properties": { - "range": { - "$ref": "GridRange", - "description": "The range to repeat the cell in." + "rowIndex": { + "description": "The row index of the coordinate.", + "format": "int32", + "type": "integer" }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `cell` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" + "columnIndex": { + "description": "The column index of the coordinate.", + "format": "int32", + "type": "integer" }, - "cell": { - "$ref": "CellData", - "description": "The data to write." + "sheetId": { + "description": "The sheet this coordinate is on.", + "format": "int32", + "type": "integer" } }, - "id": "RepeatCellRequest" + "id": "GridCoordinate" }, - "UpdateSpreadsheetPropertiesRequest": { - "description": "Updates properties of a spreadsheet.", + "UpdateSheetPropertiesRequest": { "type": "object", "properties": { "properties": { - "$ref": "SpreadsheetProperties", + "$ref": "SheetProperties", "description": "The properties to update." }, "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root 'properties' is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" + "type": "string", + "description": "The fields that should be updated. At least one field must be specified.\nThe root `properties` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask" } }, - "id": "UpdateSpreadsheetPropertiesRequest" + "id": "UpdateSheetPropertiesRequest", + "description": "Updates properties of the sheet with the specified\nsheetId." }, - "ProtectedRange": { + "GridProperties": { + "description": "Properties of a grid.", "type": "object", "properties": { - "protectedRangeId": { - "description": "The ID of the protected range.\nThis field is read-only.", + "columnCount": { + "type": "integer", + "description": "The number of columns in the grid.", + "format": "int32" + }, + "frozenColumnCount": { + "description": "The number of columns that are frozen in the grid.", "format": "int32", "type": "integer" }, - "warningOnly": { - "description": "True if this protected range will show a warning when editing.\nWarning-based protection means that every user can edit data in the\nprotected range, except editing will prompt a warning asking the user\nto confirm the edit.\n\nWhen writing: if this field is true, then editors is ignored.\nAdditionally, if this field is changed from true to false and the\n`editors` field is not set (nor included in the field mask), then\nthe editors will be set to all the editors in the document.", + "columnGroupControlAfter": { + "description": "True if the column grouping control toggle is shown after the group.", "type": "boolean" }, - "requestingUserCanEdit": { - "description": "True if the user who requested this protected range can edit the\nprotected area.\nThis field is read-only.", + "rowGroupControlAfter": { + "description": "True if the row grouping control toggle is shown after the group.", "type": "boolean" }, - "editors": { - "$ref": "Editors", - "description": "The users and groups with edit access to the protected range.\nThis field is only visible to users with edit access to the protected\nrange and the document.\nEditors are not supported with warning_only protection." + "rowCount": { + "description": "The number of rows in the grid.", + "format": "int32", + "type": "integer" }, - "range": { - "$ref": "GridRange", - "description": "The range that is being protected.\nThe range may be fully unbounded, in which case this is considered\na protected sheet.\n\nWhen writing, only one of range or named_range_id\nmay be set." + "hideGridlines": { + "description": "True if the grid isn't showing gridlines in the UI.", + "type": "boolean" }, - "description": { - "description": "The description of this protected range.", - "type": "string" + "frozenRowCount": { + "description": "The number of rows that are frozen in the grid.", + "format": "int32", + "type": "integer" + } + }, + "id": "GridProperties" + }, + "AddSlicerResponse": { + "description": "The result of adding a slicer to a spreadsheet.", + "type": "object", + "properties": { + "slicer": { + "description": "The newly added slicer.", + "$ref": "Slicer" + } + }, + "id": "AddSlicerResponse" + }, + "Sheet": { + "description": "A sheet in a spreadsheet.", + "type": "object", + "properties": { + "developerMetadata": { + "description": "The developer metadata associated with a sheet.", + "type": "array", + "items": { + "$ref": "DeveloperMetadata" + } }, - "unprotectedRanges": { - "description": "The list of unprotected ranges within a protected sheet.\nUnprotected ranges are only supported on protected sheets.", + "protectedRanges": { + "description": "The protected ranges in this sheet.", + "type": "array", + "items": { + "$ref": "ProtectedRange" + } + }, + "conditionalFormats": { + "description": "The conditional format rules in this sheet.", + "type": "array", + "items": { + "$ref": "ConditionalFormatRule" + } + }, + "columnGroups": { + "description": "All column groups on this sheet, ordered by increasing range start index,\nthen by group depth.", + "type": "array", + "items": { + "$ref": "DimensionGroup" + } + }, + "basicFilter": { + "$ref": "BasicFilter", + "description": "The filter on this sheet, if any." + }, + "merges": { + "description": "The ranges that are merged together.", + "type": "array", + "items": { + "$ref": "GridRange" + } + }, + "bandedRanges": { + "description": "The banded (alternating colors) ranges on this sheet.", + "type": "array", + "items": { + "$ref": "BandedRange" + } + }, + "charts": { + "type": "array", + "items": { + "$ref": "EmbeddedChart" + }, + "description": "The specifications of every chart on this sheet." + }, + "filterViews": { + "description": "The filter views in this sheet.", "type": "array", "items": { - "$ref": "GridRange" + "$ref": "FilterView" } }, - "namedRangeId": { - "description": "The named range this protected range is backed by, if any.\n\nWhen writing, only one of range or named_range_id\nmay be set.", - "type": "string" - } - }, - "id": "ProtectedRange", - "description": "A protected range." - }, - "DimensionProperties": { - "type": "object", - "properties": { - "developerMetadata": { - "description": "The developer metadata associated with a single row or column.", + "slicers": { + "description": "The slicers on this sheet.", "type": "array", "items": { - "$ref": "DeveloperMetadata" + "$ref": "Slicer" } }, - "pixelSize": { - "type": "integer", - "description": "The height (if a row) or width (if a column) of the dimension in pixels.", - "format": "int32" + "rowGroups": { + "description": "All row groups on this sheet, ordered by increasing range start index, then\nby group depth.", + "type": "array", + "items": { + "$ref": "DimensionGroup" + } }, - "hiddenByFilter": { - "type": "boolean", - "description": "True if this dimension is being filtered.\nThis field is read-only." + "data": { + "description": "Data in the grid, if this is a grid sheet.\nThe number of GridData objects returned is dependent on the number of\nranges requested on this sheet. For example, if this is representing\n`Sheet1`, and the spreadsheet was requested with ranges\n`Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a\nstartRow/startColumn of `0`,\nwhile the second one will have `startRow 14` (zero-based row 15),\nand `startColumn 3` (zero-based column D).", + "type": "array", + "items": { + "$ref": "GridData" + } }, - "hiddenByUser": { - "description": "True if this dimension is explicitly hidden.", - "type": "boolean" + "properties": { + "$ref": "SheetProperties", + "description": "The properties of the sheet." } }, - "id": "DimensionProperties", - "description": "Properties about a dimension." + "id": "Sheet" }, - "DimensionRange": { - "description": "A range along a single dimension on a sheet.\nAll indexes are zero-based.\nIndexes are half open: the start index is inclusive\nand the end index is exclusive.\nMissing indexes indicate the range is unbounded on that side.", + "PivotGroupValueMetadata": { + "description": "Metadata about a value in a pivot grouping.", "type": "object", "properties": { - "dimension": { - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ], - "description": "The dimension of the span.", - "type": "string" - }, - "startIndex": { - "description": "The start (inclusive) of the span, or not set if unbounded.", - "format": "int32", - "type": "integer" - }, - "endIndex": { - "description": "The end (exclusive) of the span, or not set if unbounded.", - "format": "int32", - "type": "integer" + "value": { + "$ref": "ExtendedValue", + "description": "The calculated value the metadata corresponds to.\n(Note that formulaValue is not valid,\n because the values will be calculated.)" }, - "sheetId": { - "description": "The sheet this span is on.", - "format": "int32", - "type": "integer" + "collapsed": { + "description": "True if the data corresponding to the value is collapsed.", + "type": "boolean" } }, - "id": "DimensionRange" + "id": "PivotGroupValueMetadata" }, - "NamedRange": { - "id": "NamedRange", - "description": "A named range.", + "FilterCriteria": { + "description": "Criteria for showing/hiding rows in a filter or filter view.", "type": "object", "properties": { - "name": { - "description": "The name of the named range.", - "type": "string" + "visibleForegroundColor": { + "description": "The text color to filter by; only cells with this text color are shown.\nMutually exclusive with all other filter criteria. Requests to set this\nfield will fail with a 400 error if any other filter criteria field is set.", + "$ref": "Color" }, - "namedRangeId": { - "description": "The ID of the named range.", - "type": "string" + "hiddenValues": { + "description": "Values that should be hidden.", + "type": "array", + "items": { + "type": "string" + } }, - "range": { - "description": "The range this represents.", - "$ref": "GridRange" - } - } - }, - "ChartCustomNumberFormatOptions": { - "type": "object", - "properties": { - "prefix": { - "type": "string", - "description": "Custom prefix to be prepended to the chart attribute.\nThis field is optional." + "condition": { + "$ref": "BooleanCondition", + "description": "A condition that must be true for values to be shown.\n(This does not override hidden_values -- if a value is listed there,\n it will still be hidden.)" }, - "suffix": { - "description": "Custom suffix to be appended to the chart attribute.\nThis field is optional.", - "type": "string" + "visibleBackgroundColor": { + "$ref": "Color", + "description": "The background fill color to filter by; only cells with this fill color are\nshown. Mutually exclusive with all other filter criteria. Requests to set\nthis field will fail with a 400 error if any other filter criteria field is\nset." } }, - "id": "ChartCustomNumberFormatOptions", - "description": "Custom number formatting options for chart attributes." + "id": "FilterCriteria" }, - "Borders": { + "Editors": { + "description": "The editors of a protected range.", "type": "object", "properties": { - "bottom": { - "$ref": "Border", - "description": "The bottom border of the cell." - }, - "top": { - "$ref": "Border", - "description": "The top border of the cell." - }, - "left": { - "$ref": "Border", - "description": "The left border of the cell." + "users": { + "description": "The email addresses of users with edit access to the protected range.", + "type": "array", + "items": { + "type": "string" + } }, - "right": { - "description": "The right border of the cell.", - "$ref": "Border" - } - }, - "id": "Borders", - "description": "The borders of the cell." - }, - "ManualRule": { - "description": "Allows you to manually organize the values in a source data column into\nbuckets with names of your choosing. For example, a pivot table that\naggregates population by state:\n\n +-------+-------------------+\n | State | SUM of Population |\n +-------+-------------------+\n | AK | 0.7 |\n | AL | 4.8 |\n | AR | 2.9 |\n ...\n +-------+-------------------+\ncould be turned into a pivot table that aggregates population by time zone\nby providing a list of groups (for example, groupName = 'Central',\nitems = ['AL', 'AR', 'IA', ...]) to a manual group rule.\nNote that a similar effect could be achieved by adding a time zone column\nto the source data and adjusting the pivot table.\n\n +-----------+-------------------+\n | Time Zone | SUM of Population |\n +-----------+-------------------+\n | Central | 106.3 |\n | Eastern | 151.9 |\n | Mountain | 17.4 |\n ...\n +-----------+-------------------+", - "type": "object", - "properties": { "groups": { + "description": "The email addresses of groups with edit access to the protected range.", "type": "array", "items": { - "$ref": "ManualRuleGroup" - }, - "description": "The list of group names and the corresponding items from the source data\nthat map to each group name." - } - }, - "id": "ManualRule" - }, - "DeleteConditionalFormatRuleRequest": { - "description": "Deletes a conditional format rule at the given index.\nAll subsequent rules' indexes are decremented.", - "type": "object", - "properties": { - "sheetId": { - "description": "The sheet the rule is being deleted from.", - "format": "int32", - "type": "integer" + "type": "string" + } }, - "index": { - "type": "integer", - "description": "The zero-based index of the rule to be deleted.", - "format": "int32" + "domainUsersCanEdit": { + "type": "boolean", + "description": "True if anyone in the document's domain has edit access to the protected\nrange. Domain protection is only supported on documents within a domain." } }, - "id": "DeleteConditionalFormatRuleRequest" + "id": "Editors" }, - "AddBandingResponse": { - "id": "AddBandingResponse", - "description": "The result of adding a banded range.", + "DataValidationRule": { + "id": "DataValidationRule", + "description": "A data validation rule.", "type": "object", "properties": { - "bandedRange": { - "description": "The banded range that was added.", - "$ref": "BandedRange" + "showCustomUi": { + "type": "boolean", + "description": "True if the UI should be customized based on the kind of condition.\nIf true, \"List\" conditions will show a dropdown." + }, + "strict": { + "description": "True if invalid data should be rejected.", + "type": "boolean" + }, + "inputMessage": { + "description": "A message to show the user when adding data to the cell.", + "type": "string" + }, + "condition": { + "$ref": "BooleanCondition", + "description": "The condition that data in the cell must match." } } }, - "DeleteNamedRangeRequest": { - "description": "Removes the named range with the given ID from the spreadsheet.", + "TextRotation": { + "description": "The rotation applied to text in a cell.", "type": "object", "properties": { - "namedRangeId": { - "description": "The ID of the named range to delete.", - "type": "string" + "angle": { + "description": "The angle between the standard orientation and the desired orientation.\nMeasured in degrees. Valid values are between -90 and 90. Positive\nangles are angled upwards, negative are angled downwards.\n\nNote: For LTR text direction positive angles are in the\ncounterclockwise direction, whereas for RTL they are in the clockwise\ndirection", + "format": "int32", + "type": "integer" + }, + "vertical": { + "description": "If true, text reads top to bottom, but the orientation of individual\ncharacters is unchanged.\nFor example:\n\n | V |\n | e |\n | r |\n | t |\n | i |\n | c |\n | a |\n | l |", + "type": "boolean" } }, - "id": "DeleteNamedRangeRequest" + "id": "TextRotation" }, - "AddDimensionGroupResponse": { + "DeleteDimensionGroupResponse": { + "description": "The result of deleting a group.", "type": "object", "properties": { "dimensionGroups": { - "description": "All groups of a dimension after adding a group to that dimension.", "type": "array", "items": { "$ref": "DimensionGroup" - } + }, + "description": "All groups of a dimension after deleting a group from that dimension." } }, - "id": "AddDimensionGroupResponse", - "description": "The result of adding a group." - }, - "PivotGroup": { - "id": "PivotGroup", - "description": "A single grouping (either row or column) in a pivot table.", - "type": "object", - "properties": { - "repeatHeadings": { - "type": "boolean", - "description": "True if the headings in this pivot group should be repeated.\nThis is only valid for row groupings and is ignored by columns.\n\nBy default, we minimize repitition of headings by not showing higher\nlevel headings where they are the same. For example, even though the\nthird row below corresponds to \"Q1 Mar\", \"Q1\" is not shown because\nit is redundant with previous rows. Setting repeat_headings to true\nwould cause \"Q1\" to be repeated for \"Feb\" and \"Mar\".\n\n +--------------+\n | Q1 | Jan |\n | | Feb |\n | | Mar |\n +--------+-----+\n | Q1 Total |\n +--------------+" - }, - "sourceColumnOffset": { - "type": "integer", - "description": "The column offset of the source range that this grouping is based on.\n\nFor example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`\nmeans this group refers to column `C`, whereas the offset `1` would refer\nto column `D`.", - "format": "int32" - }, - "sortOrder": { - "enum": [ - "SORT_ORDER_UNSPECIFIED", - "ASCENDING", - "DESCENDING" - ], - "description": "The order the values in this group should be sorted.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use this.", - "Sort ascending.", - "Sort descending." - ] - }, - "valueBucket": { - "$ref": "PivotGroupSortValueBucket", - "description": "The bucket of the opposite pivot group to sort by.\nIf not specified, sorting is alphabetical by this group's values." - }, - "showTotals": { - "description": "True if the pivot table should include the totals for this grouping.", - "type": "boolean" - }, - "valueMetadata": { - "description": "Metadata about values in the grouping.", - "type": "array", - "items": { - "$ref": "PivotGroupValueMetadata" - } - }, - "groupRule": { - "$ref": "PivotGroupRule", - "description": "The group rule to apply to this row/column group." - }, - "label": { - "description": "The labels to use for the row/column groups which can be customized. For\nexample, in the following pivot table, the row label is `Region` (which\ncould be renamed to `State`) and the column label is `Product` (which\ncould be renamed `Item`). Pivot tables created before December 2017 do\nnot have header labels. If you'd like to add header labels to an existing\npivot table, please delete the existing pivot table and then create a new\npivot table with same parameters.\n\n +--------------+---------+-------+\n | SUM of Units | Product | |\n | Region | Pen | Paper |\n +--------------+---------+-------+\n | New York | 345 | 98 |\n | Oregon | 234 | 123 |\n | Tennessee | 531 | 415 |\n +--------------+---------+-------+\n | Grand Total | 1110 | 636 |\n +--------------+---------+-------+", - "type": "string" - } - } + "id": "DeleteDimensionGroupResponse" }, - "ManualRuleGroup": { - "description": "A group name and a list of items from the source data that should be placed\nin the group with this name.", + "UpdateDeveloperMetadataRequest": { + "id": "UpdateDeveloperMetadataRequest", + "description": "A request to update properties of developer metadata.\nUpdates the properties of the developer metadata selected by the filters to\nthe values provided in the DeveloperMetadata resource. Callers must\nspecify the properties they wish to update in the fields parameter, as well\nas specify at least one DataFilter matching the metadata they wish to\nupdate.", "type": "object", "properties": { - "items": { - "description": "The items in the source data that should be placed into this group. Each\nitem may be a string, number, or boolean. Items may appear in at most one\ngroup within a given ManualRule. Items that do not appear in any\ngroup will appear on their own.", + "dataFilters": { + "description": "The filters matching the developer metadata entries to update.", "type": "array", "items": { - "$ref": "ExtendedValue" + "$ref": "DataFilter" } }, - "groupName": { - "$ref": "ExtendedValue", - "description": "The group name, which must be a string. Each group in a given\nManualRule must have a unique group name." - } - }, - "id": "ManualRuleGroup" - }, - "TrimWhitespaceResponse": { - "description": "The result of trimming whitespace in cells.", - "type": "object", - "properties": { - "cellsChangedCount": { - "description": "The number of cells that were trimmed of whitespace.", - "format": "int32", - "type": "integer" + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `developerMetadata` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" + }, + "developerMetadata": { + "$ref": "DeveloperMetadata", + "description": "The value that all metadata matched by the data filters will be updated to." } - }, - "id": "TrimWhitespaceResponse" + } }, - "PivotTable": { - "description": "A pivot table.", + "PieChartSpec": { + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/piechart\"\u003epie chart\u003c/a\u003e.", "type": "object", "properties": { - "criteria": { - "additionalProperties": { - "$ref": "PivotFilterCriteria" - }, - "description": "An optional mapping of filters per source column offset.\n\nThe filters are applied before aggregating data into the pivot table.\nThe map's key is the column offset of the source range that you want to\nfilter, and the value is the criteria for that column.\n\nFor example, if the source was `C10:E15`, a key of `0` will have the filter\nfor column `C`, whereas the key `1` is for column `D`.", - "type": "object" + "domain": { + "description": "The data that covers the domain of the pie chart.", + "$ref": "ChartData" }, - "rows": { - "description": "Each row grouping in the pivot table.", - "type": "array", - "items": { - "$ref": "PivotGroup" - } + "threeDimensional": { + "description": "True if the pie is three dimensional.", + "type": "boolean" }, - "valueLayout": { + "series": { + "$ref": "ChartData", + "description": "The data that covers the one and only series of the pie chart." + }, + "legendPosition": { + "type": "string", "enumDescriptions": [ - "Values are laid out horizontally (as columns).", - "Values are laid out vertically (as rows)." + "Default value, do not use.", + "The legend is rendered on the bottom of the chart.", + "The legend is rendered on the left of the chart.", + "The legend is rendered on the right of the chart.", + "The legend is rendered on the top of the chart.", + "No legend is rendered.", + "Each pie slice has a label attached to it." ], "enum": [ - "HORIZONTAL", - "VERTICAL" + "PIE_CHART_LEGEND_POSITION_UNSPECIFIED", + "BOTTOM_LEGEND", + "LEFT_LEGEND", + "RIGHT_LEGEND", + "TOP_LEGEND", + "NO_LEGEND", + "LABELED_LEGEND" ], - "description": "Whether values should be listed horizontally (as columns)\nor vertically (as rows).", - "type": "string" + "description": "Where the legend of the pie chart should be drawn." }, - "source": { - "$ref": "GridRange", - "description": "The range the pivot table is reading data from." + "pieHole": { + "description": "The size of the hole in the pie chart.", + "format": "double", + "type": "number" + } + }, + "id": "PieChartSpec" + }, + "UpdateSlicerSpecRequest": { + "type": "object", + "properties": { + "spec": { + "$ref": "SlicerSpec", + "description": "The specification to apply to the slicer." }, - "columns": { - "description": "Each column grouping in the pivot table.", - "type": "array", - "items": { - "$ref": "PivotGroup" - } + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `SlicerSpec` is implied and should not be specified. A single \"*\"`\ncan be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" }, - "values": { - "description": "A list of values to include in the pivot table.", - "type": "array", - "items": { - "$ref": "PivotValue" - } + "slicerId": { + "description": "The id of the slicer to update.", + "format": "int32", + "type": "integer" } }, - "id": "PivotTable" + "id": "UpdateSlicerSpecRequest", + "description": "Updates a slicer’s specifications.\n(This does not move or resize a slicer. To move or resize a slicer use\nUpdateEmbeddedObjectPositionRequest." }, - "SearchDeveloperMetadataResponse": { + "UpdateFilterViewRequest": { + "description": "Updates properties of the filter view.", "type": "object", "properties": { - "matchedDeveloperMetadata": { - "description": "The metadata matching the criteria of the search request.", - "type": "array", - "items": { - "$ref": "MatchedDeveloperMetadata" - } + "filter": { + "$ref": "FilterView", + "description": "The new properties of the filter view." + }, + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `filter` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" } }, - "id": "SearchDeveloperMetadataResponse", - "description": "A reply to a developer metadata search request." + "id": "UpdateFilterViewRequest" }, - "AppendCellsRequest": { - "id": "AppendCellsRequest", - "description": "Adds new cells after the last row with data in a sheet,\ninserting new rows into the sheet if necessary.", + "ConditionalFormatRule": { "type": "object", "properties": { - "rows": { - "description": "The data to append.", + "ranges": { + "description": "The ranges that are formatted if the condition is true.\nAll the ranges must be on the same grid.", "type": "array", "items": { - "$ref": "RowData" + "$ref": "GridRange" } }, - "fields": { - "description": "The fields of CellData that should be updated.\nAt least one field must be specified.\nThe root is the CellData; 'row.values.' should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" + "gradientRule": { + "description": "The formatting will vary based on the gradients in the rule.", + "$ref": "GradientRule" }, - "sheetId": { - "type": "integer", - "description": "The sheet ID to append the data to.", - "format": "int32" + "booleanRule": { + "$ref": "BooleanRule", + "description": "The formatting is either \"on\" or \"off\" according to the rule." } - } + }, + "id": "ConditionalFormatRule", + "description": "A rule describing a conditional format." }, - "TextFormatRun": { - "description": "A run of a text format. The format of this run continues until the start\nindex of the next run.\nWhen updating, all fields must be set.", + "CopyPasteRequest": { "type": "object", "properties": { - "startIndex": { - "type": "integer", - "description": "The character index where this run starts.", - "format": "int32" + "source": { + "description": "The source range to copy.", + "$ref": "GridRange" }, - "format": { - "$ref": "TextFormat", - "description": "The format of this run. Absent values inherit the cell's format." + "pasteType": { + "type": "string", + "enumDescriptions": [ + "Paste values, formulas, formats, and merges.", + "Paste the values ONLY without formats, formulas, or merges.", + "Paste the format and data validation only.", + "Like PASTE_NORMAL but without borders.", + "Paste the formulas only.", + "Paste the data validation only.", + "Paste the conditional formatting rules only." + ], + "enum": [ + "PASTE_NORMAL", + "PASTE_VALUES", + "PASTE_FORMAT", + "PASTE_NO_BORDERS", + "PASTE_FORMULA", + "PASTE_DATA_VALIDATION", + "PASTE_CONDITIONAL_FORMATTING" + ], + "description": "What kind of data to paste." + }, + "destination": { + "$ref": "GridRange", + "description": "The location to paste to. If the range covers a span that's\na multiple of the source's height or width, then the\ndata will be repeated to fill in the destination range.\nIf the range is smaller than the source range, the entire\nsource data will still be copied (beyond the end of the destination range)." + }, + "pasteOrientation": { + "type": "string", + "enumDescriptions": [ + "Paste normally.", + "Paste transposed, where all rows become columns and vice versa." + ], + "enum": [ + "NORMAL", + "TRANSPOSE" + ], + "description": "How that data should be oriented when pasting." } }, - "id": "TextFormatRun" + "id": "CopyPasteRequest", + "description": "Copies data from the source to the destination." }, - "BatchUpdateValuesByDataFilterResponse": { - "description": "The response when updating a range of values in a spreadsheet.", + "BooleanCondition": { "type": "object", "properties": { - "totalUpdatedRows": { - "description": "The total number of rows where at least one cell in the row was updated.", - "format": "int32", - "type": "integer" + "type": { + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "The cell's value must be greater than the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be greater than or equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be less than the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be less than or equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be not equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be between the two condition values.\nSupported by data validation, conditional formatting and filters.\nRequires exactly two ConditionValues.", + "The cell's value must not be between the two condition values.\nSupported by data validation, conditional formatting and filters.\nRequires exactly two ConditionValues.", + "The cell's value must contain the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must not contain the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must start with the condition's value.\nSupported by conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must end with the condition's value.\nSupported by conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be exactly the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be a valid email address.\nSupported by data validation.\nRequires no ConditionValues.", + "The cell's value must be a valid URL.\nSupported by data validation.\nRequires no ConditionValues.", + "The cell's value must be the same date as the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be before the date of the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue\nthat may be a relative date.", + "The cell's value must be after the date of the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue\nthat may be a relative date.", + "The cell's value must be on or before the date of the condition's value.\nSupported by data validation.\nRequires a single ConditionValue\nthat may be a relative date.", + "The cell's value must be on or after the date of the condition's value.\nSupported by data validation.\nRequires a single ConditionValue\nthat may be a relative date.", + "The cell's value must be between the dates of the two condition values.\nSupported by data validation.\nRequires exactly two ConditionValues.", + "The cell's value must be outside the dates of the two condition values.\nSupported by data validation.\nRequires exactly two ConditionValues.", + "The cell's value must be a date.\nSupported by data validation.\nRequires no ConditionValues.", + "The cell's value must be listed in the grid in condition value's range.\nSupported by data validation.\nRequires a single ConditionValue,\nand the value must be a valid range in A1 notation.", + "The cell's value must be in the list of condition values.\nSupported by data validation.\nSupports any number of condition values,\none per item in the list.\nFormulas are not supported in the values.", + "The cell's value must be empty.\nSupported by conditional formatting and filters.\nRequires no ConditionValues.", + "The cell's value must not be empty.\nSupported by conditional formatting and filters.\nRequires no ConditionValues.", + "The condition's formula must evaluate to true.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be TRUE/FALSE or in the list of condition values.\nSupported by data validation.\nRenders as a cell checkbox.\nSupports zero, one or two ConditionValues. No\nvalues indicates the cell must be TRUE or FALSE, where TRUE renders as\nchecked and FALSE renders as unchecked. One value indicates the cell\nwill render as checked when it contains that value and unchecked when it\nis blank. Two values indicate that the cell will render as checked when\nit contains the first value and unchecked when it contains the second\nvalue. For example, [\"Yes\",\"No\"] indicates that the cell will render a\nchecked box when it has the value \"Yes\" and an unchecked box when it has\nthe value \"No\"." + ], + "enum": [ + "CONDITION_TYPE_UNSPECIFIED", + "NUMBER_GREATER", + "NUMBER_GREATER_THAN_EQ", + "NUMBER_LESS", + "NUMBER_LESS_THAN_EQ", + "NUMBER_EQ", + "NUMBER_NOT_EQ", + "NUMBER_BETWEEN", + "NUMBER_NOT_BETWEEN", + "TEXT_CONTAINS", + "TEXT_NOT_CONTAINS", + "TEXT_STARTS_WITH", + "TEXT_ENDS_WITH", + "TEXT_EQ", + "TEXT_IS_EMAIL", + "TEXT_IS_URL", + "DATE_EQ", + "DATE_BEFORE", + "DATE_AFTER", + "DATE_ON_OR_BEFORE", + "DATE_ON_OR_AFTER", + "DATE_BETWEEN", + "DATE_NOT_BETWEEN", + "DATE_IS_VALID", + "ONE_OF_RANGE", + "ONE_OF_LIST", + "BLANK", + "NOT_BLANK", + "CUSTOM_FORMULA", + "BOOLEAN" + ], + "description": "The type of condition." }, - "responses": { - "description": "The response for each range updated.", + "values": { + "description": "The values of the condition. The number of supported values depends\non the condition type. Some support zero values,\nothers one or two values,\nand ConditionType.ONE_OF_LIST supports an arbitrary number of values.", "type": "array", "items": { - "$ref": "UpdateValuesByDataFilterResponse" + "$ref": "ConditionValue" } - }, - "totalUpdatedSheets": { - "description": "The total number of sheets where at least one cell in the sheet was\nupdated.", - "format": "int32", - "type": "integer" - }, - "totalUpdatedCells": { - "description": "The total number of cells updated.", - "format": "int32", - "type": "integer" - }, - "totalUpdatedColumns": { - "description": "The total number of columns where at least one cell in the column was\nupdated.", - "format": "int32", - "type": "integer" - }, - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", - "type": "string" } }, - "id": "BatchUpdateValuesByDataFilterResponse" + "id": "BooleanCondition", + "description": "A condition that can evaluate to true or false.\nBooleanConditions are used by conditional formatting,\ndata validation, and the criteria in filters." }, - "RowData": { - "description": "Data about each cell in a row.", + "AddDimensionGroupRequest": { "type": "object", "properties": { - "values": { - "description": "The values in the row, one per column.", - "type": "array", - "items": { - "$ref": "CellData" - } + "range": { + "description": "The range over which to create a group.", + "$ref": "DimensionRange" } }, - "id": "RowData" + "id": "AddDimensionGroupRequest", + "description": "Creates a group over the specified range.\n\nIf the requested range is a superset of the range of an existing group G,\nthen the depth of G is incremented and this new group G' has the\ndepth of that group. For example, a group [C:D, depth 1] + [B:E] results in\ngroups [B:E, depth 1] and [C:D, depth 2].\nIf the requested range is a subset of the range of an existing group G,\nthen the depth of the new group G' becomes one greater than the depth of G.\nFor example, a group [B:E, depth 1] + [C:D] results in groups [B:E, depth 1]\nand [C:D, depth 2].\nIf the requested range starts before and ends within, or starts within and\nends after, the range of an existing group G, then the range of the existing\ngroup G becomes the union of the ranges, and the new group G' has\ndepth one greater than the depth of G and range as the intersection of the\nranges. For example, a group [B:D, depth 1] + [C:E] results in groups [B:E,\ndepth 1] and [C:D, depth 2]." }, - "Border": { + "BasicChartSpec": { "type": "object", "properties": { - "color": { - "$ref": "Color", - "description": "The color of the border." + "series": { + "description": "The data this chart is visualizing.", + "type": "array", + "items": { + "$ref": "BasicChartSeries" + } }, - "width": { - "description": "The width of the border, in pixels.\nDeprecated; the width is determined by the \"style\" field.", - "format": "int32", - "type": "integer" + "legendPosition": { + "enum": [ + "BASIC_CHART_LEGEND_POSITION_UNSPECIFIED", + "BOTTOM_LEGEND", + "LEFT_LEGEND", + "RIGHT_LEGEND", + "TOP_LEGEND", + "NO_LEGEND" + ], + "description": "The position of the chart legend.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "The legend is rendered on the bottom of the chart.", + "The legend is rendered on the left of the chart.", + "The legend is rendered on the right of the chart.", + "The legend is rendered on the top of the chart.", + "No legend is rendered." + ] }, - "style": { + "compareMode": { "type": "string", "enumDescriptions": [ - "The style is not specified. Do not use this.", - "The border is dotted.", - "The border is dashed.", - "The border is a thin solid line.", - "The border is a medium solid line.", - "The border is a thick solid line.", - "No border.\nUsed only when updating a border in order to erase it.", - "The border is two solid lines." + "Default value, do not use.", + "Only the focused data element is highlighted and shown in the tooltip.", + "All data elements with the same category (e.g., domain value) are\nhighlighted and shown in the tooltip." ], "enum": [ - "STYLE_UNSPECIFIED", - "DOTTED", - "DASHED", - "SOLID", - "SOLID_MEDIUM", - "SOLID_THICK", - "NONE", - "DOUBLE" + "BASIC_CHART_COMPARE_MODE_UNSPECIFIED", + "DATUM", + "CATEGORY" ], - "description": "The style of the border." - } - }, - "id": "Border", - "description": "A border along a cell." - }, - "GridData": { - "description": "Data in the grid, as well as metadata about the dimensions.", - "type": "object", - "properties": { - "rowMetadata": { - "description": "Metadata about the requested rows in the grid, starting with the row\nin start_row.", - "type": "array", - "items": { - "$ref": "DimensionProperties" - } + "description": "The behavior of tooltips and data highlighting when hovering on data and\nchart area." }, - "rowData": { - "description": "The data in the grid, one entry per row,\nstarting with the row in startRow.\nThe values in RowData will correspond to columns starting\nat start_column.", + "domains": { + "description": "The domain of data this is charting.\nOnly a single domain is supported.", "type": "array", "items": { - "$ref": "RowData" + "$ref": "BasicChartDomain" } }, - "startRow": { - "description": "The first row this GridData refers to, zero-based.", + "lineSmoothing": { + "description": "Gets whether all lines should be rendered smooth or straight by default.\nApplies to Line charts.", + "type": "boolean" + }, + "headerCount": { + "description": "The number of rows or columns in the data that are \"headers\".\nIf not set, Google Sheets will guess how many rows are headers based\non the data.\n\n(Note that BasicChartAxis.title may override the axis title\n inferred from the header values.)", "format": "int32", "type": "integer" }, - "columnMetadata": { + "stackedType": { + "description": "The stacked type for charts that support vertical stacking.\nApplies to Area, Bar, Column, Combo, and Stepped Area charts.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "Series are not stacked.", + "Series values are stacked, each value is rendered vertically beginning\nfrom the top of the value below it.", + "Vertical stacks are stretched to reach the top of the chart, with\nvalues laid out as percentages of each other." + ], + "enum": [ + "BASIC_CHART_STACKED_TYPE_UNSPECIFIED", + "NOT_STACKED", + "STACKED", + "PERCENT_STACKED" + ] + }, + "axis": { + "description": "The axis on the chart.", "type": "array", "items": { - "$ref": "DimensionProperties" - }, - "description": "Metadata about the requested columns in the grid, starting with the column\nin start_column." + "$ref": "BasicChartAxis" + } }, - "startColumn": { - "description": "The first column this GridData refers to, zero-based.", - "format": "int32", - "type": "integer" - } - }, - "id": "GridData" - }, - "UpdateNamedRangeRequest": { - "description": "Updates properties of the named range with the specified\nnamedRangeId.", - "type": "object", - "properties": { - "namedRange": { - "$ref": "NamedRange", - "description": "The named range to update with the new properties." + "threeDimensional": { + "description": "True to make the chart 3D.\nApplies to Bar and Column charts.", + "type": "boolean" }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `namedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" + "interpolateNulls": { + "type": "boolean", + "description": "If some values in a series are missing, gaps may appear in the chart (e.g,\nsegments of lines in a line chart will be missing). To eliminate these\ngaps set this to true.\nApplies to Line, Area, and Combo charts." + }, + "chartType": { + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "A \u003ca href=\"/chart/interactive/docs/gallery/barchart\"\u003ebar chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/linechart\"\u003eline chart\u003c/a\u003e.", + "An \u003ca href=\"/chart/interactive/docs/gallery/areachart\"\u003earea chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/columnchart\"\u003ecolumn chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/scatterchart\"\u003escatter\nchart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/combochart\"\u003ecombo chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/steppedareachart\"\u003estepped area\nchart\u003c/a\u003e." + ], + "enum": [ + "BASIC_CHART_TYPE_UNSPECIFIED", + "BAR", + "LINE", + "AREA", + "COLUMN", + "SCATTER", + "COMBO", + "STEPPED_AREA" + ], + "description": "The type of the chart." } }, - "id": "UpdateNamedRangeRequest" + "id": "BasicChartSpec", + "description": "The specification for a basic chart. See BasicChartType for the list\nof charts this supports." }, - "FindReplaceRequest": { - "description": "Finds and replaces data in cells over a range, sheet, or all sheets.", + "CellData": { + "description": "Data about a specific cell.", "type": "object", "properties": { - "range": { - "$ref": "GridRange", - "description": "The range to find/replace over." - }, - "sheetId": { - "description": "The sheet to find/replace over.", - "format": "int32", - "type": "integer" - }, - "allSheets": { - "description": "True to find/replace over all sheets.", - "type": "boolean" + "pivotTable": { + "description": "A pivot table anchored at this cell. The size of pivot table itself\nis computed dynamically based on its data, grouping, filters, values,\netc. Only the top-left cell of the pivot table contains the pivot table\ndefinition. The other cells will contain the calculated values of the\nresults of the pivot in their effective_value fields.", + "$ref": "PivotTable" }, - "matchCase": { - "type": "boolean", - "description": "True if the search is case sensitive." + "userEnteredFormat": { + "$ref": "CellFormat", + "description": "The format the user entered for the cell.\n\nWhen writing, the new format will be merged with the existing format." }, - "includeFormulas": { - "description": "True if the search should include cells with formulas.\nFalse to skip cells with formulas.", - "type": "boolean" + "note": { + "type": "string", + "description": "Any note on the cell." }, - "matchEntireCell": { - "description": "True if the find value should match the entire cell.", - "type": "boolean" + "effectiveFormat": { + "$ref": "CellFormat", + "description": "The effective format being used by the cell.\nThis includes the results of applying any conditional formatting and,\nif the cell contains a formula, the computed number format.\nIf the effective format is the default format, effective format will\nnot be written.\nThis field is read-only." }, - "searchByRegex": { - "description": "True if the find value is a regex.\nThe regular expression and replacement should follow Java regex rules\nat https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html.\nThe replacement string is allowed to refer to capturing groups.\nFor example, if one cell has the contents `\"Google Sheets\"` and another\nhas `\"Google Docs\"`, then searching for `\"o.* (.*)\"` with a replacement of\n`\"$1 Rocks\"` would change the contents of the cells to\n`\"GSheets Rocks\"` and `\"GDocs Rocks\"` respectively.", - "type": "boolean" + "userEnteredValue": { + "$ref": "ExtendedValue", + "description": "The value the user entered in the cell. e.g, `1234`, `'Hello'`, or `=NOW()`\nNote: Dates, Times and DateTimes are represented as doubles in\nserial number format." }, - "find": { - "description": "The value to search.", - "type": "string" + "dataValidation": { + "$ref": "DataValidationRule", + "description": "A data validation rule on the cell, if any.\n\nWhen writing, the new data validation rule will overwrite any prior rule." }, - "replacement": { - "description": "The value to use as the replacement.", - "type": "string" - } - }, - "id": "FindReplaceRequest" - }, - "UpdateCellsRequest": { - "description": "Updates all cells in a range with new data.", - "type": "object", - "properties": { - "range": { - "$ref": "GridRange", - "description": "The range to write data to.\n\nIf the data in rows does not cover the entire requested range,\nthe fields matching those set in fields will be cleared." + "effectiveValue": { + "$ref": "ExtendedValue", + "description": "The effective value of the cell. For cells with formulas, this is\nthe calculated value. For cells with literals, this is\nthe same as the user_entered_value.\nThis field is read-only." }, - "rows": { - "description": "The data to write.", + "formattedValue": { + "description": "The formatted value of the cell.\nThis is the value as it's shown to the user.\nThis field is read-only.", + "type": "string" + }, + "textFormatRuns": { + "description": "Runs of rich text applied to subsections of the cell. Runs are only valid\non user entered strings, not formulas, bools, or numbers.\nRuns start at specific indexes in the text and continue until the next\nrun. Properties of a run will continue unless explicitly changed\nin a subsequent run (and properties of the first run will continue\nthe properties of the cell unless explicitly changed).\n\nWhen writing, the new runs will overwrite any prior runs. When writing a\nnew user_entered_value, previous runs are erased.", "type": "array", "items": { - "$ref": "RowData" + "$ref": "TextFormatRun" } }, - "fields": { - "description": "The fields of CellData that should be updated.\nAt least one field must be specified.\nThe root is the CellData; 'row.values.' should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", + "hyperlink": { + "description": "A hyperlink this cell points to, if any.\nThis field is read-only. (To set it, use a `=HYPERLINK` formula\nin the userEnteredValue.formulaValue\nfield.)", "type": "string" - }, - "start": { - "$ref": "GridCoordinate", - "description": "The coordinate to start writing data at.\nAny number of rows and columns (including a different number of\ncolumns per row) may be written." - } - }, - "id": "UpdateCellsRequest" - }, - "RandomizeRangeRequest": { - "description": "Randomizes the order of the rows in a range.", - "type": "object", - "properties": { - "range": { - "description": "The range to randomize.", - "$ref": "GridRange" } }, - "id": "RandomizeRangeRequest" + "id": "CellData" }, - "DeleteRangeRequest": { - "id": "DeleteRangeRequest", - "description": "Deletes a range of cells, shifting other cells into the deleted area.", + "BatchUpdateValuesByDataFilterRequest": { + "description": "The request for updating more than one range of values in a spreadsheet.", "type": "object", "properties": { - "range": { - "$ref": "GridRange", - "description": "The range of cells to delete." - }, - "shiftDimension": { + "responseDateTimeRenderOption": { "type": "string", "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." + "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", + "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." ], "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" + "SERIAL_NUMBER", + "FORMATTED_STRING" ], - "description": "The dimension from which deleted cells will be replaced with.\nIf ROWS, existing cells will be shifted upward to\nreplace the deleted cells. If COLUMNS, existing cells\nwill be shifted left to replace the deleted cells." - } - } - }, - "DeleteDuplicatesResponse": { - "id": "DeleteDuplicatesResponse", - "description": "The result of removing duplicates in a range.", - "type": "object", - "properties": { - "duplicatesRemovedCount": { - "description": "The number of duplicate rows removed.", - "format": "int32", - "type": "integer" - } - } - }, - "UnmergeCellsRequest": { - "description": "Unmerges cells in the given range.", - "type": "object", - "properties": { - "range": { - "$ref": "GridRange", - "description": "The range within which all cells should be unmerged.\nIf the range spans multiple merges, all will be unmerged.\nThe range must not partially span any merge." - } - }, - "id": "UnmergeCellsRequest" - }, - "SortSpec": { - "type": "object", - "properties": { - "foregroundColor": { - "description": "The text color to sort by. Mutually exclusive with sorting by background\nfill color. Requests to set this field will fail with a 400 error if\nbackground color is also set.", - "$ref": "Color" - }, - "dimensionIndex": { - "description": "The dimension the sort should be applied to.", - "format": "int32", - "type": "integer" - }, - "backgroundColor": { - "$ref": "Color", - "description": "The background fill color to sort by. Mutually exclusive with sorting by\ntext color. Requests to set this field will fail with a 400 error if\nforeground color is also set." + "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER." }, - "sortOrder": { + "responseValueRenderOption": { "enumDescriptions": [ - "Default value, do not use this.", - "Sort ascending.", - "Sort descending." + "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", + "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", + "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." ], "enum": [ - "SORT_ORDER_UNSPECIFIED", - "ASCENDING", - "DESCENDING" + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" ], - "description": "The order data should be sorted.", + "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", "type": "string" - } - }, - "id": "SortSpec", - "description": "A sort order associated with a specific column or row." - }, - "UpdateEmbeddedObjectPositionResponse": { - "description": "The result of updating an embedded object's position.", - "type": "object", - "properties": { - "position": { - "description": "The new position of the embedded object.", - "$ref": "EmbeddedObjectPosition" - } - }, - "id": "UpdateEmbeddedObjectPositionResponse" - }, - "BooleanRule": { - "description": "A rule that may or may not match, depending on the condition.", - "type": "object", - "properties": { - "format": { - "$ref": "CellFormat", - "description": "The format to apply.\nConditional formatting can only apply a subset of formatting:\nbold, italic,\nstrikethrough,\nforeground color &\nbackground color." }, - "condition": { - "description": "The condition of the rule. If the condition evaluates to true,\nthe format is applied.", - "$ref": "BooleanCondition" - } - }, - "id": "BooleanRule" - }, - "WaterfallChartSpec": { - "description": "A waterfall chart.", - "type": "object", - "properties": { - "firstValueIsTotal": { - "description": "True to interpret the first value as a total.", + "includeValuesInResponse": { + "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values. The `updatedData` field within\neach of the BatchUpdateValuesResponse.responses will contain\nthe updated values. If the range to write was larger than than the range\nactually written, the response will include all values in the requested\nrange (excluding trailing empty rows and columns).", "type": "boolean" }, - "stackedType": { + "valueInputOption": { "enum": [ - "WATERFALL_STACKED_TYPE_UNSPECIFIED", - "STACKED", - "SEQUENTIAL" + "INPUT_VALUE_OPTION_UNSPECIFIED", + "RAW", + "USER_ENTERED" ], - "description": "The stacked type.", + "description": "How the input data should be interpreted.", "type": "string", "enumDescriptions": [ - "Default value, do not use.", - "Values corresponding to the same domain (horizontal axis) value will be\nstacked vertically.", - "Series will spread out along the horizontal axis." + "Default input value. This value must not be used.", + "The values the user has entered will not be parsed and will be stored\nas-is.", + "The values will be parsed as if the user typed them into the UI.\nNumbers will stay as numbers, but strings may be converted to numbers,\ndates, etc. following the same rules that are applied when entering\ntext into a cell via the Google Sheets UI." ] }, - "hideConnectorLines": { - "description": "True to hide connector lines between columns.", - "type": "boolean" - }, - "series": { - "description": "The data this waterfall chart is visualizing.", + "data": { + "description": "The new values to apply to the spreadsheet. If more than one range is\nmatched by the specified DataFilter the specified values will be\napplied to all of those ranges.", "type": "array", "items": { - "$ref": "WaterfallChartSeries" + "$ref": "DataFilterValueRange" } - }, - "connectorLineStyle": { - "$ref": "LineStyle", - "description": "The line style for the connector lines." - }, - "domain": { - "description": "The domain data (horizontal axis) for the waterfall chart.", - "$ref": "WaterfallChartDomain" } }, - "id": "WaterfallChartSpec" + "id": "BatchUpdateValuesByDataFilterRequest" }, - "UpdateConditionalFormatRuleRequest": { - "description": "Updates a conditional format rule at the given index,\nor moves a conditional format rule to another index.", + "UpdateDimensionGroupRequest": { "type": "object", "properties": { - "rule": { - "description": "The rule that should replace the rule at the given index.", - "$ref": "ConditionalFormatRule" - }, - "index": { - "description": "The zero-based index of the rule that should be replaced or moved.", - "format": "int32", - "type": "integer" - }, - "sheetId": { - "description": "The sheet of the rule to move. Required if new_index is set,\nunused otherwise.", - "format": "int32", - "type": "integer" + "dimensionGroup": { + "$ref": "DimensionGroup", + "description": "The group whose state should be updated. The range and depth of the group\nshould specify a valid group on the sheet, and all other fields updated." }, - "newIndex": { - "description": "The zero-based new index the rule should end up at.", - "format": "int32", - "type": "integer" + "fields": { + "type": "string", + "description": "The fields that should be updated. At least one field must be specified.\nThe root `dimensionGroup` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask" } }, - "id": "UpdateConditionalFormatRuleRequest" + "id": "UpdateDimensionGroupRequest", + "description": "Updates the state of the specified group." }, - "BasicChartDomain": { - "description": "The domain of a chart.\nFor example, if charting stock prices over time, this would be the date.", + "DeleteDeveloperMetadataResponse": { "type": "object", "properties": { - "domain": { - "$ref": "ChartData", - "description": "The data of the domain. For example, if charting stock prices over time,\nthis is the data representing the dates." - }, - "reversed": { - "description": "True to reverse the order of the domain values (horizontal axis).", - "type": "boolean" + "deletedDeveloperMetadata": { + "description": "The metadata that was deleted.", + "type": "array", + "items": { + "$ref": "DeveloperMetadata" + } } }, - "id": "BasicChartDomain" + "id": "DeleteDeveloperMetadataResponse", + "description": "The response from deleting developer metadata." }, - "PasteDataRequest": { + "SortRangeRequest": { "type": "object", "properties": { - "type": { - "enumDescriptions": [ - "Paste values, formulas, formats, and merges.", - "Paste the values ONLY without formats, formulas, or merges.", - "Paste the format and data validation only.", - "Like PASTE_NORMAL but without borders.", - "Paste the formulas only.", - "Paste the data validation only.", - "Paste the conditional formatting rules only." - ], - "enum": [ - "PASTE_NORMAL", - "PASTE_VALUES", - "PASTE_FORMAT", - "PASTE_NO_BORDERS", - "PASTE_FORMULA", - "PASTE_DATA_VALIDATION", - "PASTE_CONDITIONAL_FORMATTING" - ], - "description": "How the data should be pasted.", - "type": "string" - }, - "html": { - "description": "True if the data is HTML.", - "type": "boolean" - }, - "coordinate": { - "$ref": "GridCoordinate", - "description": "The coordinate at which the data should start being inserted." - }, - "data": { - "description": "The data to insert.", - "type": "string" + "range": { + "$ref": "GridRange", + "description": "The range to sort." }, - "delimiter": { - "description": "The delimiter in the data.", - "type": "string" + "sortSpecs": { + "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications.", + "type": "array", + "items": { + "$ref": "SortSpec" + } } }, - "id": "PasteDataRequest", - "description": "Inserts data into the spreadsheet starting at the specified coordinate." + "id": "SortRangeRequest", + "description": "Sorts data in rows based on a sort order per column." }, - "UpdateDeveloperMetadataResponse": { - "description": "The response from updating developer metadata.", + "MatchedDeveloperMetadata": { "type": "object", "properties": { - "developerMetadata": { - "description": "The updated developer metadata.", + "dataFilters": { + "description": "All filters matching the returned developer metadata.", "type": "array", "items": { - "$ref": "DeveloperMetadata" + "$ref": "DataFilter" } + }, + "developerMetadata": { + "$ref": "DeveloperMetadata", + "description": "The developer metadata matching the specified filters." } }, - "id": "UpdateDeveloperMetadataResponse" + "id": "MatchedDeveloperMetadata", + "description": "A developer metadata entry and the data filters specified in the original\nrequest that matched it." }, - "AppendDimensionRequest": { - "description": "Appends rows or columns to the end of a sheet.", + "MergeCellsRequest": { "type": "object", "properties": { - "dimension": { - "type": "string", + "range": { + "description": "The range of cells to merge.", + "$ref": "GridRange" + }, + "mergeType": { "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." + "Create a single merge from the range", + "Create a merge for each column in the range", + "Create a merge for each row in the range" ], "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" + "MERGE_ALL", + "MERGE_COLUMNS", + "MERGE_ROWS" ], - "description": "Whether rows or columns should be appended." - }, - "length": { - "description": "The number of rows or columns to append.", - "format": "int32", - "type": "integer" - }, - "sheetId": { - "type": "integer", - "description": "The sheet to append rows or columns to.", - "format": "int32" - } - }, - "id": "AppendDimensionRequest" - }, - "AddNamedRangeRequest": { - "description": "Adds a named range to the spreadsheet.", - "type": "object", - "properties": { - "namedRange": { - "description": "The named range to add. The namedRangeId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a range that already exists.)", - "$ref": "NamedRange" + "description": "How the cells should be merged.", + "type": "string" } }, - "id": "AddNamedRangeRequest" + "id": "MergeCellsRequest", + "description": "Merges all cells in the range." }, - "CreateDeveloperMetadataResponse": { + "AddProtectedRangeRequest": { + "description": "Adds a new protected range.", "type": "object", "properties": { - "developerMetadata": { - "$ref": "DeveloperMetadata", - "description": "The developer metadata that was created." + "protectedRange": { + "$ref": "ProtectedRange", + "description": "The protected range to be added. The\nprotectedRangeId field is optional; if\none is not set, an id will be randomly generated. (It is an error to\nspecify the ID of a range that already exists.)" } }, - "id": "CreateDeveloperMetadataResponse", - "description": "The response from creating developer metadata." + "id": "AddProtectedRangeRequest" }, - "UpdateEmbeddedObjectPositionRequest": { - "description": "Update an embedded object's position (such as a moving or resizing a\nchart or image).", + "DuplicateFilterViewResponse": { + "description": "The result of a filter view being duplicated.", "type": "object", "properties": { - "fields": { - "description": "The fields of OverlayPosition\nthat should be updated when setting a new position. Used only if\nnewPosition.overlayPosition\nis set, in which case at least one field must\nbe specified. The root `newPosition.overlayPosition` is implied and\nshould not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" - }, - "objectId": { - "type": "integer", - "description": "The ID of the object to moved.", - "format": "int32" - }, - "newPosition": { - "$ref": "EmbeddedObjectPosition", - "description": "An explicit position to move the embedded object to.\nIf newPosition.sheetId is set,\na new sheet with that ID will be created.\nIf newPosition.newSheet is set to true,\na new sheet will be created with an ID that will be chosen for you." + "filter": { + "description": "The newly created filter.", + "$ref": "FilterView" } }, - "id": "UpdateEmbeddedObjectPositionRequest" + "id": "DuplicateFilterViewResponse" }, - "WaterfallChartColumnStyle": { - "description": "Styles for a waterfall chart column.", + "DuplicateSheetResponse": { + "description": "The result of duplicating a sheet.", "type": "object", "properties": { - "label": { - "description": "The label of the column's legend.", - "type": "string" - }, - "color": { - "$ref": "Color", - "description": "The color of the column." + "properties": { + "$ref": "SheetProperties", + "description": "The properties of the duplicate sheet." } }, - "id": "WaterfallChartColumnStyle" + "id": "DuplicateSheetResponse" }, - "Request": { - "id": "Request", - "description": "A single kind of update to apply to a spreadsheet.", + "BatchUpdateSpreadsheetResponse": { + "id": "BatchUpdateSpreadsheetResponse", + "description": "The reply for batch updating a spreadsheet.", "type": "object", - "properties": { - "deleteEmbeddedObject": { - "$ref": "DeleteEmbeddedObjectRequest", - "description": "Deletes an embedded object (e.g, chart, image) in a sheet." - }, - "updateFilterView": { - "$ref": "UpdateFilterViewRequest", - "description": "Updates the properties of a filter view." - }, - "addBanding": { - "description": "Adds a new banded range", - "$ref": "AddBandingRequest" - }, - "appendCells": { - "$ref": "AppendCellsRequest", - "description": "Appends cells after the last row with data in a sheet." - }, - "autoResizeDimensions": { - "description": "Automatically resizes one or more dimensions based on the contents\nof the cells in that dimension.", - "$ref": "AutoResizeDimensionsRequest" - }, - "cutPaste": { - "$ref": "CutPasteRequest", - "description": "Cuts data from one area and pastes it to another." - }, - "mergeCells": { - "$ref": "MergeCellsRequest", - "description": "Merges cells together." - }, - "updateNamedRange": { - "description": "Updates a named range.", - "$ref": "UpdateNamedRangeRequest" - }, - "updateSheetProperties": { - "$ref": "UpdateSheetPropertiesRequest", - "description": "Updates a sheet's properties." - }, - "deleteDimension": { - "$ref": "DeleteDimensionRequest", - "description": "Deletes rows or columns in a sheet." - }, - "autoFill": { - "description": "Automatically fills in more data based on existing data.", - "$ref": "AutoFillRequest" - }, - "addSlicer": { - "$ref": "AddSlicerRequest", - "description": "Adds a slicer." - }, - "sortRange": { - "$ref": "SortRangeRequest", - "description": "Sorts data in a range." - }, - "deleteDimensionGroup": { - "$ref": "DeleteDimensionGroupRequest", - "description": "Deletes a group over the specified range." - }, - "deleteProtectedRange": { - "$ref": "DeleteProtectedRangeRequest", - "description": "Deletes a protected range." - }, - "duplicateFilterView": { - "$ref": "DuplicateFilterViewRequest", - "description": "Duplicates a filter view." - }, - "addChart": { - "$ref": "AddChartRequest", - "description": "Adds a chart." - }, - "findReplace": { - "description": "Finds and replaces occurrences of some text with other text.", - "$ref": "FindReplaceRequest" - }, - "updateChartSpec": { - "$ref": "UpdateChartSpecRequest", - "description": "Updates a chart's specifications." - }, - "textToColumns": { - "$ref": "TextToColumnsRequest", - "description": "Converts a column of text into many columns of text." - }, - "updateProtectedRange": { - "$ref": "UpdateProtectedRangeRequest", - "description": "Updates a protected range." - }, - "addSheet": { - "description": "Adds a sheet.", - "$ref": "AddSheetRequest" - }, - "copyPaste": { - "description": "Copies data from one area and pastes it to another.", - "$ref": "CopyPasteRequest" - }, - "deleteFilterView": { - "description": "Deletes a filter view from a sheet.", - "$ref": "DeleteFilterViewRequest" - }, - "insertDimension": { - "$ref": "InsertDimensionRequest", - "description": "Inserts new rows or columns in a sheet." - }, - "deleteRange": { - "$ref": "DeleteRangeRequest", - "description": "Deletes a range of cells from a sheet, shifting the remaining cells." - }, - "deleteBanding": { - "$ref": "DeleteBandingRequest", - "description": "Removes a banded range" - }, - "addFilterView": { - "$ref": "AddFilterViewRequest", - "description": "Adds a filter view." - }, - "deleteDuplicates": { - "$ref": "DeleteDuplicatesRequest", - "description": "Removes rows containing duplicate values in specified columns of a cell\nrange." - }, - "setDataValidation": { - "$ref": "SetDataValidationRequest", - "description": "Sets data validation for one or more cells." - }, - "updateBorders": { - "$ref": "UpdateBordersRequest", - "description": "Updates the borders in a range of cells." - }, - "deleteConditionalFormatRule": { - "$ref": "DeleteConditionalFormatRuleRequest", - "description": "Deletes an existing conditional format rule." - }, - "repeatCell": { - "$ref": "RepeatCellRequest", - "description": "Repeats a single cell across a range." - }, - "clearBasicFilter": { - "$ref": "ClearBasicFilterRequest", - "description": "Clears the basic filter on a sheet." - }, - "appendDimension": { - "$ref": "AppendDimensionRequest", - "description": "Appends dimensions to the end of a sheet." - }, - "updateSlicerSpec": { - "$ref": "UpdateSlicerSpecRequest", - "description": "Updates a slicer's specifications." - }, - "createDeveloperMetadata": { - "$ref": "CreateDeveloperMetadataRequest", - "description": "Creates new developer metadata" - }, - "updateConditionalFormatRule": { - "$ref": "UpdateConditionalFormatRuleRequest", - "description": "Updates an existing conditional format rule." - }, - "insertRange": { - "$ref": "InsertRangeRequest", - "description": "Inserts new cells in a sheet, shifting the existing cells." - }, - "moveDimension": { - "description": "Moves rows or columns to another location in a sheet.", - "$ref": "MoveDimensionRequest" - }, - "deleteDeveloperMetadata": { - "$ref": "DeleteDeveloperMetadataRequest", - "description": "Deletes developer metadata" - }, - "randomizeRange": { - "$ref": "RandomizeRangeRequest", - "description": "Randomizes the order of the rows in a range." - }, - "updateBanding": { - "$ref": "UpdateBandingRequest", - "description": "Updates a banded range" - }, - "addProtectedRange": { - "$ref": "AddProtectedRangeRequest", - "description": "Adds a protected range." - }, - "deleteNamedRange": { - "$ref": "DeleteNamedRangeRequest", - "description": "Deletes a named range." + "properties": { + "replies": { + "description": "The reply of the updates. This maps 1:1 with the updates, although\nreplies to some requests may be empty.", + "type": "array", + "items": { + "$ref": "Response" + } }, - "duplicateSheet": { - "$ref": "DuplicateSheetRequest", - "description": "Duplicates a sheet." + "updatedSpreadsheet": { + "$ref": "Spreadsheet", + "description": "The spreadsheet after updates were applied. This is only set if\n[BatchUpdateSpreadsheetRequest.include_spreadsheet_in_response] is `true`." }, - "deleteSheet": { - "$ref": "DeleteSheetRequest", - "description": "Deletes a sheet." + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", + "type": "string" + } + } + }, + "AddFilterViewRequest": { + "type": "object", + "properties": { + "filter": { + "$ref": "FilterView", + "description": "The filter to add. The filterViewId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a filter that already exists.)" + } + }, + "id": "AddFilterViewRequest", + "description": "Adds a filter view." + }, + "DataFilterValueRange": { + "description": "A range of values whose location is specified by a DataFilter.", + "type": "object", + "properties": { + "dataFilter": { + "$ref": "DataFilter", + "description": "The data filter describing the location of the values in the spreadsheet." }, - "unmergeCells": { - "$ref": "UnmergeCellsRequest", - "description": "Unmerges merged cells." + "majorDimension": { + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The major dimension of the values.", + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ] }, - "updateEmbeddedObjectPosition": { - "$ref": "UpdateEmbeddedObjectPositionRequest", - "description": "Updates an embedded object's (e.g. chart, image) position." + "values": { + "description": "The data to be written. If the provided values exceed any of the ranges\nmatched by the data filter then the request will fail. If the provided\nvalues are less than the matched ranges only the specified values will be\nwritten, existing values in the matched ranges will remain unaffected.", + "type": "array", + "items": { + "type": "array", + "items": { + "type": "any" + } + } + } + }, + "id": "DataFilterValueRange" + }, + "NumberFormat": { + "description": "The number format of a cell.", + "type": "object", + "properties": { + "type": { + "enum": [ + "NUMBER_FORMAT_TYPE_UNSPECIFIED", + "TEXT", + "NUMBER", + "PERCENT", + "CURRENCY", + "DATE", + "TIME", + "DATE_TIME", + "SCIENTIFIC" + ], + "description": "The type of the number format.\nWhen writing, this field must be set.", + "type": "string", + "enumDescriptions": [ + "The number format is not specified\nand is based on the contents of the cell.\nDo not explicitly use this.", + "Text formatting, e.g `1000.12`", + "Number formatting, e.g, `1,000.12`", + "Percent formatting, e.g `10.12%`", + "Currency formatting, e.g `$1,000.12`", + "Date formatting, e.g `9/26/2008`", + "Time formatting, e.g `3:59:00 PM`", + "Date+Time formatting, e.g `9/26/08 15:59:00`", + "Scientific number formatting, e.g `1.01E+03`" + ] }, - "addDimensionGroup": { - "$ref": "AddDimensionGroupRequest", - "description": "Creates a group over the specified range." + "pattern": { + "type": "string", + "description": "Pattern string used for formatting. If not set, a default pattern based on\nthe user's locale will be used if necessary for the given type.\nSee the [Date and Number Formats guide](/sheets/api/guides/formats) for\nmore information about the supported patterns." + } + }, + "id": "NumberFormat" + }, + "OrgChartSpec": { + "type": "object", + "properties": { + "nodeColor": { + "$ref": "Color", + "description": "The color of the org chart nodes." }, - "updateDimensionProperties": { - "$ref": "UpdateDimensionPropertiesRequest", - "description": "Updates dimensions' properties." + "tooltips": { + "description": "The data containing the tooltip for the corresponding node. A blank value\nresults in no tooltip being displayed for the node.\nThis field is optional.", + "$ref": "ChartData" }, - "updateDeveloperMetadata": { - "description": "Updates an existing developer metadata entry", - "$ref": "UpdateDeveloperMetadataRequest" + "selectedNodeColor": { + "$ref": "Color", + "description": "The color of the selected org chart nodes." }, - "updateDimensionGroup": { - "$ref": "UpdateDimensionGroupRequest", - "description": "Updates the state of the specified group." + "parentLabels": { + "$ref": "ChartData", + "description": "The data containing the label of the parent for the corresponding node.\nA blank value indicates that the node has no parent and is a top-level\nnode.\nThis field is optional." }, - "pasteData": { - "$ref": "PasteDataRequest", - "description": "Pastes data (HTML or delimited) into a sheet." + "nodeSize": { + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "The small org chart node size.", + "The medium org chart node size.", + "The large org chart node size." + ], + "enum": [ + "ORG_CHART_LABEL_SIZE_UNSPECIFIED", + "SMALL", + "MEDIUM", + "LARGE" + ], + "description": "The size of the org chart nodes." }, - "setBasicFilter": { - "$ref": "SetBasicFilterRequest", - "description": "Sets the basic filter on a sheet." + "labels": { + "$ref": "ChartData", + "description": "The data containing the labels for all the nodes in the chart. Labels\nmust be unique." + } + }, + "id": "OrgChartSpec", + "description": "An \u003ca href=\"/chart/interactive/docs/gallery/orgchart\"\u003eorg chart\u003c/a\u003e.\nOrg charts require a unique set of labels in labels and may\noptionally include parent_labels and tooltips.\nparent_labels contain, for each node, the label identifying the parent\nnode. tooltips contain, for each node, an optional tooltip.\n\nFor example, to describe an OrgChart with Alice as the CEO, Bob as the\nPresident (reporting to Alice) and Cathy as VP of Sales (also reporting to\nAlice), have labels contain \"Alice\", \"Bob\", \"Cathy\",\nparent_labels contain \"\", \"Alice\", \"Alice\" and tooltips contain\n\"CEO\", \"President\", \"VP Sales\"." + }, + "FilterView": { + "id": "FilterView", + "description": "A filter view.", + "type": "object", + "properties": { + "filterViewId": { + "type": "integer", + "description": "The ID of the filter view.", + "format": "int32" }, - "addConditionalFormatRule": { - "description": "Adds a new conditional format rule.", - "$ref": "AddConditionalFormatRuleRequest" + "criteria": { + "type": "object", + "additionalProperties": { + "$ref": "FilterCriteria" + }, + "description": "The criteria for showing/hiding values per column.\nThe map's key is the column index, and the value is the criteria for\nthat column." }, - "updateCells": { - "description": "Updates many cells at once.", - "$ref": "UpdateCellsRequest" + "title": { + "description": "The name of the filter view.", + "type": "string" }, - "addNamedRange": { - "description": "Adds a named range.", - "$ref": "AddNamedRangeRequest" + "range": { + "$ref": "GridRange", + "description": "The range this filter view covers.\n\nWhen writing, only one of range or named_range_id\nmay be set." }, - "updateSpreadsheetProperties": { - "$ref": "UpdateSpreadsheetPropertiesRequest", - "description": "Updates the spreadsheet's properties." + "sortSpecs": { + "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications.", + "type": "array", + "items": { + "$ref": "SortSpec" + } }, - "trimWhitespace": { - "$ref": "TrimWhitespaceRequest", - "description": "Trims cells of whitespace (such as spaces, tabs, or new lines)." + "namedRangeId": { + "type": "string", + "description": "The named range this filter view is backed by, if any.\n\nWhen writing, only one of range or named_range_id\nmay be set." } } }, - "GridRange": { - "id": "GridRange", - "description": "A range on a sheet.\nAll indexes are zero-based.\nIndexes are half open, e.g the start index is inclusive\nand the end index is exclusive -- [start_index, end_index).\nMissing indexes indicate the range is unbounded on that side.\n\nFor example, if `\"Sheet1\"` is sheet ID 0, then:\n\n `Sheet1!A1:A1 == sheet_id: 0,\n start_row_index: 0, end_row_index: 1,\n start_column_index: 0, end_column_index: 1`\n\n `Sheet1!A3:B4 == sheet_id: 0,\n start_row_index: 2, end_row_index: 4,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1!A:B == sheet_id: 0,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1!A5:B == sheet_id: 0,\n start_row_index: 4,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1 == sheet_id:0`\n\nThe start index must always be less than or equal to the end index.\nIf the start index equals the end index, then the range is empty.\nEmpty ranges are typically not meaningful and are usually rendered in the\nUI as `#REF!`.", + "Slicer": { + "description": "A slicer in a sheet.", "type": "object", "properties": { - "startRowIndex": { - "description": "The start row (inclusive) of the range, or not set if unbounded.", - "format": "int32", - "type": "integer" - }, - "startColumnIndex": { - "description": "The start column (inclusive) of the range, or not set if unbounded.", - "format": "int32", - "type": "integer" + "position": { + "description": "The position of the slicer. Note that slicer can be positioned only on\nexisting sheet. Also, width and height of slicer can be automatically\nadjusted to keep it within permitted limits.", + "$ref": "EmbeddedObjectPosition" }, - "sheetId": { - "type": "integer", - "description": "The sheet this range is on.", - "format": "int32" + "spec": { + "$ref": "SlicerSpec", + "description": "The specification of the slicer." }, - "endRowIndex": { + "slicerId": { "type": "integer", - "description": "The end row (exclusive) of the range, or not set if unbounded.", + "description": "The ID of the slicer.", "format": "int32" - }, - "endColumnIndex": { - "description": "The end column (exclusive) of the range, or not set if unbounded.", - "format": "int32", - "type": "integer" } - } + }, + "id": "Slicer" }, - "WaterfallChartDomain": { - "id": "WaterfallChartDomain", - "description": "The domain of a waterfall chart.", + "SearchDeveloperMetadataRequest": { + "description": "A request to retrieve all developer metadata matching the set of specified\ncriteria.", "type": "object", "properties": { - "reversed": { - "description": "True to reverse the order of the domain values (horizontal axis).", - "type": "boolean" + "dataFilters": { + "description": "The data filters describing the criteria used to determine which\nDeveloperMetadata entries to return. DeveloperMetadata matching any of the\nspecified filters will be included in the response.", + "type": "array", + "items": { + "$ref": "DataFilter" + } + } + }, + "id": "SearchDeveloperMetadataRequest" + }, + "BandingProperties": { + "type": "object", + "properties": { + "headerColor": { + "description": "The color of the first row or column. If this field is set, the first\nrow or column will be filled with this color and the colors will\nalternate between first_band_color and second_band_color starting\nfrom the second row or column. Otherwise, the first row or column will be\nfilled with first_band_color and the colors will proceed to alternate\nas they normally would.", + "$ref": "Color" }, - "data": { - "$ref": "ChartData", - "description": "The data of the WaterfallChartDomain." + "firstBandColor": { + "description": "The first color that is alternating. (Required)", + "$ref": "Color" + }, + "secondBandColor": { + "$ref": "Color", + "description": "The second color that is alternating. (Required)" + }, + "footerColor": { + "description": "The color of the last row or column. If this field is not set, the last\nrow or column will be filled with either first_band_color or\nsecond_band_color, depending on the color of the previous row or\ncolumn.", + "$ref": "Color" } - } + }, + "id": "BandingProperties", + "description": "Properties referring a single dimension (either row or column). If both\nBandedRange.row_properties and BandedRange.column_properties are\nset, the fill colors are applied to cells according to the following rules:\n\n* header_color and footer_color take priority over band colors.\n* first_band_color takes priority over second_band_color.\n* row_properties takes priority over column_properties.\n\nFor example, the first row color takes priority over the first column\ncolor, but the first column color takes priority over the second row color.\nSimilarly, the row header takes priority over the column header in the\ntop left cell, but the column header takes priority over the first row\ncolor if the row header is not set." }, - "DeleteDimensionGroupRequest": { + "BasicFilter": { + "id": "BasicFilter", + "description": "The default filter associated with a sheet.", "type": "object", "properties": { "range": { - "$ref": "DimensionRange", - "description": "The range of the group to be deleted." + "description": "The range the filter covers.", + "$ref": "GridRange" + }, + "criteria": { + "additionalProperties": { + "$ref": "FilterCriteria" + }, + "description": "The criteria for showing/hiding values per column.\nThe map's key is the column index, and the value is the criteria for\nthat column.", + "type": "object" + }, + "sortSpecs": { + "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications.", + "type": "array", + "items": { + "$ref": "SortSpec" + } } - }, - "id": "DeleteDimensionGroupRequest", - "description": "Deletes a group over the specified range by decrementing the depth of the\ndimensions in the range.\n\nFor example, assume the sheet has a depth-1 group over B:E and a depth-2\ngroup over C:D. Deleting a group over D:E leaves the sheet with a\ndepth-1 group over B:D and a depth-2 group over C:C." + } }, - "SetDataValidationRequest": { + "AddProtectedRangeResponse": { + "description": "The result of adding a new protected range.", "type": "object", "properties": { - "rule": { - "$ref": "DataValidationRule", - "description": "The data validation rule to set on each cell in the range,\nor empty to clear the data validation in the range." - }, - "range": { - "description": "The range the data validation rule should apply to.", - "$ref": "GridRange" + "protectedRange": { + "$ref": "ProtectedRange", + "description": "The newly added protected range." } }, - "id": "SetDataValidationRequest", - "description": "Sets a data validation rule to every cell in the range.\nTo clear validation in a range, call this with no rule specified." + "id": "AddProtectedRangeResponse" }, - "BubbleChartSpec": { - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/bubblechart\"\u003ebubble chart\u003c/a\u003e.", + "PivotValue": { + "description": "The definition of how a value in a pivot table should be calculated.", "type": "object", "properties": { - "bubbleOpacity": { - "description": "The opacity of the bubbles between 0 and 1.0.\n0 is fully transparent and 1 is fully opaque.", - "format": "float", - "type": "number" - }, - "bubbleSizes": { - "description": "The data contianing the bubble sizes. Bubble sizes are used to draw\nthe bubbles at different sizes relative to each other.\nIf specified, group_ids must also be specified. This field is\noptional.", - "$ref": "ChartData" - }, - "domain": { - "$ref": "ChartData", - "description": "The data containing the bubble x-values. These values locate the bubbles\nin the chart horizontally." - }, - "bubbleBorderColor": { - "$ref": "Color", - "description": "The bubble border color." - }, - "bubbleTextStyle": { - "description": "The format of the text inside the bubbles.\nUnderline and Strikethrough are not supported.", - "$ref": "TextFormat" - }, - "groupIds": { - "$ref": "ChartData", - "description": "The data containing the bubble group IDs. All bubbles with the same group\nID are drawn in the same color. If bubble_sizes is specified then\nthis field must also be specified but may contain blank values.\nThis field is optional." - }, - "bubbleLabels": { - "$ref": "ChartData", - "description": "The data containing the bubble labels. These do not need to be unique." - }, - "bubbleMinRadiusSize": { - "description": "The minimum radius size of the bubbles, in pixels.\nIf specific, the field must be a positive value.", - "format": "int32", - "type": "integer" - }, - "bubbleMaxRadiusSize": { - "type": "integer", - "description": "The max radius size of the bubbles, in pixels.\nIf specified, the field must be a positive value.", - "format": "int32" - }, - "series": { - "$ref": "ChartData", - "description": "The data contianing the bubble y-values. These values locate the bubbles\nin the chart vertically." + "formula": { + "type": "string", + "description": "A custom formula to calculate the value. The formula must start\nwith an `=` character." }, - "legendPosition": { + "calculatedDisplayType": { "enumDescriptions": [ "Default value, do not use.", - "The legend is rendered on the bottom of the chart.", - "The legend is rendered on the left of the chart.", - "The legend is rendered on the right of the chart.", - "The legend is rendered on the top of the chart.", - "No legend is rendered.", - "The legend is rendered inside the chart area." + "Shows the pivot values as percentage of the row total values.", + "Shows the pivot values as percentage of the column total values.", + "Shows the pivot values as percentage of the grand total values." ], "enum": [ - "BUBBLE_CHART_LEGEND_POSITION_UNSPECIFIED", - "BOTTOM_LEGEND", - "LEFT_LEGEND", - "RIGHT_LEGEND", - "TOP_LEGEND", - "NO_LEGEND", - "INSIDE_LEGEND" + "PIVOT_VALUE_CALCULATED_DISPLAY_TYPE_UNSPECIFIED", + "PERCENT_OF_ROW_TOTAL", + "PERCENT_OF_COLUMN_TOTAL", + "PERCENT_OF_GRAND_TOTAL" ], - "description": "Where the legend of the chart should be drawn.", + "description": "If specified, indicates that pivot values should be displayed as\nthe result of a calculation with another pivot value. For example, if\ncalculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the\npivot values are displayed as the percentage of the grand total. In\nthe Sheets UI, this is referred to as \"Show As\" in the value section of a\npivot table.", + "type": "string" + }, + "summarizeFunction": { + "type": "string", + "enumDescriptions": [ + "The default, do not use.", + "Corresponds to the `SUM` function.", + "Corresponds to the `COUNTA` function.", + "Corresponds to the `COUNT` function.", + "Corresponds to the `COUNTUNIQUE` function.", + "Corresponds to the `AVERAGE` function.", + "Corresponds to the `MAX` function.", + "Corresponds to the `MIN` function.", + "Corresponds to the `MEDIAN` function.", + "Corresponds to the `PRODUCT` function.", + "Corresponds to the `STDEV` function.", + "Corresponds to the `STDEVP` function.", + "Corresponds to the `VAR` function.", + "Corresponds to the `VARP` function.", + "Indicates the formula should be used as-is.\nOnly valid if PivotValue.formula was set." + ], + "enum": [ + "PIVOT_STANDARD_VALUE_FUNCTION_UNSPECIFIED", + "SUM", + "COUNTA", + "COUNT", + "COUNTUNIQUE", + "AVERAGE", + "MAX", + "MIN", + "MEDIAN", + "PRODUCT", + "STDEV", + "STDEVP", + "VAR", + "VARP", + "CUSTOM" + ], + "description": "A function to summarize the value.\nIf formula is set, the only supported values are\nSUM and\nCUSTOM.\nIf sourceColumnOffset is set, then `CUSTOM`\nis not supported." + }, + "sourceColumnOffset": { + "description": "The column offset of the source range that this value reads from.\n\nFor example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`\nmeans this value refers to column `C`, whereas the offset `1` would\nrefer to column `D`.", + "format": "int32", + "type": "integer" + }, + "name": { + "description": "A name to use for the value.", "type": "string" } }, - "id": "BubbleChartSpec" + "id": "PivotValue" }, - "TextPosition": { + "ErrorValue": { + "id": "ErrorValue", + "description": "An error in a cell.", "type": "object", "properties": { - "horizontalAlignment": { + "message": { + "description": "A message with more information about the error\n(in the spreadsheet's locale).", + "type": "string" + }, + "type": { + "description": "The type of error.", "type": "string", "enumDescriptions": [ - "The horizontal alignment is not specified. Do not use this.", - "The text is explicitly aligned to the left of the cell.", - "The text is explicitly aligned to the center of the cell.", - "The text is explicitly aligned to the right of the cell." + "The default error type, do not use this.", + "Corresponds to the `#ERROR!` error.", + "Corresponds to the `#NULL!` error.", + "Corresponds to the `#DIV/0` error.", + "Corresponds to the `#VALUE!` error.", + "Corresponds to the `#REF!` error.", + "Corresponds to the `#NAME?` error.", + "Corresponds to the `#NUM`! error.", + "Corresponds to the `#N/A` error.", + "Corresponds to the `Loading...` state." ], "enum": [ - "HORIZONTAL_ALIGN_UNSPECIFIED", - "LEFT", - "CENTER", - "RIGHT" - ], - "description": "Horizontal alignment setting for the piece of text." + "ERROR_TYPE_UNSPECIFIED", + "ERROR", + "NULL_VALUE", + "DIVIDE_BY_ZERO", + "VALUE", + "REF", + "NAME", + "NUM", + "N_A", + "LOADING" + ] + } + } + }, + "CopySheetToAnotherSpreadsheetRequest": { + "description": "The request to copy a sheet across spreadsheets.", + "type": "object", + "properties": { + "destinationSpreadsheetId": { + "description": "The ID of the spreadsheet to copy the sheet to.", + "type": "string" } }, - "id": "TextPosition", - "description": "Position settings for text." + "id": "CopySheetToAnotherSpreadsheetRequest" }, - "BatchUpdateSpreadsheetRequest": { + "CandlestickChartSpec": { + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/candlestickchart\"\u003ecandlestick\nchart\u003c/a\u003e.", "type": "object", "properties": { - "includeSpreadsheetInResponse": { - "type": "boolean", - "description": "Determines if the update response should include the spreadsheet\nresource." + "domain": { + "$ref": "CandlestickDomain", + "description": "The domain data (horizontal axis) for the candlestick chart. String data\nwill be treated as discrete labels, other data will be treated as\ncontinuous values." }, - "responseRanges": { + "data": { + "description": "The Candlestick chart data.\nOnly one CandlestickData is supported.", + "type": "array", + "items": { + "$ref": "CandlestickData" + } + } + }, + "id": "CandlestickChartSpec" + }, + "BatchClearValuesByDataFilterResponse": { + "description": "The response when clearing a range of values selected with\nDataFilters in a spreadsheet.", + "type": "object", + "properties": { + "clearedRanges": { "type": "array", "items": { "type": "string" }, - "description": "Limits the ranges included in the response spreadsheet.\nMeaningful only if include_spreadsheet_response is 'true'." + "description": "The ranges that were cleared, in A1 notation.\n(If the requests were for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual ranges\n that were cleared, bounded to the sheet's limits.)" }, - "responseIncludeGridData": { - "description": "True if grid data should be returned. Meaningful only if\nif include_spreadsheet_in_response is 'true'.\nThis parameter is ignored if a field mask was set in the request.", - "type": "boolean" + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", + "type": "string" + } + }, + "id": "BatchClearValuesByDataFilterResponse" + }, + "TreemapChartColorScale": { + "type": "object", + "properties": { + "minValueColor": { + "$ref": "Color", + "description": "The background color for cells with a color value less than or equal to\nminValue. Defaults to #dc3912 if not\nspecified." }, - "requests": { - "description": "A list of updates to apply to the spreadsheet.\nRequests will be applied in the order they are specified.\nIf any request is not valid, no requests will be applied.", - "type": "array", - "items": { - "$ref": "Request" - } + "noDataColor": { + "$ref": "Color", + "description": "The background color for cells that have no color data associated with\nthem. Defaults to #000000 if not specified." + }, + "midValueColor": { + "description": "The background color for cells with a color value at the midpoint between\nminValue and\nmaxValue. Defaults to #efe6dc if not\nspecified.", + "$ref": "Color" + }, + "maxValueColor": { + "description": "The background color for cells with a color value greater than or equal\nto maxValue. Defaults to #109618 if not\nspecified.", + "$ref": "Color" } }, - "id": "BatchUpdateSpreadsheetRequest", - "description": "The request for updating any aspect of a spreadsheet." + "id": "TreemapChartColorScale", + "description": "A color scale for a treemap chart." }, - "Padding": { - "id": "Padding", - "description": "The amount of padding around the cell, in pixels.\nWhen updating padding, every field must be specified.", + "EmbeddedObjectPosition": { + "description": "The position of an embedded object such as a chart.", "type": "object", "properties": { - "right": { - "description": "The right padding of the cell.", - "format": "int32", - "type": "integer" - }, - "bottom": { - "description": "The bottom padding of the cell.", + "sheetId": { + "description": "The sheet this is on. Set only if the embedded object\nis on its own sheet. Must be non-negative.", "format": "int32", "type": "integer" }, - "top": { - "description": "The top padding of the cell.", - "format": "int32", - "type": "integer" + "overlayPosition": { + "description": "The position at which the object is overlaid on top of a grid.", + "$ref": "OverlayPosition" }, - "left": { - "description": "The left padding of the cell.", - "format": "int32", - "type": "integer" + "newSheet": { + "description": "If true, the embedded object is put on a new sheet whose ID\nis chosen for you. Used only when writing.", + "type": "boolean" } - } + }, + "id": "EmbeddedObjectPosition" }, - "BasicChartAxis": { - "description": "An axis of the chart.\nA chart may not have more than one axis per\naxis position.", + "DeveloperMetadataLookup": { "type": "object", "properties": { - "position": { + "metadataLocation": { + "$ref": "DeveloperMetadataLocation", + "description": "Limits the selected developer metadata to those entries associated with\nthe specified location. This field either matches exact locations or all\nintersecting locations according the specified\nlocationMatchingStrategy." + }, + "locationMatchingStrategy": { + "type": "string", "enumDescriptions": [ - "Default value, do not use.", - "The axis rendered at the bottom of a chart.\nFor most charts, this is the standard major axis.\nFor bar charts, this is a minor axis.", - "The axis rendered at the left of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is the standard major axis.", - "The axis rendered at the right of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is an unusual major axis." + "Default value. This value must not be used.", + "Indicates that a specified location should be matched exactly. For\nexample, if row three were specified as a location this matching strategy\nwould only match developer metadata also associated on row three. Metadata\nassociated on other locations would not be considered.", + "Indicates that a specified location should match that exact location as\nwell as any intersecting locations. For example, if row three were\nspecified as a location this matching strategy would match developer\nmetadata associated on row three as well as metadata associated on\nlocations that intersect row three. If, for instance, there was developer\nmetadata associated on column B, this matching strategy would also match\nthat location because column B intersects row three." ], "enum": [ - "BASIC_CHART_AXIS_POSITION_UNSPECIFIED", - "BOTTOM_AXIS", - "LEFT_AXIS", - "RIGHT_AXIS" + "DEVELOPER_METADATA_LOCATION_MATCHING_STRATEGY_UNSPECIFIED", + "EXACT_LOCATION", + "INTERSECTING_LOCATION" ], - "description": "The position of this axis.", - "type": "string" + "description": "Determines how this lookup matches the location. If this field is\nspecified as EXACT, only developer metadata associated on the exact\nlocation specified is matched. If this field is specified to INTERSECTING,\ndeveloper metadata associated on intersecting locations is also\nmatched. If left unspecified, this field assumes a default value of\nINTERSECTING.\nIf this field is specified, a metadataLocation\nmust also be specified." }, - "title": { - "description": "The title of this axis. If set, this overrides any title inferred\nfrom headers of the data.", + "locationType": { + "enum": [ + "DEVELOPER_METADATA_LOCATION_TYPE_UNSPECIFIED", + "ROW", + "COLUMN", + "SHEET", + "SPREADSHEET" + ], + "description": "Limits the selected developer metadata to those entries which are\nassociated with locations of the specified type. For example, when this\nfield is specified as ROW this lookup\nonly considers developer metadata associated on rows. If the field is left\nunspecified, all location types are considered. This field cannot be\nspecified as SPREADSHEET when\nthe locationMatchingStrategy\nis specified as INTERSECTING or when the\nmetadataLocation is specified as a\nnon-spreadsheet location: spreadsheet metadata cannot intersect any other\ndeveloper metadata location. This field also must be left unspecified when\nthe locationMatchingStrategy\nis specified as EXACT.", + "type": "string", + "enumDescriptions": [ + "Default value.", + "Developer metadata associated on an entire row dimension.", + "Developer metadata associated on an entire column dimension.", + "Developer metadata associated on an entire sheet.", + "Developer metadata associated on the entire spreadsheet." + ] + }, + "metadataKey": { + "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_key.", "type": "string" }, - "titleTextPosition": { - "description": "The axis title text position.", - "$ref": "TextPosition" + "visibility": { + "enum": [ + "DEVELOPER_METADATA_VISIBILITY_UNSPECIFIED", + "DOCUMENT", + "PROJECT" + ], + "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.visibility. If left unspecified, all developer\nmetadata visibile to the requesting project is considered.", + "type": "string", + "enumDescriptions": [ + "Default value.", + "Document-visible metadata is accessible from any developer project with\naccess to the document.", + "Project-visible metadata is only visible to and accessible by the developer\nproject that created the metadata." + ] }, - "format": { - "$ref": "TextFormat", - "description": "The format of the title.\nOnly valid if the axis is not associated with the domain." + "metadataId": { + "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_id.", + "format": "int32", + "type": "integer" }, - "viewWindowOptions": { - "description": "The view window options for this axis.", - "$ref": "ChartAxisViewWindowOptions" + "metadataValue": { + "type": "string", + "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_value." } }, - "id": "BasicChartAxis" + "id": "DeveloperMetadataLookup", + "description": "Selects DeveloperMetadata that matches all of the specified fields. For\nexample, if only a metadata ID is specified this considers the\nDeveloperMetadata with that particular unique ID. If a metadata key is\nspecified, this considers all developer metadata with that key. If a\nkey, visibility, and location type are all specified, this considers all\ndeveloper metadata with that key and visibility that are associated with a\nlocation of that type. In general, this\nselects all DeveloperMetadata that matches the intersection of all the\nspecified fields; any field or combination of fields may be specified." }, - "DeleteDimensionRequest": { - "description": "Deletes the dimensions from the sheet.", + "AutoFillRequest": { + "description": "Fills in more data based on existing data.", "type": "object", "properties": { "range": { - "$ref": "DimensionRange", - "description": "The dimensions to delete from the sheet." + "description": "The range to autofill. This will examine the range and detect\nthe location that has data and automatically fill that data\nin to the rest of the range.", + "$ref": "GridRange" + }, + "useAlternateSeries": { + "description": "True if we should generate data with the \"alternate\" series.\nThis differs based on the type and amount of source data.", + "type": "boolean" + }, + "sourceAndDestination": { + "$ref": "SourceAndDestination", + "description": "The source and destination areas to autofill.\nThis explicitly lists the source of the autofill and where to\nextend that data." } }, - "id": "DeleteDimensionRequest" + "id": "AutoFillRequest" }, - "UpdateChartSpecRequest": { - "description": "Updates a chart's specifications.\n(This does not move or resize a chart. To move or resize a chart, use\n UpdateEmbeddedObjectPositionRequest.)", + "GradientRule": { "type": "object", "properties": { - "chartId": { - "type": "integer", - "description": "The ID of the chart to update.", - "format": "int32" + "minpoint": { + "description": "The starting interpolation point.", + "$ref": "InterpolationPoint" }, - "spec": { - "$ref": "ChartSpec", - "description": "The specification to apply to the chart." + "maxpoint": { + "description": "The final interpolation point.", + "$ref": "InterpolationPoint" + }, + "midpoint": { + "description": "An optional midway interpolation point.", + "$ref": "InterpolationPoint" } }, - "id": "UpdateChartSpecRequest" + "id": "GradientRule", + "description": "A rule that applies a gradient color scale format, based on\nthe interpolation points listed. The format of a cell will vary\nbased on its contents as compared to the values of the interpolation\npoints." }, - "DeleteFilterViewRequest": { - "description": "Deletes a particular filter view.", + "ClearValuesRequest": { + "description": "The request for clearing a range of values in a spreadsheet.", + "type": "object", + "properties": {}, + "id": "ClearValuesRequest" + }, + "SetBasicFilterRequest": { + "description": "Sets the basic filter associated with a sheet.", "type": "object", "properties": { - "filterId": { - "description": "The ID of the filter to delete.", - "format": "int32", - "type": "integer" + "filter": { + "$ref": "BasicFilter", + "description": "The filter to set." } }, - "id": "DeleteFilterViewRequest" + "id": "SetBasicFilterRequest" }, - "BatchGetValuesByDataFilterRequest": { - "description": "The request for retrieving a range of values in a spreadsheet selected by a\nset of DataFilters.", + "BatchClearValuesByDataFilterRequest": { + "description": "The request for clearing more than one range selected by a\nDataFilter in a spreadsheet.", "type": "object", "properties": { - "majorDimension": { - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ], - "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen a request that selects that range and sets `majorDimension=ROWS` will\nreturn `[[1,2],[3,4]]`,\nwhereas a request that sets `majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`." - }, "dataFilters": { + "description": "The DataFilters used to determine which ranges to clear.", "type": "array", "items": { "$ref": "DataFilter" - }, - "description": "The data filters used to match the ranges of values to retrieve. Ranges\nthat match any of the specified data filters will be included in the\nresponse." - }, - "valueRenderOption": { - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ], - "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string", - "enumDescriptions": [ - "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", - "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", - "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." - ] - }, - "dateTimeRenderOption": { - "enumDescriptions": [ - "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", - "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." - ], - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", - "type": "string" + } } }, - "id": "BatchGetValuesByDataFilterRequest" + "id": "BatchClearValuesByDataFilterRequest" }, - "BatchUpdateValuesResponse": { - "description": "The response when updating a range of values in a spreadsheet.", + "GetSpreadsheetByDataFilterRequest": { "type": "object", "properties": { - "totalUpdatedRows": { - "type": "integer", - "description": "The total number of rows where at least one cell in the row was updated.", - "format": "int32" + "includeGridData": { + "type": "boolean", + "description": "True if grid data should be returned.\nThis parameter is ignored if a field mask was set in the request." }, - "responses": { + "dataFilters": { + "description": "The DataFilters used to select which ranges to retrieve from\nthe spreadsheet.", "type": "array", "items": { - "$ref": "UpdateValuesResponse" - }, - "description": "One UpdateValuesResponse per requested range, in the same order as\nthe requests appeared." - }, - "totalUpdatedSheets": { - "description": "The total number of sheets where at least one cell in the sheet was\nupdated.", + "$ref": "DataFilter" + } + } + }, + "id": "GetSpreadsheetByDataFilterRequest", + "description": "The request for retrieving a Spreadsheet." + }, + "DeleteEmbeddedObjectRequest": { + "description": "Deletes the embedded object with the given ID.", + "type": "object", + "properties": { + "objectId": { + "description": "The ID of the embedded object to delete.", "format": "int32", "type": "integer" + } + }, + "id": "DeleteEmbeddedObjectRequest" + }, + "UpdateValuesByDataFilterResponse": { + "description": "The response when updating a range of values by a data filter in a\nspreadsheet.", + "type": "object", + "properties": { + "updatedData": { + "description": "The values of the cells in the range matched by the dataFilter after all\nupdates were applied. This is only included if the request's\n`includeValuesInResponse` field was `true`.", + "$ref": "ValueRange" }, - "totalUpdatedCells": { - "description": "The total number of cells updated.", + "updatedRows": { + "description": "The number of rows where at least one cell in the row was updated.", "format": "int32", "type": "integer" }, - "totalUpdatedColumns": { - "description": "The total number of columns where at least one cell in the column was\nupdated.", + "updatedColumns": { + "description": "The number of columns where at least one cell in the column was updated.", "format": "int32", "type": "integer" }, - "spreadsheetId": { + "updatedRange": { "type": "string", - "description": "The spreadsheet the updates were applied to." - } - }, - "id": "BatchUpdateValuesResponse" - }, - "KeyValueFormat": { - "description": "Formatting options for key value.", - "type": "object", - "properties": { - "position": { - "$ref": "TextPosition", - "description": "Specifies the horizontal text positioning of key value.\nThis field is optional. If not specified, default positioning is used." + "description": "The range (in A1 notation) that updates were applied to." }, - "textFormat": { - "description": "Text formatting options for key value.", - "$ref": "TextFormat" + "updatedCells": { + "description": "The number of cells updated.", + "format": "int32", + "type": "integer" + }, + "dataFilter": { + "$ref": "DataFilter", + "description": "The data filter that selected the range that was updated." } }, - "id": "KeyValueFormat" + "id": "UpdateValuesByDataFilterResponse" }, - "BatchClearValuesRequest": { + "DeleteSheetRequest": { + "description": "Deletes the requested sheet.", "type": "object", "properties": { - "ranges": { - "description": "The ranges to clear, in A1 notation.", - "type": "array", - "items": { - "type": "string" - } + "sheetId": { + "type": "integer", + "description": "The ID of the sheet to delete.", + "format": "int32" } }, - "id": "BatchClearValuesRequest", - "description": "The request for clearing more than one range of values in a spreadsheet." + "id": "DeleteSheetRequest" }, - "DeveloperMetadata": { - "description": "Developer metadata associated with a location or object in a spreadsheet.\nDeveloper metadata may be used to associate arbitrary data with various\nparts of a spreadsheet and will remain associated at those locations as they\nmove around and the spreadsheet is edited. For example, if developer\nmetadata is associated with row 5 and another row is then subsequently\ninserted above row 5, that original metadata will still be associated with\nthe row it was first associated with (what is now row 6). If the associated\nobject is deleted its metadata is deleted too.", + "MatchedValueRange": { + "description": "A value range that was matched by one or more data filers.", "type": "object", "properties": { - "metadataKey": { - "description": "The metadata key. There may be multiple metadata in a spreadsheet with the\nsame key. Developer metadata must always have a key specified.", - "type": "string" - }, - "metadataId": { - "type": "integer", - "description": "The spreadsheet-scoped unique ID that identifies the metadata. IDs may be\nspecified when metadata is created, otherwise one will be randomly\ngenerated and assigned. Must be positive.", - "format": "int32" - }, - "location": { - "$ref": "DeveloperMetadataLocation", - "description": "The location where the metadata is associated." - }, - "visibility": { - "enumDescriptions": [ - "Default value.", - "Document-visible metadata is accessible from any developer project with\naccess to the document.", - "Project-visible metadata is only visible to and accessible by the developer\nproject that created the metadata." - ], - "enum": [ - "DEVELOPER_METADATA_VISIBILITY_UNSPECIFIED", - "DOCUMENT", - "PROJECT" - ], - "description": "The metadata visibility. Developer metadata must always have a visibility\nspecified.", - "type": "string" + "dataFilters": { + "description": "The DataFilters from the request that matched the range of\nvalues.", + "type": "array", + "items": { + "$ref": "DataFilter" + } }, - "metadataValue": { - "description": "Data associated with the metadata's key.", - "type": "string" + "valueRange": { + "$ref": "ValueRange", + "description": "The values matched by the DataFilter." } }, - "id": "DeveloperMetadata" + "id": "MatchedValueRange" }, - "BaselineValueFormat": { - "description": "Formatting options for baseline value.", + "DeveloperMetadataLocation": { + "id": "DeveloperMetadataLocation", + "description": "A location where metadata may be associated in a spreadsheet.", "type": "object", "properties": { - "textFormat": { - "$ref": "TextFormat", - "description": "Text formatting options for baseline value." + "dimensionRange": { + "$ref": "DimensionRange", + "description": "Represents the row or column when metadata is associated with\na dimension. The specified DimensionRange must represent a single row\nor column; it cannot be unbounded or span multiple rows or columns." }, - "description": { - "type": "string", - "description": "Description which is appended after the baseline value.\nThis field is optional." + "spreadsheet": { + "type": "boolean", + "description": "True when metadata is associated with an entire spreadsheet." }, - "negativeColor": { - "$ref": "Color", - "description": "Color to be used, in case baseline value represents a negative change for\nkey value. This field is optional." + "sheetId": { + "type": "integer", + "description": "The ID of the sheet when metadata is associated with an entire sheet.", + "format": "int32" }, - "comparisonType": { + "locationType": { "enum": [ - "COMPARISON_TYPE_UNDEFINED", - "ABSOLUTE_DIFFERENCE", - "PERCENTAGE_DIFFERENCE" + "DEVELOPER_METADATA_LOCATION_TYPE_UNSPECIFIED", + "ROW", + "COLUMN", + "SHEET", + "SPREADSHEET" ], - "description": "The comparison type of key value with baseline value.", + "description": "The type of location this object represents. This field is read-only.", "type": "string", "enumDescriptions": [ - "Default value, do not use.", - "Use absolute difference between key and baseline value.", - "Use percentage difference between key and baseline value." + "Default value.", + "Developer metadata associated on an entire row dimension.", + "Developer metadata associated on an entire column dimension.", + "Developer metadata associated on an entire sheet.", + "Developer metadata associated on the entire spreadsheet." ] - }, - "position": { - "$ref": "TextPosition", - "description": "Specifies the horizontal text positioning of baseline value.\nThis field is optional. If not specified, default positioning is used." - }, - "positiveColor": { - "$ref": "Color", - "description": "Color to be used, in case baseline value represents a positive change for\nkey value. This field is optional." } - }, - "id": "BaselineValueFormat" + } }, - "TextToColumnsRequest": { - "description": "Splits a column of text into multiple columns,\nbased on a delimiter in each cell.", + "DuplicateSheetRequest": { + "description": "Duplicates the contents of a sheet.", "type": "object", "properties": { - "delimiter": { - "description": "The delimiter to use. Used only if delimiterType is\nCUSTOM.", + "newSheetName": { + "description": "The name of the new sheet. If empty, a new name is chosen for you.", "type": "string" }, - "source": { - "description": "The source data range. This must span exactly one column.", - "$ref": "GridRange" - }, - "delimiterType": { - "type": "string", - "enumDescriptions": [ - "Default value. This value must not be used.", - "\",\"", - "\";\"", - "\".\"", - "\" \"", - "A custom value as defined in delimiter.", - "Automatically detect columns." - ], - "enum": [ - "DELIMITER_TYPE_UNSPECIFIED", - "COMMA", - "SEMICOLON", - "PERIOD", - "SPACE", - "CUSTOM", - "AUTODETECT" - ], - "description": "The delimiter type to use." - } - }, - "id": "TextToColumnsRequest" - }, - "ClearBasicFilterRequest": { - "type": "object", - "properties": { - "sheetId": { - "description": "The sheet ID on which the basic filter should be cleared.", + "sourceSheetId": { + "description": "The sheet to duplicate.", "format": "int32", "type": "integer" - } - }, - "id": "ClearBasicFilterRequest", - "description": "Clears the basic filter, if any exists on the sheet." - }, - "DimensionGroup": { - "type": "object", - "properties": { - "collapsed": { - "description": "This field is true if this group is collapsed. A collapsed group remains\ncollapsed if an overlapping group at a shallower depth is expanded.\n\nA true value does not imply that all dimensions within the group are\nhidden, since a dimension's visibility can change independently from this\ngroup property. However, when this property is updated, all dimensions\nwithin it are set to hidden if this field is true, or set to visible if\nthis field is false.", - "type": "boolean" }, - "range": { - "$ref": "DimensionRange", - "description": "The range over which this group exists." - }, - "depth": { + "newSheetId": { "type": "integer", - "description": "The depth of the group, representing how many groups have a range that\nwholly contains the range of this group.", + "description": "If set, the ID of the new sheet. If not set, an ID is chosen.\nIf set, the ID must not conflict with any existing sheet ID.\nIf set, it must be non-negative.", "format": "int32" + }, + "insertSheetIndex": { + "description": "The zero-based index where the new sheet should be inserted.\nThe index of all sheets after this are incremented.", + "format": "int32", + "type": "integer" } }, - "id": "DimensionGroup", - "description": "A group over an interval of rows or columns on a sheet, which can contain or\nbe contained within other groups. A group can be collapsed or expanded as a\nunit on the sheet." + "id": "DuplicateSheetRequest" }, - "DeleteBandingRequest": { - "description": "Removes the banded range with the given ID from the spreadsheet.", + "TreemapChartSpec": { + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/treemap\"\u003eTreemap chart\u003c/a\u003e.", "type": "object", "properties": { - "bandedRangeId": { - "description": "The ID of the banded range to delete.", + "minValue": { + "description": "The minimum possible data value. Cells with values less than this will\nhave the same color as cells with this value. If not specified, defaults\nto the actual minimum value from color_data, or the minimum value from\nsize_data if color_data is not specified.", + "format": "double", + "type": "number" + }, + "levels": { + "description": "The number of data levels to show on the treemap chart. These levels are\ninteractive and are shown with their labels. Defaults to 2 if not\nspecified.", + "format": "int32", + "type": "integer" + }, + "sizeData": { + "$ref": "ChartData", + "description": "The data that determines the size of each treemap data cell. This data is\nexpected to be numeric. The cells corresponding to non-numeric or missing\ndata will not be rendered. If color_data is not specified, this data\nis used to determine data cell background colors as well." + }, + "textFormat": { + "description": "The text format for all labels on the chart.", + "$ref": "TextFormat" + }, + "parentLabels": { + "$ref": "ChartData", + "description": "The data the contains the treemap cells' parent labels." + }, + "headerColor": { + "$ref": "Color", + "description": "The background color for header cells." + }, + "labels": { + "description": "The data that contains the treemap cell labels.", + "$ref": "ChartData" + }, + "colorData": { + "$ref": "ChartData", + "description": "The data that determines the background color of each treemap data cell.\nThis field is optional. If not specified, size_data is used to\ndetermine background colors. If specified, the data is expected to be\nnumeric. color_scale will determine how the values in this data map to\ndata cell background colors." + }, + "maxValue": { + "description": "The maximum possible data value. Cells with values greater than this will\nhave the same color as cells with this value. If not specified, defaults\nto the actual maximum value from color_data, or the maximum value from\nsize_data if color_data is not specified.", + "format": "double", + "type": "number" + }, + "colorScale": { + "description": "The color scale for data cells in the treemap chart. Data cells are\nassigned colors based on their color values. These color values come from\ncolor_data, or from size_data if color_data is not specified.\nCells with color values less than or equal to min_value will\nhave minValueColor as their\nbackground color. Cells with color values greater than or equal to\nmax_value will have\nmaxValueColor as their background\ncolor. Cells with color values between min_value and max_value will\nhave background colors on a gradient between\nminValueColor and\nmaxValueColor, the midpoint of\nthe gradient being midValueColor.\nCells with missing or non-numeric color values will have\nnoDataColor as their background\ncolor.", + "$ref": "TreemapChartColorScale" + }, + "hideTooltips": { + "description": "True to hide tooltips.", + "type": "boolean" + }, + "hintedLevels": { + "description": "The number of additional data levels beyond the labeled levels to be shown\non the treemap chart. These levels are not interactive and are shown\nwithout their labels. Defaults to 0 if not specified.", "format": "int32", "type": "integer" } }, - "id": "DeleteBandingRequest" + "id": "TreemapChartSpec" }, - "AppendValuesResponse": { - "id": "AppendValuesResponse", - "description": "The response when updating a range of values in a spreadsheet.", + "ExtendedValue": { + "description": "The kinds of value that a cell in a spreadsheet can have.", "type": "object", "properties": { - "updates": { - "$ref": "UpdateValuesResponse", - "description": "Information about the updates that were applied." + "errorValue": { + "$ref": "ErrorValue", + "description": "Represents an error.\nThis field is read-only." }, - "tableRange": { - "description": "The range (in A1 notation) of the table that values are being appended to\n(before the values were appended).\nEmpty if no table was found.", - "type": "string" + "stringValue": { + "type": "string", + "description": "Represents a string value.\nLeading single quotes are not included. For example, if the user typed\n`'123` into the UI, this would be represented as a `stringValue` of\n`\"123\"`." }, - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", + "boolValue": { + "description": "Represents a boolean value.", + "type": "boolean" + }, + "formulaValue": { + "description": "Represents a formula.", "type": "string" - } - } - }, - "MoveDimensionRequest": { - "type": "object", - "properties": { - "destinationIndex": { - "description": "The zero-based start index of where to move the source data to,\nbased on the coordinates *before* the source data is removed\nfrom the grid. Existing data will be shifted down or right\n(depending on the dimension) to make room for the moved dimensions.\nThe source dimensions are removed from the grid, so the\nthe data may end up in a different index than specified.\n\nFor example, given `A1..A5` of `0, 1, 2, 3, 4` and wanting to move\n`\"1\"` and `\"2\"` to between `\"3\"` and `\"4\"`, the source would be\n`ROWS [1..3)`,and the destination index would be `\"4\"`\n(the zero-based index of row 5).\nThe end result would be `A1..A5` of `0, 3, 1, 2, 4`.", - "format": "int32", - "type": "integer" }, - "source": { - "$ref": "DimensionRange", - "description": "The source dimensions to move." + "numberValue": { + "description": "Represents a double value.\nNote: Dates, Times and DateTimes are represented as doubles in\n\"serial number\" format.", + "format": "double", + "type": "number" } }, - "id": "MoveDimensionRequest", - "description": "Moves one or more rows or columns." + "id": "ExtendedValue" }, - "PivotFilterCriteria": { + "BatchClearValuesResponse": { + "description": "The response when clearing a range of values in a spreadsheet.", "type": "object", "properties": { - "visibleValues": { - "description": "Values that should be included. Values not listed here are excluded.", + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", + "type": "string" + }, + "clearedRanges": { "type": "array", "items": { "type": "string" - } + }, + "description": "The ranges that were cleared, in A1 notation.\n(If the requests were for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual ranges\n that were cleared, bounded to the sheet's limits.)" } }, - "id": "PivotFilterCriteria", - "description": "Criteria for showing/hiding rows in a pivot table." + "id": "BatchClearValuesResponse" }, - "AddConditionalFormatRuleRequest": { - "description": "Adds a new conditional format rule at the given index.\nAll subsequent rules' indexes are incremented.", + "DataFilter": { "type": "object", "properties": { - "rule": { - "$ref": "ConditionalFormatRule", - "description": "The rule to add." + "gridRange": { + "$ref": "GridRange", + "description": "Selects data that matches the range described by the GridRange." }, - "index": { - "description": "The zero-based index where the rule should be inserted.", - "format": "int32", - "type": "integer" - } - }, - "id": "AddConditionalFormatRuleRequest" - }, - "CreateDeveloperMetadataRequest": { - "description": "A request to create developer metadata.", - "type": "object", - "properties": { - "developerMetadata": { - "description": "The developer metadata to create.", - "$ref": "DeveloperMetadata" + "developerMetadataLookup": { + "$ref": "DeveloperMetadataLookup", + "description": "Selects data associated with the developer metadata matching the criteria\ndescribed by this DeveloperMetadataLookup." + }, + "a1Range": { + "description": "Selects data that matches the specified A1 range.", + "type": "string" } }, - "id": "CreateDeveloperMetadataRequest" + "id": "DataFilter", + "description": "Filter that describes what data should be selected or returned from a\nrequest." }, - "ChartSpec": { - "id": "ChartSpec", - "description": "The specifications of a chart.", + "TextFormat": { "type": "object", "properties": { - "title": { - "description": "The title of the chart.", - "type": "string" - }, - "altText": { - "description": "The alternative text that describes the chart. This is often used\nfor accessibility.", - "type": "string" - }, - "titleTextPosition": { - "$ref": "TextPosition", - "description": "The title text position.\nThis field is optional." - }, - "histogramChart": { - "$ref": "HistogramChartSpec", - "description": "A histogram chart specification." - }, - "candlestickChart": { - "$ref": "CandlestickChartSpec", - "description": "A candlestick chart specification." - }, - "bubbleChart": { - "$ref": "BubbleChartSpec", - "description": "A bubble chart specification." - }, - "waterfallChart": { - "$ref": "WaterfallChartSpec", - "description": "A waterfall chart specification." + "underline": { + "type": "boolean", + "description": "True if the text is underlined." }, - "fontName": { - "description": "The name of the font to use by default for all chart text (e.g. title,\naxis labels, legend). If a font is specified for a specific part of the\nchart it will override this font name.", - "type": "string" + "foregroundColor": { + "$ref": "Color", + "description": "The foreground color of the text." }, - "maximized": { - "description": "True to make a chart fill the entire space in which it's rendered with\nminimum padding. False to use the default padding.\n(Not applicable to Geo and Org charts.)", + "bold": { + "description": "True if the text is bold.", "type": "boolean" }, - "treemapChart": { - "$ref": "TreemapChartSpec", - "description": "A treemap chart specification." - }, - "hiddenDimensionStrategy": { - "enumDescriptions": [ - "Default value, do not use.", - "Charts will skip hidden rows and columns.", - "Charts will skip hidden rows only.", - "Charts will skip hidden columns only.", - "Charts will not skip any hidden rows or columns." - ], - "enum": [ - "CHART_HIDDEN_DIMENSION_STRATEGY_UNSPECIFIED", - "SKIP_HIDDEN_ROWS_AND_COLUMNS", - "SKIP_HIDDEN_ROWS", - "SKIP_HIDDEN_COLUMNS", - "SHOW_ALL" - ], - "description": "Determines how the charts will use hidden rows or columns.", - "type": "string" - }, - "subtitleTextFormat": { - "$ref": "TextFormat", - "description": "The subtitle text format.\nStrikethrough and underline are not supported." - }, - "subtitle": { - "description": "The subtitle of the chart.", + "fontFamily": { + "description": "The font family.", "type": "string" }, - "backgroundColor": { - "description": "The background color of the entire chart.\nNot applicable to Org charts.", - "$ref": "Color" - }, - "subtitleTextPosition": { - "description": "The subtitle text position.\nThis field is optional.", - "$ref": "TextPosition" - }, - "basicChart": { - "$ref": "BasicChartSpec", - "description": "A basic chart specification, can be one of many kinds of charts.\nSee BasicChartType for the list of all\ncharts this supports." - }, - "orgChart": { - "$ref": "OrgChartSpec", - "description": "An org chart specification." - }, - "scorecardChart": { - "description": "A scorecard chart specification.", - "$ref": "ScorecardChartSpec" + "italic": { + "description": "True if the text is italicized.", + "type": "boolean" }, - "pieChart": { - "$ref": "PieChartSpec", - "description": "A pie chart specification." + "strikethrough": { + "description": "True if the text has a strikethrough.", + "type": "boolean" }, - "titleTextFormat": { - "$ref": "TextFormat", - "description": "The title text format.\nStrikethrough and underline are not supported." + "fontSize": { + "description": "The size of the font.", + "format": "int32", + "type": "integer" } - } + }, + "id": "TextFormat", + "description": "The format of a run of text in a cell.\nAbsent values indicate that the field isn't specified." }, - "BatchGetValuesByDataFilterResponse": { - "id": "BatchGetValuesByDataFilterResponse", - "description": "The response when retrieving more than one range of values in a spreadsheet\nselected by DataFilters.", + "DeleteDuplicatesRequest": { + "id": "DeleteDuplicatesRequest", + "description": "Removes rows within this range that contain values in the specified columns\nthat are duplicates of values in any previous row. Rows with identical values\nbut different letter cases, formatting, or formulas are considered to be\nduplicates.\n\nThis request also removes duplicate rows hidden from view (for example, due\nto a filter). When removing duplicates, the first instance of each duplicate\nrow scanning from the top downwards is kept in the resulting range. Content\noutside of the specified range isn't removed, and rows considered duplicates\ndo not have to be adjacent to each other in the range.", "type": "object", "properties": { - "valueRanges": { - "description": "The requested values with the list of data filters that matched them.", + "range": { + "description": "The range to remove duplicates rows from.", + "$ref": "GridRange" + }, + "comparisonColumns": { "type": "array", "items": { - "$ref": "MatchedValueRange" - } - }, - "spreadsheetId": { - "description": "The ID of the spreadsheet the data was retrieved from.", - "type": "string" + "$ref": "DimensionRange" + }, + "description": "The columns in the range to analyze for duplicate values. If no columns are\nselected then all columns are analyzed for duplicates." } } }, - "LineStyle": { - "description": "Properties that describe the style of a line.", + "RepeatCellRequest": { "type": "object", "properties": { - "type": { - "enumDescriptions": [ - "Default value, do not use.", - "No dash type, which is equivalent to a non-visible line.", - "A custom dash for a line. Modifying the exact custom dash style is\ncurrently unsupported.", - "A solid line.", - "A dotted line.", - "A dashed line where the dashes have \"medium\" length.", - "A line that alternates between a \"medium\" dash and a dot.", - "A dashed line where the dashes have \"long\" length.", - "A line that alternates between a \"long\" dash and a dot." - ], - "enum": [ - "LINE_DASH_TYPE_UNSPECIFIED", - "INVISIBLE", - "CUSTOM", - "SOLID", - "DOTTED", - "MEDIUM_DASHED", - "MEDIUM_DASHED_DOTTED", - "LONG_DASHED", - "LONG_DASHED_DOTTED" - ], - "description": "The dash type of the line.", - "type": "string" + "range": { + "$ref": "GridRange", + "description": "The range to repeat the cell in." }, - "width": { - "type": "integer", - "description": "The thickness of the line, in px.", - "format": "int32" + "fields": { + "type": "string", + "description": "The fields that should be updated. At least one field must be specified.\nThe root `cell` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask" + }, + "cell": { + "description": "The data to write.", + "$ref": "CellData" } }, - "id": "LineStyle" + "id": "RepeatCellRequest", + "description": "Updates all cells in the range to the values in the given Cell object.\nOnly the fields listed in the fields field are updated; others are\nunchanged.\n\nIf writing a cell with a formula, the formula's ranges will automatically\nincrement for each field in the range.\nFor example, if writing a cell with formula `=A1` into range B2:C4,\nB2 would be `=A1`, B3 would be `=A2`, B4 would be `=A3`,\nC2 would be `=B1`, C3 would be `=B2`, C4 would be `=B3`.\n\nTo keep the formula's ranges static, use the `$` indicator.\nFor example, use the formula `=$A$1` to prevent both the row and the\ncolumn from incrementing." }, - "CandlestickDomain": { + "UpdateSpreadsheetPropertiesRequest": { "type": "object", "properties": { - "data": { - "$ref": "ChartData", - "description": "The data of the CandlestickDomain." + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root 'properties' is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" }, - "reversed": { - "type": "boolean", - "description": "True to reverse the order of the domain values (horizontal axis)." + "properties": { + "$ref": "SpreadsheetProperties", + "description": "The properties to update." } }, - "id": "CandlestickDomain", - "description": "The domain of a CandlestickChart." + "id": "UpdateSpreadsheetPropertiesRequest", + "description": "Updates properties of a spreadsheet." }, - "SheetProperties": { - "description": "Properties of a sheet.", + "ProtectedRange": { + "description": "A protected range.", "type": "object", "properties": { - "hidden": { - "description": "True if the sheet is hidden in the UI, false if it's visible.", - "type": "boolean" + "range": { + "description": "The range that is being protected.\nThe range may be fully unbounded, in which case this is considered\na protected sheet.\n\nWhen writing, only one of range or named_range_id\nmay be set.", + "$ref": "GridRange" }, - "sheetType": { - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "The sheet is a grid.", - "The sheet has no grid and instead has an object like a chart or image." - ], - "enum": [ - "SHEET_TYPE_UNSPECIFIED", - "GRID", - "OBJECT" - ], - "description": "The type of sheet. Defaults to GRID.\nThis field cannot be changed once set." + "editors": { + "$ref": "Editors", + "description": "The users and groups with edit access to the protected range.\nThis field is only visible to users with edit access to the protected\nrange and the document.\nEditors are not supported with warning_only protection." }, - "gridProperties": { - "$ref": "GridProperties", - "description": "Additional properties of the sheet if this sheet is a grid.\n(If the sheet is an object sheet, containing a chart or image, then\nthis field will be absent.)\nWhen writing it is an error to set any grid properties on non-grid sheets." + "description": { + "description": "The description of this protected range.", + "type": "string" + }, + "unprotectedRanges": { + "description": "The list of unprotected ranges within a protected sheet.\nUnprotected ranges are only supported on protected sheets.", + "type": "array", + "items": { + "$ref": "GridRange" + } }, - "title": { + "namedRangeId": { "type": "string", - "description": "The name of the sheet." - }, - "index": { - "description": "The index of the sheet within the spreadsheet.\nWhen adding or updating sheet properties, if this field\nis excluded then the sheet is added or moved to the end\nof the sheet list. When updating sheet indices or inserting\nsheets, movement is considered in \"before the move\" indexes.\nFor example, if there were 3 sheets (S1, S2, S3) in order to\nmove S1 ahead of S2 the index would have to be set to 2. A sheet\nindex update request is ignored if the requested index is\nidentical to the sheets current index or if the requested new\nindex is equal to the current sheet index + 1.", - "format": "int32", - "type": "integer" - }, - "tabColor": { - "description": "The color of the tab in the UI.", - "$ref": "Color" + "description": "The named range this protected range is backed by, if any.\n\nWhen writing, only one of range or named_range_id\nmay be set." }, - "sheetId": { - "description": "The ID of the sheet. Must be non-negative.\nThis field cannot be changed once set.", + "protectedRangeId": { + "description": "The ID of the protected range.\nThis field is read-only.", "format": "int32", "type": "integer" }, - "rightToLeft": { + "warningOnly": { "type": "boolean", - "description": "True if the sheet is an RTL sheet instead of an LTR sheet." + "description": "True if this protected range will show a warning when editing.\nWarning-based protection means that every user can edit data in the\nprotected range, except editing will prompt a warning asking the user\nto confirm the edit.\n\nWhen writing: if this field is true, then editors is ignored.\nAdditionally, if this field is changed from true to false and the\n`editors` field is not set (nor included in the field mask), then\nthe editors will be set to all the editors in the document." + }, + "requestingUserCanEdit": { + "description": "True if the user who requested this protected range can edit the\nprotected area.\nThis field is read-only.", + "type": "boolean" } }, - "id": "SheetProperties" + "id": "ProtectedRange" }, - "UpdateDimensionPropertiesRequest": { - "description": "Updates properties of dimensions within the specified range.", + "DimensionProperties": { + "description": "Properties about a dimension.", "type": "object", "properties": { - "range": { - "$ref": "DimensionRange", - "description": "The rows or columns to update." + "pixelSize": { + "description": "The height (if a row) or width (if a column) of the dimension in pixels.", + "format": "int32", + "type": "integer" }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `properties` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" + "hiddenByFilter": { + "description": "True if this dimension is being filtered.\nThis field is read-only.", + "type": "boolean" }, - "properties": { - "description": "Properties to update.", - "$ref": "DimensionProperties" + "hiddenByUser": { + "description": "True if this dimension is explicitly hidden.", + "type": "boolean" + }, + "developerMetadata": { + "description": "The developer metadata associated with a single row or column.", + "type": "array", + "items": { + "$ref": "DeveloperMetadata" + } } }, - "id": "UpdateDimensionPropertiesRequest" + "id": "DimensionProperties" }, - "SourceAndDestination": { - "description": "A combination of a source range and how to extend that source.", + "DimensionRange": { + "description": "A range along a single dimension on a sheet.\nAll indexes are zero-based.\nIndexes are half open: the start index is inclusive\nand the end index is exclusive.\nMissing indexes indicate the range is unbounded on that side.", "type": "object", "properties": { - "source": { - "$ref": "GridRange", - "description": "The location of the data to use as the source of the autofill." + "startIndex": { + "type": "integer", + "description": "The start (inclusive) of the span, or not set if unbounded.", + "format": "int32" + }, + "endIndex": { + "description": "The end (exclusive) of the span, or not set if unbounded.", + "format": "int32", + "type": "integer" + }, + "sheetId": { + "description": "The sheet this span is on.", + "format": "int32", + "type": "integer" }, "dimension": { - "description": "The dimension that data should be filled into.", - "type": "string", "enumDescriptions": [ "The default value, do not use.", "Operates on the rows of a sheet.", @@ -5779,602 +5112,1269 @@ "DIMENSION_UNSPECIFIED", "ROWS", "COLUMNS" - ] - }, - "fillLength": { - "description": "The number of rows or columns that data should be filled into.\nPositive numbers expand beyond the last row or last column\nof the source. Negative numbers expand before the first row\nor first column of the source.", - "format": "int32", - "type": "integer" + ], + "description": "The dimension of the span.", + "type": "string" } }, - "id": "SourceAndDestination" + "id": "DimensionRange" }, - "SlicerSpec": { - "description": "The specifications of a slicer.", + "NamedRange": { + "description": "A named range.", "type": "object", "properties": { - "backgroundColor": { - "description": "The background color of the slicer.", - "$ref": "Color" - }, - "filterCriteria": { - "description": "The filtering criteria of the slicer.", - "$ref": "FilterCriteria" - }, - "dataRange": { - "$ref": "GridRange", - "description": "The data range of the slicer." - }, - "applyToPivotTables": { - "description": "True if the filter should apply to pivot tables.\nIf not set, default to `True`.", - "type": "boolean" - }, - "columnIndex": { - "type": "integer", - "description": "The column index in the data table on which the filter is applied to.", - "format": "int32" - }, - "title": { - "description": "The title of the slicer.", + "namedRangeId": { + "description": "The ID of the named range.", "type": "string" }, - "horizontalAlignment": { - "type": "string", - "enumDescriptions": [ - "The horizontal alignment is not specified. Do not use this.", - "The text is explicitly aligned to the left of the cell.", - "The text is explicitly aligned to the center of the cell.", - "The text is explicitly aligned to the right of the cell." - ], - "enum": [ - "HORIZONTAL_ALIGN_UNSPECIFIED", - "LEFT", - "CENTER", - "RIGHT" - ], - "description": "The horizontal alignment of title in the slicer.\nIf unspecified, defaults to `LEFT`" + "range": { + "description": "The range this represents.", + "$ref": "GridRange" }, - "textFormat": { - "$ref": "TextFormat", - "description": "The text format of title in the slicer." + "name": { + "type": "string", + "description": "The name of the named range." } }, - "id": "SlicerSpec" + "id": "NamedRange" }, - "CandlestickSeries": { + "ChartCustomNumberFormatOptions": { + "description": "Custom number formatting options for chart attributes.", "type": "object", "properties": { - "data": { - "$ref": "ChartData", - "description": "The data of the CandlestickSeries." + "prefix": { + "description": "Custom prefix to be prepended to the chart attribute.\nThis field is optional.", + "type": "string" + }, + "suffix": { + "type": "string", + "description": "Custom suffix to be appended to the chart attribute.\nThis field is optional." } }, - "id": "CandlestickSeries", - "description": "The series of a CandlestickData." + "id": "ChartCustomNumberFormatOptions" }, - "HistogramChartSpec": { + "Borders": { + "id": "Borders", + "description": "The borders of the cell.", "type": "object", "properties": { - "bucketSize": { - "description": "By default the bucket size (the range of values stacked in a single\ncolumn) is chosen automatically, but it may be overridden here.\nE.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc.\nCannot be negative.\nThis field is optional.", - "format": "double", - "type": "number" + "right": { + "$ref": "Border", + "description": "The right border of the cell." }, - "outlierPercentile": { - "description": "The outlier percentile is used to ensure that outliers do not adversely\naffect the calculation of bucket sizes. For example, setting an outlier\npercentile of 0.05 indicates that the top and bottom 5% of values when\ncalculating buckets. The values are still included in the chart, they will\nbe added to the first or last buckets instead of their own buckets.\nMust be between 0.0 and 0.5.", - "format": "double", - "type": "number" + "bottom": { + "description": "The bottom border of the cell.", + "$ref": "Border" }, - "showItemDividers": { - "type": "boolean", - "description": "Whether horizontal divider lines should be displayed between items in each\ncolumn." + "top": { + "$ref": "Border", + "description": "The top border of the cell." }, - "series": { + "left": { + "description": "The left border of the cell.", + "$ref": "Border" + } + } + }, + "ManualRule": { + "type": "object", + "properties": { + "groups": { + "description": "The list of group names and the corresponding items from the source data\nthat map to each group name.", "type": "array", "items": { - "$ref": "HistogramSeries" - }, - "description": "The series for a histogram may be either a single series of values to be\nbucketed or multiple series, each of the same length, containing the name\nof the series followed by the values to be bucketed for that series." - }, - "legendPosition": { - "enumDescriptions": [ - "Default value, do not use.", - "The legend is rendered on the bottom of the chart.", - "The legend is rendered on the left of the chart.", - "The legend is rendered on the right of the chart.", - "The legend is rendered on the top of the chart.", - "No legend is rendered.", - "The legend is rendered inside the chart area." - ], - "enum": [ - "HISTOGRAM_CHART_LEGEND_POSITION_UNSPECIFIED", - "BOTTOM_LEGEND", - "LEFT_LEGEND", - "RIGHT_LEGEND", - "TOP_LEGEND", - "NO_LEGEND", - "INSIDE_LEGEND" - ], - "description": "The position of the chart legend.", - "type": "string" + "$ref": "ManualRuleGroup" + } } }, - "id": "HistogramChartSpec", - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/histogram\"\u003ehistogram chart\u003c/a\u003e.\nA histogram chart groups data items into bins, displaying each bin as a\ncolumn of stacked items. Histograms are used to display the distribution\nof a dataset. Each column of items represents a range into which those\nitems fall. The number of bins can be chosen automatically or specified\nexplicitly." + "id": "ManualRule", + "description": "Allows you to manually organize the values in a source data column into\nbuckets with names of your choosing. For example, a pivot table that\naggregates population by state:\n\n +-------+-------------------+\n | State | SUM of Population |\n +-------+-------------------+\n | AK | 0.7 |\n | AL | 4.8 |\n | AR | 2.9 |\n ...\n +-------+-------------------+\ncould be turned into a pivot table that aggregates population by time zone\nby providing a list of groups (for example, groupName = 'Central',\nitems = ['AL', 'AR', 'IA', ...]) to a manual group rule.\nNote that a similar effect could be achieved by adding a time zone column\nto the source data and adjusting the pivot table.\n\n +-----------+-------------------+\n | Time Zone | SUM of Population |\n +-----------+-------------------+\n | Central | 106.3 |\n | Eastern | 151.9 |\n | Mountain | 17.4 |\n ...\n +-----------+-------------------+" }, - "UpdateValuesResponse": { - "description": "The response when updating a range of values in a spreadsheet.", + "DeleteConditionalFormatRuleRequest": { "type": "object", "properties": { - "updatedData": { - "$ref": "ValueRange", - "description": "The values of the cells after updates were applied.\nThis is only included if the request's `includeValuesInResponse` field\nwas `true`." - }, - "updatedRows": { - "description": "The number of rows where at least one cell in the row was updated.", + "sheetId": { + "description": "The sheet the rule is being deleted from.", "format": "int32", "type": "integer" }, - "updatedColumns": { - "description": "The number of columns where at least one cell in the column was updated.", + "index": { + "description": "The zero-based index of the rule to be deleted.", "format": "int32", "type": "integer" - }, - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", - "type": "string" - }, - "updatedRange": { - "description": "The range (in A1 notation) that updates were applied to.", + } + }, + "id": "DeleteConditionalFormatRuleRequest", + "description": "Deletes a conditional format rule at the given index.\nAll subsequent rules' indexes are decremented." + }, + "DeleteNamedRangeRequest": { + "id": "DeleteNamedRangeRequest", + "description": "Removes the named range with the given ID from the spreadsheet.", + "type": "object", + "properties": { + "namedRangeId": { + "description": "The ID of the named range to delete.", "type": "string" - }, - "updatedCells": { - "description": "The number of cells updated.", - "format": "int32", - "type": "integer" + } + } + }, + "AddBandingResponse": { + "type": "object", + "properties": { + "bandedRange": { + "$ref": "BandedRange", + "description": "The banded range that was added." + } + }, + "id": "AddBandingResponse", + "description": "The result of adding a banded range." + }, + "AddDimensionGroupResponse": { + "description": "The result of adding a group.", + "type": "object", + "properties": { + "dimensionGroups": { + "type": "array", + "items": { + "$ref": "DimensionGroup" + }, + "description": "All groups of a dimension after adding a group to that dimension." } }, - "id": "UpdateValuesResponse" + "id": "AddDimensionGroupResponse" }, - "WaterfallChartSeries": { - "description": "A single series of data for a waterfall chart.", + "ManualRuleGroup": { "type": "object", "properties": { - "customSubtotals": { - "description": "Custom subtotal columns appearing in this series. The order in which\nsubtotals are defined is not significant. Only one subtotal may be\ndefined for each data point.", + "items": { "type": "array", "items": { - "$ref": "WaterfallChartCustomSubtotal" - } - }, - "subtotalColumnsStyle": { - "$ref": "WaterfallChartColumnStyle", - "description": "Styles for all subtotal columns in this series." - }, - "positiveColumnsStyle": { - "$ref": "WaterfallChartColumnStyle", - "description": "Styles for all columns in this series with positive values." - }, - "hideTrailingSubtotal": { - "description": "True to hide the subtotal column from the end of the series. By default,\na subtotal column will appear at the end of each series. Setting this\nfield to true will hide that subtotal column for this series.", - "type": "boolean" - }, - "data": { - "$ref": "ChartData", - "description": "The data being visualized in this series." + "$ref": "ExtendedValue" + }, + "description": "The items in the source data that should be placed into this group. Each\nitem may be a string, number, or boolean. Items may appear in at most one\ngroup within a given ManualRule. Items that do not appear in any\ngroup will appear on their own." }, - "negativeColumnsStyle": { - "$ref": "WaterfallChartColumnStyle", - "description": "Styles for all columns in this series with negative values." + "groupName": { + "description": "The group name, which must be a string. Each group in a given\nManualRule must have a unique group name.", + "$ref": "ExtendedValue" } }, - "id": "WaterfallChartSeries" + "id": "ManualRuleGroup", + "description": "A group name and a list of items from the source data that should be placed\nin the group with this name." }, - "PivotGroupSortValueBucket": { - "description": "Information about which values in a pivot group should be used for sorting.", + "PivotGroup": { "type": "object", "properties": { - "valuesIndex": { - "description": "The offset in the PivotTable.values list which the values in this\ngrouping should be sorted by.", - "format": "int32", - "type": "integer" + "sortOrder": { + "enum": [ + "SORT_ORDER_UNSPECIFIED", + "ASCENDING", + "DESCENDING" + ], + "description": "The order the values in this group should be sorted.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use this.", + "Sort ascending.", + "Sort descending." + ] }, - "buckets": { - "description": "Determines the bucket from which values are chosen to sort.\n\nFor example, in a pivot table with one row group & two column groups,\nthe row group can list up to two values. The first value corresponds\nto a value within the first column group, and the second value\ncorresponds to a value in the second column group. If no values\nare listed, this would indicate that the row should be sorted according\nto the \"Grand Total\" over the column groups. If a single value is listed,\nthis would correspond to using the \"Total\" of that bucket.", + "valueBucket": { + "$ref": "PivotGroupSortValueBucket", + "description": "The bucket of the opposite pivot group to sort by.\nIf not specified, sorting is alphabetical by this group's values." + }, + "showTotals": { + "description": "True if the pivot table should include the totals for this grouping.", + "type": "boolean" + }, + "valueMetadata": { + "description": "Metadata about values in the grouping.", "type": "array", "items": { - "$ref": "ExtendedValue" + "$ref": "PivotGroupValueMetadata" } + }, + "groupRule": { + "$ref": "PivotGroupRule", + "description": "The group rule to apply to this row/column group." + }, + "label": { + "type": "string", + "description": "The labels to use for the row/column groups which can be customized. For\nexample, in the following pivot table, the row label is `Region` (which\ncould be renamed to `State`) and the column label is `Product` (which\ncould be renamed `Item`). Pivot tables created before December 2017 do\nnot have header labels. If you'd like to add header labels to an existing\npivot table, please delete the existing pivot table and then create a new\npivot table with same parameters.\n\n +--------------+---------+-------+\n | SUM of Units | Product | |\n | Region | Pen | Paper |\n +--------------+---------+-------+\n | New York | 345 | 98 |\n | Oregon | 234 | 123 |\n | Tennessee | 531 | 415 |\n +--------------+---------+-------+\n | Grand Total | 1110 | 636 |\n +--------------+---------+-------+" + }, + "repeatHeadings": { + "description": "True if the headings in this pivot group should be repeated.\nThis is only valid for row groupings and is ignored by columns.\n\nBy default, we minimize repitition of headings by not showing higher\nlevel headings where they are the same. For example, even though the\nthird row below corresponds to \"Q1 Mar\", \"Q1\" is not shown because\nit is redundant with previous rows. Setting repeat_headings to true\nwould cause \"Q1\" to be repeated for \"Feb\" and \"Mar\".\n\n +--------------+\n | Q1 | Jan |\n | | Feb |\n | | Mar |\n +--------+-----+\n | Q1 Total |\n +--------------+", + "type": "boolean" + }, + "sourceColumnOffset": { + "description": "The column offset of the source range that this grouping is based on.\n\nFor example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`\nmeans this group refers to column `C`, whereas the offset `1` would refer\nto column `D`.", + "format": "int32", + "type": "integer" } }, - "id": "PivotGroupSortValueBucket" + "id": "PivotGroup", + "description": "A single grouping (either row or column) in a pivot table." }, - "DeleteDeveloperMetadataRequest": { + "TrimWhitespaceResponse": { "type": "object", "properties": { - "dataFilter": { - "description": "The data filter describing the criteria used to select which developer\nmetadata entry to delete.", - "$ref": "DataFilter" + "cellsChangedCount": { + "description": "The number of cells that were trimmed of whitespace.", + "format": "int32", + "type": "integer" } }, - "id": "DeleteDeveloperMetadataRequest", - "description": "A request to delete developer metadata." + "id": "TrimWhitespaceResponse", + "description": "The result of trimming whitespace in cells." }, - "CandlestickData": { - "description": "The Candlestick chart data, each containing the low, open, close, and high\nvalues for a series.", + "PivotTable": { + "description": "A pivot table.", "type": "object", "properties": { - "highSeries": { - "$ref": "CandlestickSeries", - "description": "The range data (vertical axis) for the high/maximum value for each\ncandle. This is the top of the candle's center line." + "criteria": { + "additionalProperties": { + "$ref": "PivotFilterCriteria" + }, + "description": "An optional mapping of filters per source column offset.\n\nThe filters are applied before aggregating data into the pivot table.\nThe map's key is the column offset of the source range that you want to\nfilter, and the value is the criteria for that column.\n\nFor example, if the source was `C10:E15`, a key of `0` will have the filter\nfor column `C`, whereas the key `1` is for column `D`.", + "type": "object" }, - "lowSeries": { - "$ref": "CandlestickSeries", - "description": "The range data (vertical axis) for the low/minimum value for each candle.\nThis is the bottom of the candle's center line." + "rows": { + "description": "Each row grouping in the pivot table.", + "type": "array", + "items": { + "$ref": "PivotGroup" + } }, - "closeSeries": { - "description": "The range data (vertical axis) for the close/final value for each candle.\nThis is the top of the candle body. If greater than the open value the\ncandle will be filled. Otherwise the candle will be hollow.", - "$ref": "CandlestickSeries" + "valueLayout": { + "enum": [ + "HORIZONTAL", + "VERTICAL" + ], + "description": "Whether values should be listed horizontally (as columns)\nor vertically (as rows).", + "type": "string", + "enumDescriptions": [ + "Values are laid out horizontally (as columns).", + "Values are laid out vertically (as rows)." + ] }, - "openSeries": { - "description": "The range data (vertical axis) for the open/initial value for each\ncandle. This is the bottom of the candle body. If less than the close\nvalue the candle will be filled. Otherwise the candle will be hollow.", - "$ref": "CandlestickSeries" + "values": { + "type": "array", + "items": { + "$ref": "PivotValue" + }, + "description": "A list of values to include in the pivot table." + }, + "source": { + "description": "The range the pivot table is reading data from.", + "$ref": "GridRange" + }, + "columns": { + "type": "array", + "items": { + "$ref": "PivotGroup" + }, + "description": "Each column grouping in the pivot table." } }, - "id": "CandlestickData" + "id": "PivotTable" }, - "DeleteProtectedRangeRequest": { - "description": "Deletes the protected range with the given ID.", + "SearchDeveloperMetadataResponse": { + "description": "A reply to a developer metadata search request.", "type": "object", "properties": { - "protectedRangeId": { - "description": "The ID of the protected range to delete.", - "format": "int32", - "type": "integer" + "matchedDeveloperMetadata": { + "description": "The metadata matching the criteria of the search request.", + "type": "array", + "items": { + "$ref": "MatchedDeveloperMetadata" + } } }, - "id": "DeleteProtectedRangeRequest" + "id": "SearchDeveloperMetadataResponse" }, - "InterpolationPoint": { - "description": "A single interpolation point on a gradient conditional format.\nThese pin the gradient color scale according to the color,\ntype and value chosen.", + "AppendCellsRequest": { + "description": "Adds new cells after the last row with data in a sheet,\ninserting new rows into the sheet if necessary.", "type": "object", "properties": { - "color": { - "$ref": "Color", - "description": "The color this interpolation point should use." + "rows": { + "description": "The data to append.", + "type": "array", + "items": { + "$ref": "RowData" + } }, - "type": { - "enumDescriptions": [ - "The default value, do not use.", - "The interpolation point uses the minimum value in the\ncells over the range of the conditional format.", - "The interpolation point uses the maximum value in the\ncells over the range of the conditional format.", - "The interpolation point uses exactly the value in\nInterpolationPoint.value.", - "The interpolation point is the given percentage over\nall the cells in the range of the conditional format.\nThis is equivalent to NUMBER if the value was:\n`=(MAX(FLATTEN(range)) * (value / 100))\n + (MIN(FLATTEN(range)) * (1 - (value / 100)))`\n(where errors in the range are ignored when flattening).", - "The interpolation point is the given percentile\nover all the cells in the range of the conditional format.\nThis is equivalent to NUMBER if the value was:\n`=PERCENTILE(FLATTEN(range), value / 100)`\n(where errors in the range are ignored when flattening)." - ], - "enum": [ - "INTERPOLATION_POINT_TYPE_UNSPECIFIED", - "MIN", - "MAX", - "NUMBER", - "PERCENT", - "PERCENTILE" - ], - "description": "How the value should be interpreted.", + "fields": { + "description": "The fields of CellData that should be updated.\nAt least one field must be specified.\nThe root is the CellData; 'row.values.' should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", "type": "string" }, - "value": { - "type": "string", - "description": "The value this interpolation point uses. May be a formula.\nUnused if type is MIN or\nMAX." + "sheetId": { + "type": "integer", + "description": "The sheet ID to append the data to.", + "format": "int32" } }, - "id": "InterpolationPoint" + "id": "AppendCellsRequest" }, - "FindReplaceResponse": { + "TextFormatRun": { + "description": "A run of a text format. The format of this run continues until the start\nindex of the next run.\nWhen updating, all fields must be set.", "type": "object", "properties": { - "rowsChanged": { - "description": "The number of rows changed.", + "startIndex": { + "description": "The character index where this run starts.", "format": "int32", "type": "integer" }, - "sheetsChanged": { - "description": "The number of sheets changed.", + "format": { + "description": "The format of this run. Absent values inherit the cell's format.", + "$ref": "TextFormat" + } + }, + "id": "TextFormatRun" + }, + "BatchUpdateValuesByDataFilterResponse": { + "id": "BatchUpdateValuesByDataFilterResponse", + "description": "The response when updating a range of values in a spreadsheet.", + "type": "object", + "properties": { + "totalUpdatedCells": { + "description": "The total number of cells updated.", "format": "int32", "type": "integer" }, - "formulasChanged": { - "description": "The number of formula cells changed.", + "totalUpdatedColumns": { + "description": "The total number of columns where at least one cell in the column was\nupdated.", "format": "int32", "type": "integer" }, - "valuesChanged": { - "description": "The number of non-formula cells changed.", + "spreadsheetId": { + "type": "string", + "description": "The spreadsheet the updates were applied to." + }, + "totalUpdatedRows": { + "description": "The total number of rows where at least one cell in the row was updated.", "format": "int32", "type": "integer" }, - "occurrencesChanged": { - "description": "The number of occurrences (possibly multiple within a cell) changed.\nFor example, if replacing `\"e\"` with `\"o\"` in `\"Google Sheets\"`, this would\nbe `\"3\"` because `\"Google Sheets\"` -\u003e `\"Googlo Shoots\"`.", + "responses": { + "description": "The response for each range updated.", + "type": "array", + "items": { + "$ref": "UpdateValuesByDataFilterResponse" + } + }, + "totalUpdatedSheets": { + "description": "The total number of sheets where at least one cell in the sheet was\nupdated.", "format": "int32", "type": "integer" } + } + }, + "RowData": { + "type": "object", + "properties": { + "values": { + "description": "The values in the row, one per column.", + "type": "array", + "items": { + "$ref": "CellData" + } + } }, - "id": "FindReplaceResponse", - "description": "The result of the find/replace." + "id": "RowData", + "description": "Data about each cell in a row." }, - "DuplicateFilterViewRequest": { + "Border": { "type": "object", "properties": { - "filterId": { - "description": "The ID of the filter being duplicated.", + "color": { + "$ref": "Color", + "description": "The color of the border." + }, + "width": { + "description": "The width of the border, in pixels.\nDeprecated; the width is determined by the \"style\" field.", "format": "int32", "type": "integer" + }, + "style": { + "description": "The style of the border.", + "type": "string", + "enumDescriptions": [ + "The style is not specified. Do not use this.", + "The border is dotted.", + "The border is dashed.", + "The border is a thin solid line.", + "The border is a medium solid line.", + "The border is a thick solid line.", + "No border.\nUsed only when updating a border in order to erase it.", + "The border is two solid lines." + ], + "enum": [ + "STYLE_UNSPECIFIED", + "DOTTED", + "DASHED", + "SOLID", + "SOLID_MEDIUM", + "SOLID_THICK", + "NONE", + "DOUBLE" + ] } }, - "id": "DuplicateFilterViewRequest", - "description": "Duplicates a particular filter view." + "id": "Border", + "description": "A border along a cell." }, - "UpdateConditionalFormatRuleResponse": { - "description": "The result of updating a conditional format rule.", + "GridData": { + "description": "Data in the grid, as well as metadata about the dimensions.", "type": "object", "properties": { - "oldIndex": { - "description": "The old index of the rule. Not set if a rule was replaced\n(because it is the same as new_index).", + "rowData": { + "type": "array", + "items": { + "$ref": "RowData" + }, + "description": "The data in the grid, one entry per row,\nstarting with the row in startRow.\nThe values in RowData will correspond to columns starting\nat start_column." + }, + "startRow": { + "description": "The first row this GridData refers to, zero-based.", "format": "int32", "type": "integer" }, - "newRule": { - "description": "The new rule that replaced the old rule (if replacing),\nor the rule that was moved (if moved)", - "$ref": "ConditionalFormatRule" + "columnMetadata": { + "type": "array", + "items": { + "$ref": "DimensionProperties" + }, + "description": "Metadata about the requested columns in the grid, starting with the column\nin start_column." }, - "oldRule": { - "description": "The old (deleted) rule. Not set if a rule was moved\n(because it is the same as new_rule).", - "$ref": "ConditionalFormatRule" + "startColumn": { + "type": "integer", + "description": "The first column this GridData refers to, zero-based.", + "format": "int32" }, - "newIndex": { - "description": "The index of the new rule.", - "format": "int32", - "type": "integer" + "rowMetadata": { + "description": "Metadata about the requested rows in the grid, starting with the row\nin start_row.", + "type": "array", + "items": { + "$ref": "DimensionProperties" + } } }, - "id": "UpdateConditionalFormatRuleResponse" - }, - "ConditionValue": { - "description": "The value of the condition.", - "type": "object", - "properties": { - "relativeDate": { - "enumDescriptions": [ - "Default value, do not use.", - "The value is one year before today.", - "The value is one month before today.", - "The value is one week before today.", - "The value is yesterday.", - "The value is today.", - "The value is tomorrow." + "id": "GridData" + } + }, + "protocol": "rest", + "icons": { + "x32": "http://www.google.com/images/icons/product/search-32.gif", + "x16": "http://www.google.com/images/icons/product/search-16.gif" + }, + "canonicalName": "Sheets", + "auth": { + "oauth2": { + "scopes": { + "https://www.googleapis.com/auth/drive.file": { + "description": "View and manage Google Drive files and folders that you have opened or created with this app" + }, + "https://www.googleapis.com/auth/drive": { + "description": "See, edit, create, and delete all of your Google Drive files" + }, + "https://www.googleapis.com/auth/drive.readonly": { + "description": "See and download all your Google Drive files" + }, + "https://www.googleapis.com/auth/spreadsheets.readonly": { + "description": "View your Google Spreadsheets" + }, + "https://www.googleapis.com/auth/spreadsheets": { + "description": "See, edit, create, and delete your spreadsheets in Google Drive" + } + } + } + }, + "rootUrl": "https://sheets.googleapis.com/", + "ownerDomain": "google.com", + "name": "sheets", + "batchPath": "batch", + "fullyEncodeReservedExpansion": true, + "title": "Google Sheets API", + "ownerName": "Google", + "resources": { + "spreadsheets": { + "methods": { + "create": { + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" ], - "enum": [ - "RELATIVE_DATE_UNSPECIFIED", - "PAST_YEAR", - "PAST_MONTH", - "PAST_WEEK", - "YESTERDAY", - "TODAY", - "TOMORROW" + "parameters": {}, + "flatPath": "v4/spreadsheets", + "path": "v4/spreadsheets", + "id": "sheets.spreadsheets.create", + "request": { + "$ref": "Spreadsheet" + }, + "description": "Creates a spreadsheet, returning the newly created spreadsheet.", + "response": { + "$ref": "Spreadsheet" + }, + "parameterOrder": [], + "httpMethod": "POST" + }, + "batchUpdate": { + "flatPath": "v4/spreadsheets/{spreadsheetId}:batchUpdate", + "id": "sheets.spreadsheets.batchUpdate", + "path": "v4/spreadsheets/{spreadsheetId}:batchUpdate", + "request": { + "$ref": "BatchUpdateSpreadsheetRequest" + }, + "description": "Applies one or more updates to the spreadsheet.\n\nEach request is validated before\nbeing applied. If any request is not valid then the entire request will\nfail and nothing will be applied.\n\nSome requests have replies to\ngive you some information about how\nthey are applied. The replies will mirror the requests. For example,\nif you applied 4 updates and the 3rd one had a reply, then the\nresponse will have 2 empty replies, the actual reply, and another empty\nreply, in that order.\n\nDue to the collaborative nature of spreadsheets, it is not guaranteed that\nthe spreadsheet will reflect exactly your changes after this completes,\nhowever it is guaranteed that the updates in the request will be\napplied together atomically. Your changes may be altered with respect to\ncollaborator changes. If there are no collaborators, the spreadsheet\nshould reflect your changes.", + "httpMethod": "POST", + "parameterOrder": [ + "spreadsheetId" ], - "description": "A relative date (based on the current date).\nValid only if the type is\nDATE_BEFORE,\nDATE_AFTER,\nDATE_ON_OR_BEFORE or\nDATE_ON_OR_AFTER.\n\nRelative dates are not supported in data validation.\nThey are supported only in conditional formatting and\nconditional filters.", - "type": "string" + "response": { + "$ref": "BatchUpdateSpreadsheetResponse" + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The spreadsheet to apply the updates to.", + "required": true, + "type": "string" + } + } }, - "userEnteredValue": { - "description": "A value the condition is based on.\nThe value is parsed as if the user typed into a cell.\nFormulas are supported (and must begin with an `=` or a '+').", - "type": "string" - } - }, - "id": "ConditionValue" - }, - "DateTimeRule": { - "description": "Allows you to organize the date-time values in a source data column into\nbuckets based on selected parts of their date or time values. For example,\nconsider a pivot table showing sales transactions by date:\n\n +----------+--------------+\n | Date | SUM of Sales |\n +----------+--------------+\n | 1/1/2017 | $621.14 |\n | 2/3/2017 | $708.84 |\n | 5/8/2017 | $326.84 |\n ...\n +----------+--------------+\nApplying a date-time group rule with a DateTimeRuleType of YEAR_MONTH\nresults in the following pivot table.\n\n +--------------+--------------+\n | Grouped Date | SUM of Sales |\n +--------------+--------------+\n | 2017-Jan | $53,731.78 |\n | 2017-Feb | $83,475.32 |\n | 2017-Mar | $94,385.05 |\n ...\n +--------------+--------------+", - "type": "object", - "properties": { - "type": { - "type": "string", - "enumDescriptions": [ - "The default type, do not use.", - "Group dates by second, from 0 to 59.", - "Group dates by minute, from 0 to 59.", - "Group dates by hour using a 24-hour system, from 0 to 23.", - "Group dates by hour and minute using a 24-hour system, for example 19:45.", - "Group dates by hour and minute using a 12-hour system, for example 7:45\nPM. The AM/PM designation is translated based on the spreadsheet\nlocale.", - "Group dates by day of week, for example Sunday. The days of the week will\nbe translated based on the spreadsheet locale.", - "Group dates by day of year, from 1 to 366. Note that dates after Feb. 29\nfall in different buckets in leap years than in non-leap years.", - "Group dates by day of month, from 1 to 31.", - "Group dates by day and month, for example 22-Nov. The month is\ntranslated based on the spreadsheet locale.", - "Group dates by month, for example Nov. The month is translated based\non the spreadsheet locale.", - "Group dates by quarter, for example Q1 (which represents Jan-Mar).", - "Group dates by year, for example 2008.", - "Group dates by year and month, for example 2008-Nov. The month is\ntranslated based on the spreadsheet locale.", - "Group dates by year and quarter, for example 2008 Q4.", - "Group dates by year, month, and day, for example 2008-11-22." + "get": { + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/drive.readonly", + "https://www.googleapis.com/auth/spreadsheets", + "https://www.googleapis.com/auth/spreadsheets.readonly" ], - "enum": [ - "DATE_TIME_RULE_TYPE_UNSPECIFIED", - "SECOND", - "MINUTE", - "HOUR", - "HOUR_MINUTE", - "HOUR_MINUTE_AMPM", - "DAY_OF_WEEK", - "DAY_OF_YEAR", - "DAY_OF_MONTH", - "DAY_MONTH", - "MONTH", - "QUARTER", - "YEAR", - "YEAR_MONTH", - "YEAR_QUARTER", - "YEAR_MONTH_DAY" + "parameters": { + "ranges": { + "type": "string", + "repeated": true, + "location": "query", + "description": "The ranges to retrieve from the spreadsheet." + }, + "includeGridData": { + "description": "True if grid data should be returned.\nThis parameter is ignored if a field mask was set in the request.", + "type": "boolean", + "location": "query" + }, + "spreadsheetId": { + "location": "path", + "description": "The spreadsheet to request.", + "required": true, + "type": "string" + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}", + "path": "v4/spreadsheets/{spreadsheetId}", + "id": "sheets.spreadsheets.get", + "description": "Returns the spreadsheet at the given ID.\nThe caller must specify the spreadsheet ID.\n\nBy default, data within grids will not be returned.\nYou can include grid data one of two ways:\n\n* Specify a field mask listing your desired fields using the `fields` URL\nparameter in HTTP\n\n* Set the includeGridData\nURL parameter to true. If a field mask is set, the `includeGridData`\nparameter is ignored\n\nFor large spreadsheets, it is recommended to retrieve only the specific\nfields of the spreadsheet that you want.\n\nTo retrieve only subsets of the spreadsheet, use the\nranges URL parameter.\nMultiple ranges can be specified. Limiting the range will\nreturn only the portions of the spreadsheet that intersect the requested\nranges. Ranges are specified using A1 notation.", + "response": { + "$ref": "Spreadsheet" + }, + "parameterOrder": [ + "spreadsheetId" + ], + "httpMethod": "GET" + }, + "getByDataFilter": { + "description": "Returns the spreadsheet at the given ID.\nThe caller must specify the spreadsheet ID.\n\nThis method differs from GetSpreadsheet in that it allows selecting\nwhich subsets of spreadsheet data to return by specifying a\ndataFilters parameter.\nMultiple DataFilters can be specified. Specifying one or\nmore data filters will return the portions of the spreadsheet that\nintersect ranges matched by any of the filters.\n\nBy default, data within grids will not be returned.\nYou can include grid data one of two ways:\n\n* Specify a field mask listing your desired fields using the `fields` URL\nparameter in HTTP\n\n* Set the includeGridData\nparameter to true. If a field mask is set, the `includeGridData`\nparameter is ignored\n\nFor large spreadsheets, it is recommended to retrieve only the specific\nfields of the spreadsheet that you want.", + "request": { + "$ref": "GetSpreadsheetByDataFilterRequest" + }, + "response": { + "$ref": "Spreadsheet" + }, + "parameterOrder": [ + "spreadsheetId" + ], + "httpMethod": "POST", + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The spreadsheet to request.", + "required": true, + "type": "string" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" ], - "description": "The type of date-time grouping to apply." + "flatPath": "v4/spreadsheets/{spreadsheetId}:getByDataFilter", + "path": "v4/spreadsheets/{spreadsheetId}:getByDataFilter", + "id": "sheets.spreadsheets.getByDataFilter" } }, - "id": "DateTimeRule" - }, - "HistogramSeries": { - "id": "HistogramSeries", - "description": "A histogram series containing the series color and data.", - "type": "object", - "properties": { - "barColor": { - "description": "The color of the column representing this series in each bucket.\nThis field is optional.", - "$ref": "Color" - }, - "data": { - "$ref": "ChartData", - "description": "The data for this histogram series." - } - } - }, - "Spreadsheet": { - "id": "Spreadsheet", - "description": "Resource that represents a spreadsheet.", - "type": "object", - "properties": { - "properties": { - "$ref": "SpreadsheetProperties", - "description": "Overall properties of a spreadsheet." - }, - "spreadsheetId": { - "type": "string", - "description": "The ID of the spreadsheet.\nThis field is read-only." - }, - "namedRanges": { - "description": "The named ranges defined in a spreadsheet.", - "type": "array", - "items": { - "$ref": "NamedRange" + "resources": { + "developerMetadata": { + "methods": { + "search": { + "response": { + "$ref": "SearchDeveloperMetadataResponse" + }, + "parameterOrder": [ + "spreadsheetId" + ], + "httpMethod": "POST", + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to retrieve metadata from.", + "required": true, + "type": "string" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/developerMetadata:search", + "path": "v4/spreadsheets/{spreadsheetId}/developerMetadata:search", + "id": "sheets.spreadsheets.developerMetadata.search", + "description": "Returns all developer metadata matching the specified DataFilter.\nIf the provided DataFilter represents a DeveloperMetadataLookup object,\nthis will return all DeveloperMetadata entries selected by it. If the\nDataFilter represents a location in a spreadsheet, this will return all\ndeveloper metadata associated with locations intersecting that region.", + "request": { + "$ref": "SearchDeveloperMetadataRequest" + } + }, + "get": { + "httpMethod": "GET", + "response": { + "$ref": "DeveloperMetadata" + }, + "parameterOrder": [ + "spreadsheetId", + "metadataId" + ], + "parameters": { + "spreadsheetId": { + "required": true, + "type": "string", + "location": "path", + "description": "The ID of the spreadsheet to retrieve metadata from." + }, + "metadataId": { + "description": "The ID of the developer metadata to retrieve.", + "format": "int32", + "required": true, + "type": "integer", + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}", + "id": "sheets.spreadsheets.developerMetadata.get", + "path": "v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}", + "description": "Returns the developer metadata with the specified ID.\nThe caller must specify the spreadsheet ID and the developer metadata's\nunique metadataId." + } } }, - "developerMetadata": { - "description": "The developer metadata associated with a spreadsheet.", - "type": "array", - "items": { - "$ref": "DeveloperMetadata" + "values": { + "methods": { + "append": { + "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}:append", + "id": "sheets.spreadsheets.values.append", + "path": "v4/spreadsheets/{spreadsheetId}/values/{range}:append", + "description": "Appends values to a spreadsheet. The input range is used to search for\nexisting data and find a \"table\" within that range. Values will be\nappended to the next row of the table, starting with the first column of\nthe table. See the\n[guide](/sheets/api/guides/values#appending_values)\nand\n[sample code](/sheets/api/samples/writing#append_values)\nfor specific details of how tables are detected and data is appended.\n\nThe caller must specify the spreadsheet ID, range, and\na valueInputOption. The `valueInputOption` only\ncontrols how the input data will be added to the sheet (column-wise or\nrow-wise), it does not influence what cell the data starts being written\nto.", + "request": { + "$ref": "ValueRange" + }, + "httpMethod": "POST", + "parameterOrder": [ + "spreadsheetId", + "range" + ], + "response": { + "$ref": "AppendValuesResponse" + }, + "parameters": { + "range": { + "location": "path", + "description": "The A1 notation of a range to search for a logical table of data.\nValues will be appended after the last row of the table.", + "required": true, + "type": "string" + }, + "includeValuesInResponse": { + "location": "query", + "description": "Determines if the update response should include the values\nof the cells that were appended. By default, responses\ndo not include the updated values.", + "type": "boolean" + }, + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to update.", + "required": true, + "type": "string" + }, + "responseValueRenderOption": { + "type": "string", + "location": "query", + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" + ], + "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE." + }, + "insertDataOption": { + "location": "query", + "enum": [ + "OVERWRITE", + "INSERT_ROWS" + ], + "description": "How the input data should be inserted.", + "type": "string" + }, + "valueInputOption": { + "location": "query", + "enum": [ + "INPUT_VALUE_OPTION_UNSPECIFIED", + "RAW", + "USER_ENTERED" + ], + "description": "How the input data should be interpreted.", + "type": "string" + }, + "responseDateTimeRenderOption": { + "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", + "type": "string", + "location": "query", + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ] + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ] + }, + "batchGetByDataFilter": { + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to retrieve data from.", + "required": true, + "type": "string" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter", + "id": "sheets.spreadsheets.values.batchGetByDataFilter", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter", + "description": "Returns one or more ranges of values that match the specified data filters.\nThe caller must specify the spreadsheet ID and one or more\nDataFilters. Ranges that match any of the data filters in\nthe request will be returned.", + "request": { + "$ref": "BatchGetValuesByDataFilterRequest" + }, + "httpMethod": "POST", + "parameterOrder": [ + "spreadsheetId" + ], + "response": { + "$ref": "BatchGetValuesByDataFilterResponse" + } + }, + "batchClear": { + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchClear", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchClear", + "id": "sheets.spreadsheets.values.batchClear", + "description": "Clears one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more ranges.\nOnly values are cleared -- all other properties of the cell (such as\nformatting, data validation, etc..) are kept.", + "request": { + "$ref": "BatchClearValuesRequest" + }, + "response": { + "$ref": "BatchClearValuesResponse" + }, + "parameterOrder": [ + "spreadsheetId" + ], + "httpMethod": "POST", + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to update.", + "required": true, + "type": "string" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ] + }, + "get": { + "description": "Returns a range of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and a range.", + "httpMethod": "GET", + "parameterOrder": [ + "spreadsheetId", + "range" + ], + "response": { + "$ref": "ValueRange" + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/drive.readonly", + "https://www.googleapis.com/auth/spreadsheets", + "https://www.googleapis.com/auth/spreadsheets.readonly" + ], + "parameters": { + "range": { + "required": true, + "type": "string", + "location": "path", + "description": "The A1 notation of the values to retrieve." + }, + "valueRenderOption": { + "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", + "type": "string", + "location": "query", + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" + ] + }, + "dateTimeRenderOption": { + "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", + "type": "string", + "location": "query", + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ] + }, + "majorDimension": { + "type": "string", + "location": "query", + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`." + }, + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to retrieve data from.", + "required": true, + "type": "string" + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}", + "id": "sheets.spreadsheets.values.get", + "path": "v4/spreadsheets/{spreadsheetId}/values/{range}" + }, + "update": { + "request": { + "$ref": "ValueRange" + }, + "description": "Sets values in a range of a spreadsheet.\nThe caller must specify the spreadsheet ID, range, and\na valueInputOption.", + "httpMethod": "PUT", + "parameterOrder": [ + "spreadsheetId", + "range" + ], + "response": { + "$ref": "UpdateValuesResponse" + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "spreadsheetId": { + "description": "The ID of the spreadsheet to update.", + "required": true, + "type": "string", + "location": "path" + }, + "responseValueRenderOption": { + "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", + "type": "string", + "location": "query", + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" + ] + }, + "valueInputOption": { + "location": "query", + "enum": [ + "INPUT_VALUE_OPTION_UNSPECIFIED", + "RAW", + "USER_ENTERED" + ], + "description": "How the input data should be interpreted.", + "type": "string" + }, + "responseDateTimeRenderOption": { + "location": "query", + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ], + "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER.", + "type": "string" + }, + "includeValuesInResponse": { + "location": "query", + "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values.\nIf the range to write was larger than than the range actually written,\nthe response will include all values in the requested range (excluding\ntrailing empty rows and columns).", + "type": "boolean" + }, + "range": { + "description": "The A1 notation of the values to update.", + "required": true, + "type": "string", + "location": "path" + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}", + "id": "sheets.spreadsheets.values.update", + "path": "v4/spreadsheets/{spreadsheetId}/values/{range}" + }, + "batchUpdateByDataFilter": { + "response": { + "$ref": "BatchUpdateValuesByDataFilterResponse" + }, + "parameterOrder": [ + "spreadsheetId" + ], + "httpMethod": "POST", + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to update.", + "required": true, + "type": "string" + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter", + "id": "sheets.spreadsheets.values.batchUpdateByDataFilter", + "request": { + "$ref": "BatchUpdateValuesByDataFilterRequest" + }, + "description": "Sets values in one or more ranges of a spreadsheet.\nThe caller must specify the spreadsheet ID,\na valueInputOption, and one or more\nDataFilterValueRanges." + }, + "batchUpdate": { + "description": "Sets values in one or more ranges of a spreadsheet.\nThe caller must specify the spreadsheet ID,\na valueInputOption, and one or more\nValueRanges.", + "request": { + "$ref": "BatchUpdateValuesRequest" + }, + "response": { + "$ref": "BatchUpdateValuesResponse" + }, + "parameterOrder": [ + "spreadsheetId" + ], + "httpMethod": "POST", + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to update.", + "required": true, + "type": "string" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchUpdate", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchUpdate", + "id": "sheets.spreadsheets.values.batchUpdate" + }, + "clear": { + "description": "Clears values from a spreadsheet.\nThe caller must specify the spreadsheet ID and range.\nOnly values are cleared -- all other properties of the cell (such as\nformatting, data validation, etc..) are kept.", + "request": { + "$ref": "ClearValuesRequest" + }, + "httpMethod": "POST", + "parameterOrder": [ + "spreadsheetId", + "range" + ], + "response": { + "$ref": "ClearValuesResponse" + }, + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to update.", + "required": true, + "type": "string" + }, + "range": { + "location": "path", + "description": "The A1 notation of the values to clear.", + "required": true, + "type": "string" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}:clear", + "id": "sheets.spreadsheets.values.clear", + "path": "v4/spreadsheets/{spreadsheetId}/values/{range}:clear" + }, + "batchGet": { + "httpMethod": "GET", + "parameterOrder": [ + "spreadsheetId" + ], + "response": { + "$ref": "BatchGetValuesResponse" + }, + "parameters": { + "ranges": { + "location": "query", + "description": "The A1 notation of the values to retrieve.", + "type": "string", + "repeated": true + }, + "majorDimension": { + "location": "query", + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.", + "type": "string" + }, + "spreadsheetId": { + "description": "The ID of the spreadsheet to retrieve data from.", + "required": true, + "type": "string", + "location": "path" + }, + "valueRenderOption": { + "type": "string", + "location": "query", + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" + ], + "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE." + }, + "dateTimeRenderOption": { + "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", + "type": "string", + "location": "query", + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ] + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/drive.readonly", + "https://www.googleapis.com/auth/spreadsheets", + "https://www.googleapis.com/auth/spreadsheets.readonly" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchGet", + "id": "sheets.spreadsheets.values.batchGet", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchGet", + "description": "Returns one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more ranges." + }, + "batchClearByDataFilter": { + "description": "Clears one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more\nDataFilters. Ranges matching any of the specified data\nfilters will be cleared. Only values are cleared -- all other properties\nof the cell (such as formatting, data validation, etc..) are kept.", + "request": { + "$ref": "BatchClearValuesByDataFilterRequest" + }, + "response": { + "$ref": "BatchClearValuesByDataFilterResponse" + }, + "parameterOrder": [ + "spreadsheetId" + ], + "httpMethod": "POST", + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to update.", + "required": true, + "type": "string" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter", + "id": "sheets.spreadsheets.values.batchClearByDataFilter" + } } }, "sheets": { - "description": "The sheets that are part of a spreadsheet.", - "type": "array", - "items": { - "$ref": "Sheet" + "methods": { + "copyTo": { + "request": { + "$ref": "CopySheetToAnotherSpreadsheetRequest" + }, + "description": "Copies a single sheet from a spreadsheet to another spreadsheet.\nReturns the properties of the newly created sheet.", + "httpMethod": "POST", + "parameterOrder": [ + "spreadsheetId", + "sheetId" + ], + "response": { + "$ref": "SheetProperties" + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "spreadsheetId": { + "description": "The ID of the spreadsheet containing the sheet to copy.", + "required": true, + "type": "string", + "location": "path" + }, + "sheetId": { + "location": "path", + "description": "The ID of the sheet to copy.", + "format": "int32", + "required": true, + "type": "integer" + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo", + "id": "sheets.spreadsheets.sheets.copyTo", + "path": "v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo" + } } - }, - "spreadsheetUrl": { - "type": "string", - "description": "The url of the spreadsheet.\nThis field is read-only." } } + } + }, + "parameters": { + "key": { + "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", + "type": "string", + "location": "query" }, - "BandedRange": { - "description": "A banded (alternating colors) range in a sheet.", - "type": "object", - "properties": { - "rowProperties": { - "$ref": "BandingProperties", - "description": "Properties for row bands. These properties are applied on a row-by-row\nbasis throughout all the rows in the range. At least one of\nrow_properties or column_properties must be specified." - }, - "columnProperties": { - "$ref": "BandingProperties", - "description": "Properties for column bands. These properties are applied on a column-\nby-column basis throughout all the columns in the range. At least one of\nrow_properties or column_properties must be specified." - }, - "range": { - "$ref": "GridRange", - "description": "The range over which these properties are applied." - }, - "bandedRangeId": { - "description": "The id of the banded range.", - "format": "int32", - "type": "integer" - } - }, - "id": "BandedRange" + "access_token": { + "location": "query", + "description": "OAuth access token.", + "type": "string" }, - "AddChartRequest": { - "description": "Adds a chart to a sheet in the spreadsheet.", - "type": "object", - "properties": { - "chart": { - "$ref": "EmbeddedChart", - "description": "The chart that should be added to the spreadsheet, including the position\nwhere it should be placed. The chartId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of an embedded object that already exists.)" - } - }, - "id": "AddChartRequest" + "upload_protocol": { + "type": "string", + "location": "query", + "description": "Upload protocol for media (e.g. \"raw\", \"multipart\")." }, - "HistogramRule": { - "type": "object", - "properties": { - "start": { - "description": "The minimum value at which items are placed into buckets\nof constant size. Values below start are lumped into a single bucket.\nThis field is optional.", - "format": "double", - "type": "number" - }, - "end": { - "description": "The maximum value at which items are placed into buckets\nof constant size. Values above end are lumped into a single bucket.\nThis field is optional.", - "format": "double", - "type": "number" - }, - "interval": { - "type": "number", - "description": "The size of the buckets that are created. Must be positive.", - "format": "double" - } - }, - "id": "HistogramRule", - "description": "Allows you to organize the numeric values in a source data column into\nbuckets of a constant size. All values from HistogramRule.start to\nHistogramRule.end are placed into groups of size\nHistogramRule.interval. In addition, all values below\nHistogramRule.start are placed in one group, and all values above\nHistogramRule.end are placed in another. Only\nHistogramRule.interval is required, though if HistogramRule.start\nand HistogramRule.end are both provided, HistogramRule.start must\nbe less than HistogramRule.end. For example, a pivot table showing\naverage purchase amount by age that has 50+ rows:\n\n +-----+-------------------+\n | Age | AVERAGE of Amount |\n +-----+-------------------+\n | 16 | $27.13 |\n | 17 | $5.24 |\n | 18 | $20.15 |\n ...\n +-----+-------------------+\ncould be turned into a pivot table that looks like the one below by\napplying a histogram group rule with a HistogramRule.start of 25,\nan HistogramRule.interval of 20, and an HistogramRule.end\nof 65.\n\n +-------------+-------------------+\n | Grouped Age | AVERAGE of Amount |\n +-------------+-------------------+\n | \u003c 25 | $19.34 |\n | 25-45 | $31.43 |\n | 45-65 | $35.87 |\n | \u003e 65 | $27.55 |\n +-------------+-------------------+\n | Grand Total | $29.12 |\n +-------------+-------------------+" + "quotaUser": { + "type": "string", + "location": "query", + "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters." }, - "UpdateProtectedRangeRequest": { - "id": "UpdateProtectedRangeRequest", - "description": "Updates an existing protected range with the specified\nprotectedRangeId.", - "type": "object", - "properties": { - "protectedRange": { - "description": "The protected range to update with the new properties.", - "$ref": "ProtectedRange" - }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `protectedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" - } - } - } - }, - "protocol": "rest", - "icons": { - "x32": "http://www.google.com/images/icons/product/search-32.gif", - "x16": "http://www.google.com/images/icons/product/search-16.gif" - }, - "canonicalName": "Sheets", - "auth": { - "oauth2": { - "scopes": { - "https://www.googleapis.com/auth/drive": { - "description": "See, edit, create, and delete all of your Google Drive files" - }, - "https://www.googleapis.com/auth/drive.readonly": { - "description": "See and download all your Google Drive files" - }, - "https://www.googleapis.com/auth/spreadsheets.readonly": { - "description": "View your Google Spreadsheets" - }, - "https://www.googleapis.com/auth/spreadsheets": { - "description": "See, edit, create, and delete your spreadsheets in Google Drive" - }, - "https://www.googleapis.com/auth/drive.file": { - "description": "View and manage Google Drive files and folders that you have opened or created with this app" - } - } + "prettyPrint": { + "description": "Returns response with indentations and line breaks.", + "type": "boolean", + "default": "true", + "location": "query" + }, + "uploadType": { + "location": "query", + "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").", + "type": "string" + }, + "fields": { + "type": "string", + "location": "query", + "description": "Selector specifying which fields to include in a partial response." + }, + "callback": { + "location": "query", + "description": "JSONP", + "type": "string" + }, + "oauth_token": { + "location": "query", + "description": "OAuth 2.0 token for the current user.", + "type": "string" + }, + "$.xgafv": { + "enumDescriptions": [ + "v1 error format", + "v2 error format" + ], + "location": "query", + "enum": [ + "1", + "2" + ], + "description": "V1 error format.", + "type": "string" + }, + "alt": { + "type": "string", + "enumDescriptions": [ + "Responses with Content-Type of application/json", + "Media download with context-dependent Content-Type", + "Responses with Content-Type of application/x-protobuf" + ], + "location": "query", + "description": "Data format for response.", + "default": "json", + "enum": [ + "json", + "media", + "proto" + ] } }, - "rootUrl": "https://sheets.googleapis.com/" + "version": "v4", + "baseUrl": "https://sheets.googleapis.com/", + "servicePath": "", + "description": "Reads and writes Google Sheets.", + "kind": "discovery#restDescription", + "basePath": "", + "id": "sheets:v4", + "documentationLink": "https://developers.google.com/sheets/", + "revision": "20191115" } From e57d854dbbb8fd28dd646c2d22819d9d820bc91d Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Thu, 21 Nov 2019 13:30:32 -0800 Subject: [PATCH 17/28] Re-ingest discovery doc If these "row order diffs" are a recurring phenomenon, I'll have to do something ... like sort properties alphabetically, inside schema_rectangle() --- R/sysdata.rda | Bin 42693 -> 42731 bytes data-raw/schemas/NamedRange | 6 +- data-raw/schemas/Sheet | 24 +- data-raw/schemas/SheetProperties | 16 +- data-raw/schemas/SpreadsheetProperties | 12 +- data-raw/sheets-v4_2019-11-15.json | 12220 +++++++++++------------ 6 files changed, 6139 insertions(+), 6139 deletions(-) diff --git a/R/sysdata.rda b/R/sysdata.rda index c88295fa2a509d0a17c9afdc3b801d501e706496..94b97989f5fda4ed78e87120cb4addf27b64e32c 100644 GIT binary patch literal 42731 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 literal 42693 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 diff --git a/data-raw/schemas/NamedRange b/data-raw/schemas/NamedRange index 20998e7e5..15e7f0562 100644 --- a/data-raw/schemas/NamedRange +++ b/data-raw/schemas/NamedRange @@ -2,6 +2,6 @@ # A tibble: 3 x 6 property type instance_of array_of format enum -1 name string -2 namedRangeId string -3 range object GridRange +1 namedRangeId string +2 range object GridRange +3 name string diff --git a/data-raw/schemas/Sheet b/data-raw/schemas/Sheet index a9d00a2b7..5d8beef46 100644 --- a/data-raw/schemas/Sheet +++ b/data-raw/schemas/Sheet @@ -2,16 +2,16 @@ # A tibble: 13 x 6 property type instance_of array_of format enum - 1 properties object SheetProperti… DimensionGroup ConditionalFormatR… GridData DeveloperMetadata ProtectedRange DeveloperMetadata GridRange BandedRange EmbeddedChart FilterView Slicer DimensionGroup GridData ConditionalFormatR… DimensionGroup GridRange BandedRange EmbeddedChart FilterView Slicer DimensionGroup -1 hidden boolean -2 sheetType enum -3 gridProperties object GridProperties -4 title string -5 index integer int32 -6 tabColor object Color -7 sheetId integer int32 -8 rightToLeft boolean +1 title string +2 tabColor object Color +3 index integer int32 +4 sheetId integer int32 +5 rightToLeft boolean +6 hidden boolean +7 gridProperties object GridProperties +8 sheetType enum diff --git a/data-raw/schemas/SpreadsheetProperties b/data-raw/schemas/SpreadsheetProperties index dfd3abef8..f60974c1d 100644 --- a/data-raw/schemas/SpreadsheetProperties +++ b/data-raw/schemas/SpreadsheetProperties @@ -2,9 +2,9 @@ # A tibble: 6 x 6 property type instance_of array_of format enum -1 autoRecalc enum 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 diff --git a/data-raw/schema-rectangling.R b/data-raw/schema-rectangling.R index f72bed807..ed9ade123 100644 --- a/data-raw/schema-rectangling.R +++ b/data-raw/schema-rectangling.R @@ -12,12 +12,12 @@ schema_rectangle <- function(s) { properties <- pluck(schema, "properties") scaffold <- list( - description = "Just a placeholder", - type = "scaffold", - "$ref" = "SCHEMA", - items = list("$ref" = "SCHEMA"), - format = "FORMAT", - enum = letters[1:3], + description = "Just a placeholder", + type = "scaffold", + "$ref" = "SCHEMA", + items = list("$ref" = "SCHEMA"), + format = "FORMAT", + enum = letters[1:3], enumDescriptions = LETTERS[1:3] ) df <- tibble(properties = c(scaffold = list(scaffold), properties)) @@ -46,5 +46,6 @@ schema_rectangle <- function(s) { mutate(type = if_else(map_lgl(enum, ~ nrow(.x) > 0), "enum", type)) df %>% - filter(property != "scaffold") + filter(property != "scaffold") %>% + arrange(property) } diff --git a/data-raw/schemas/GridRange b/data-raw/schemas/GridRange index a81e14d24..75126d78b 100644 --- a/data-raw/schemas/GridRange +++ b/data-raw/schemas/GridRange @@ -2,8 +2,8 @@ # A tibble: 5 x 6 property type instance_of array_of format enum -1 startRowIndex integer int32 -2 startColumnIndex integer int32 +1 endColumnIndex integer int32 +2 endRowIndex integer int32 3 sheetId integer int32 -4 endRowIndex integer int32 -5 endColumnIndex integer int32 +4 startColumnIndex integer int32 +5 startRowIndex integer int32 diff --git a/data-raw/schemas/NamedRange b/data-raw/schemas/NamedRange index 15e7f0562..20998e7e5 100644 --- a/data-raw/schemas/NamedRange +++ b/data-raw/schemas/NamedRange @@ -2,6 +2,6 @@ # A tibble: 3 x 6 property type instance_of array_of format enum -1 namedRangeId string -2 range object GridRange -3 name string +1 name string +2 namedRangeId string +3 range object GridRange diff --git a/data-raw/schemas/Sheet b/data-raw/schemas/Sheet index 5d8beef46..805c38818 100644 --- a/data-raw/schemas/Sheet +++ b/data-raw/schemas/Sheet @@ -2,16 +2,16 @@ # A tibble: 13 x 6 property type instance_of array_of format enum - 1 data array GridData DeveloperMetadata ProtectedRange BandedRange EmbeddedChart DimensionGroup ConditionalFormatR… DimensionGroup GridRange BandedRange EmbeddedChart FilterView Slicer DimensionGroup GridData DeveloperMetadata FilterView GridRange ProtectedRange DimensionGroup Slicer -1 title string -2 tabColor object Color +1 gridProperties object GridProperties +2 hidden boolean 3 index integer int32 -4 sheetId integer int32 -5 rightToLeft boolean -6 hidden boolean -7 gridProperties object GridProperties -8 sheetType enum +4 rightToLeft boolean +5 sheetId integer int32 +6 sheetType enum +7 tabColor object Color +8 title string diff --git a/data-raw/schemas/Spreadsheet b/data-raw/schemas/Spreadsheet index 8f3eea9e4..cc14ecba6 100644 --- a/data-raw/schemas/Spreadsheet +++ b/data-raw/schemas/Spreadsheet @@ -2,9 +2,9 @@ # A tibble: 6 x 6 property type instance_of array_of format enum -1 properties object SpreadsheetProperti… NamedRange DeveloperMetad… Sheet DeveloperMetad… NamedRange Sheet -1 locale string

O%qH7R76ZPGet!NR74adP=P{FgCIyT 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 bGn912NfvP6Q~%%ZX9X%% mutate(type = if_else(map_lgl(enum, ~ nrow(.x) > 0), "enum", type)) + attr(df, "id") <- s + df %>% filter(property != "scaffold") %>% arrange(property) diff --git a/data-raw/sheets-v4_2019-11-15.json b/data-raw/sheets-v4_2019-11-15.json index 45a7fe1ad..f70ba0aae 100644 --- a/data-raw/sheets-v4_2019-11-15.json +++ b/data-raw/sheets-v4_2019-11-15.json @@ -1,1931 +1,1161 @@ { - "ownerName": "Google", - "resources": { - "spreadsheets": { - "methods": { - "create": { - "httpMethod": "POST", - "parameterOrder": [], - "response": { - "$ref": "Spreadsheet" - }, - "parameters": {}, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets", - "id": "sheets.spreadsheets.create", - "path": "v4/spreadsheets", - "description": "Creates a spreadsheet, returning the newly created spreadsheet.", - "request": { - "$ref": "Spreadsheet" - } + "basePath": "", + "revision": "20191115", + "documentationLink": "https://developers.google.com/sheets/", + "id": "sheets:v4", + "discoveryVersion": "v1", + "version_module": true, + "schemas": { + "InterpolationPoint": { + "id": "InterpolationPoint", + "description": "A single interpolation point on a gradient conditional format.\nThese pin the gradient color scale according to the color,\ntype and value chosen.", + "type": "object", + "properties": { + "color": { + "$ref": "Color", + "description": "The color this interpolation point should use." }, - "batchUpdate": { - "description": "Applies one or more updates to the spreadsheet.\n\nEach request is validated before\nbeing applied. If any request is not valid then the entire request will\nfail and nothing will be applied.\n\nSome requests have replies to\ngive you some information about how\nthey are applied. The replies will mirror the requests. For example,\nif you applied 4 updates and the 3rd one had a reply, then the\nresponse will have 2 empty replies, the actual reply, and another empty\nreply, in that order.\n\nDue to the collaborative nature of spreadsheets, it is not guaranteed that\nthe spreadsheet will reflect exactly your changes after this completes,\nhowever it is guaranteed that the updates in the request will be\napplied together atomically. Your changes may be altered with respect to\ncollaborator changes. If there are no collaborators, the spreadsheet\nshould reflect your changes.", - "request": { - "$ref": "BatchUpdateSpreadsheetRequest" - }, - "httpMethod": "POST", - "parameterOrder": [ - "spreadsheetId" - ], - "response": { - "$ref": "BatchUpdateSpreadsheetResponse" - }, - "parameters": { - "spreadsheetId": { - "required": true, - "type": "string", - "location": "path", - "description": "The spreadsheet to apply the updates to." - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" + "type": { + "description": "How the value should be interpreted.", + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "The interpolation point uses the minimum value in the\ncells over the range of the conditional format.", + "The interpolation point uses the maximum value in the\ncells over the range of the conditional format.", + "The interpolation point uses exactly the value in\nInterpolationPoint.value.", + "The interpolation point is the given percentage over\nall the cells in the range of the conditional format.\nThis is equivalent to NUMBER if the value was:\n`=(MAX(FLATTEN(range)) * (value / 100))\n + (MIN(FLATTEN(range)) * (1 - (value / 100)))`\n(where errors in the range are ignored when flattening).", + "The interpolation point is the given percentile\nover all the cells in the range of the conditional format.\nThis is equivalent to NUMBER if the value was:\n`=PERCENTILE(FLATTEN(range), value / 100)`\n(where errors in the range are ignored when flattening)." ], - "flatPath": "v4/spreadsheets/{spreadsheetId}:batchUpdate", - "id": "sheets.spreadsheets.batchUpdate", - "path": "v4/spreadsheets/{spreadsheetId}:batchUpdate" + "enum": [ + "INTERPOLATION_POINT_TYPE_UNSPECIFIED", + "MIN", + "MAX", + "NUMBER", + "PERCENT", + "PERCENTILE" + ] }, - "get": { - "httpMethod": "GET", - "parameterOrder": [ - "spreadsheetId" - ], - "response": { - "$ref": "Spreadsheet" - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/drive.readonly", - "https://www.googleapis.com/auth/spreadsheets", - "https://www.googleapis.com/auth/spreadsheets.readonly" - ], - "parameters": { - "ranges": { - "type": "string", - "repeated": true, - "location": "query", - "description": "The ranges to retrieve from the spreadsheet." - }, - "includeGridData": { - "location": "query", - "description": "True if grid data should be returned.\nThis parameter is ignored if a field mask was set in the request.", - "type": "boolean" - }, - "spreadsheetId": { - "location": "path", - "description": "The spreadsheet to request.", - "required": true, - "type": "string" - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}", - "id": "sheets.spreadsheets.get", - "path": "v4/spreadsheets/{spreadsheetId}", - "description": "Returns the spreadsheet at the given ID.\nThe caller must specify the spreadsheet ID.\n\nBy default, data within grids will not be returned.\nYou can include grid data one of two ways:\n\n* Specify a field mask listing your desired fields using the `fields` URL\nparameter in HTTP\n\n* Set the includeGridData\nURL parameter to true. If a field mask is set, the `includeGridData`\nparameter is ignored\n\nFor large spreadsheets, it is recommended to retrieve only the specific\nfields of the spreadsheet that you want.\n\nTo retrieve only subsets of the spreadsheet, use the\nranges URL parameter.\nMultiple ranges can be specified. Limiting the range will\nreturn only the portions of the spreadsheet that intersect the requested\nranges. Ranges are specified using A1 notation." + "value": { + "description": "The value this interpolation point uses. May be a formula.\nUnused if type is MIN or\nMAX.", + "type": "string" + } + } + }, + "FindReplaceResponse": { + "description": "The result of the find/replace.", + "type": "object", + "properties": { + "valuesChanged": { + "description": "The number of non-formula cells changed.", + "format": "int32", + "type": "integer" }, - "getByDataFilter": { - "request": { - "$ref": "GetSpreadsheetByDataFilterRequest" - }, - "description": "Returns the spreadsheet at the given ID.\nThe caller must specify the spreadsheet ID.\n\nThis method differs from GetSpreadsheet in that it allows selecting\nwhich subsets of spreadsheet data to return by specifying a\ndataFilters parameter.\nMultiple DataFilters can be specified. Specifying one or\nmore data filters will return the portions of the spreadsheet that\nintersect ranges matched by any of the filters.\n\nBy default, data within grids will not be returned.\nYou can include grid data one of two ways:\n\n* Specify a field mask listing your desired fields using the `fields` URL\nparameter in HTTP\n\n* Set the includeGridData\nparameter to true. If a field mask is set, the `includeGridData`\nparameter is ignored\n\nFor large spreadsheets, it is recommended to retrieve only the specific\nfields of the spreadsheet that you want.", - "response": { - "$ref": "Spreadsheet" - }, - "parameterOrder": [ - "spreadsheetId" + "occurrencesChanged": { + "description": "The number of occurrences (possibly multiple within a cell) changed.\nFor example, if replacing `\"e\"` with `\"o\"` in `\"Google Sheets\"`, this would\nbe `\"3\"` because `\"Google Sheets\"` -\u003e `\"Googlo Shoots\"`.", + "format": "int32", + "type": "integer" + }, + "rowsChanged": { + "description": "The number of rows changed.", + "format": "int32", + "type": "integer" + }, + "sheetsChanged": { + "type": "integer", + "description": "The number of sheets changed.", + "format": "int32" + }, + "formulasChanged": { + "description": "The number of formula cells changed.", + "format": "int32", + "type": "integer" + } + }, + "id": "FindReplaceResponse" + }, + "DuplicateFilterViewRequest": { + "id": "DuplicateFilterViewRequest", + "description": "Duplicates a particular filter view.", + "type": "object", + "properties": { + "filterId": { + "description": "The ID of the filter being duplicated.", + "format": "int32", + "type": "integer" + } + } + }, + "UpdateConditionalFormatRuleResponse": { + "type": "object", + "properties": { + "newIndex": { + "description": "The index of the new rule.", + "format": "int32", + "type": "integer" + }, + "oldIndex": { + "description": "The old index of the rule. Not set if a rule was replaced\n(because it is the same as new_index).", + "format": "int32", + "type": "integer" + }, + "newRule": { + "$ref": "ConditionalFormatRule", + "description": "The new rule that replaced the old rule (if replacing),\nor the rule that was moved (if moved)" + }, + "oldRule": { + "$ref": "ConditionalFormatRule", + "description": "The old (deleted) rule. Not set if a rule was moved\n(because it is the same as new_rule)." + } + }, + "id": "UpdateConditionalFormatRuleResponse", + "description": "The result of updating a conditional format rule." + }, + "ConditionValue": { + "description": "The value of the condition.", + "type": "object", + "properties": { + "relativeDate": { + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "The value is one year before today.", + "The value is one month before today.", + "The value is one week before today.", + "The value is yesterday.", + "The value is today.", + "The value is tomorrow." ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" + "enum": [ + "RELATIVE_DATE_UNSPECIFIED", + "PAST_YEAR", + "PAST_MONTH", + "PAST_WEEK", + "YESTERDAY", + "TODAY", + "TOMORROW" ], - "parameters": { - "spreadsheetId": { - "location": "path", - "description": "The spreadsheet to request.", - "required": true, - "type": "string" - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}:getByDataFilter", - "path": "v4/spreadsheets/{spreadsheetId}:getByDataFilter", - "id": "sheets.spreadsheets.getByDataFilter" + "description": "A relative date (based on the current date).\nValid only if the type is\nDATE_BEFORE,\nDATE_AFTER,\nDATE_ON_OR_BEFORE or\nDATE_ON_OR_AFTER.\n\nRelative dates are not supported in data validation.\nThey are supported only in conditional formatting and\nconditional filters." + }, + "userEnteredValue": { + "description": "A value the condition is based on.\nThe value is parsed as if the user typed into a cell.\nFormulas are supported (and must begin with an `=` or a '+').", + "type": "string" } }, - "resources": { - "developerMetadata": { - "methods": { - "search": { - "response": { - "$ref": "SearchDeveloperMetadataResponse" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST", - "parameters": { - "spreadsheetId": { - "description": "The ID of the spreadsheet to retrieve metadata from.", - "required": true, - "type": "string", - "location": "path" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/developerMetadata:search", - "path": "v4/spreadsheets/{spreadsheetId}/developerMetadata:search", - "id": "sheets.spreadsheets.developerMetadata.search", - "description": "Returns all developer metadata matching the specified DataFilter.\nIf the provided DataFilter represents a DeveloperMetadataLookup object,\nthis will return all DeveloperMetadata entries selected by it. If the\nDataFilter represents a location in a spreadsheet, this will return all\ndeveloper metadata associated with locations intersecting that region.", - "request": { - "$ref": "SearchDeveloperMetadataRequest" - } - }, - "get": { - "response": { - "$ref": "DeveloperMetadata" - }, - "parameterOrder": [ - "spreadsheetId", - "metadataId" - ], - "httpMethod": "GET", - "parameters": { - "spreadsheetId": { - "description": "The ID of the spreadsheet to retrieve metadata from.", - "required": true, - "type": "string", - "location": "path" - }, - "metadataId": { - "location": "path", - "description": "The ID of the developer metadata to retrieve.", - "format": "int32", - "required": true, - "type": "integer" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}", - "path": "v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}", - "id": "sheets.spreadsheets.developerMetadata.get", - "description": "Returns the developer metadata with the specified ID.\nThe caller must specify the spreadsheet ID and the developer metadata's\nunique metadataId." - } + "id": "ConditionValue" + }, + "DateTimeRule": { + "id": "DateTimeRule", + "description": "Allows you to organize the date-time values in a source data column into\nbuckets based on selected parts of their date or time values. For example,\nconsider a pivot table showing sales transactions by date:\n\n +----------+--------------+\n | Date | SUM of Sales |\n +----------+--------------+\n | 1/1/2017 | $621.14 |\n | 2/3/2017 | $708.84 |\n | 5/8/2017 | $326.84 |\n ...\n +----------+--------------+\nApplying a date-time group rule with a DateTimeRuleType of YEAR_MONTH\nresults in the following pivot table.\n\n +--------------+--------------+\n | Grouped Date | SUM of Sales |\n +--------------+--------------+\n | 2017-Jan | $53,731.78 |\n | 2017-Feb | $83,475.32 |\n | 2017-Mar | $94,385.05 |\n ...\n +--------------+--------------+", + "type": "object", + "properties": { + "type": { + "enumDescriptions": [ + "The default type, do not use.", + "Group dates by second, from 0 to 59.", + "Group dates by minute, from 0 to 59.", + "Group dates by hour using a 24-hour system, from 0 to 23.", + "Group dates by hour and minute using a 24-hour system, for example 19:45.", + "Group dates by hour and minute using a 12-hour system, for example 7:45\nPM. The AM/PM designation is translated based on the spreadsheet\nlocale.", + "Group dates by day of week, for example Sunday. The days of the week will\nbe translated based on the spreadsheet locale.", + "Group dates by day of year, from 1 to 366. Note that dates after Feb. 29\nfall in different buckets in leap years than in non-leap years.", + "Group dates by day of month, from 1 to 31.", + "Group dates by day and month, for example 22-Nov. The month is\ntranslated based on the spreadsheet locale.", + "Group dates by month, for example Nov. The month is translated based\non the spreadsheet locale.", + "Group dates by quarter, for example Q1 (which represents Jan-Mar).", + "Group dates by year, for example 2008.", + "Group dates by year and month, for example 2008-Nov. The month is\ntranslated based on the spreadsheet locale.", + "Group dates by year and quarter, for example 2008 Q4.", + "Group dates by year, month, and day, for example 2008-11-22." + ], + "enum": [ + "DATE_TIME_RULE_TYPE_UNSPECIFIED", + "SECOND", + "MINUTE", + "HOUR", + "HOUR_MINUTE", + "HOUR_MINUTE_AMPM", + "DAY_OF_WEEK", + "DAY_OF_YEAR", + "DAY_OF_MONTH", + "DAY_MONTH", + "MONTH", + "QUARTER", + "YEAR", + "YEAR_MONTH", + "YEAR_QUARTER", + "YEAR_MONTH_DAY" + ], + "description": "The type of date-time grouping to apply.", + "type": "string" + } + } + }, + "HistogramSeries": { + "type": "object", + "properties": { + "barColor": { + "$ref": "Color", + "description": "The color of the column representing this series in each bucket.\nThis field is optional." + }, + "data": { + "$ref": "ChartData", + "description": "The data for this histogram series." + } + }, + "id": "HistogramSeries", + "description": "A histogram series containing the series color and data." + }, + "Spreadsheet": { + "type": "object", + "properties": { + "properties": { + "$ref": "SpreadsheetProperties", + "description": "Overall properties of a spreadsheet." + }, + "spreadsheetId": { + "description": "The ID of the spreadsheet.\nThis field is read-only.", + "type": "string" + }, + "namedRanges": { + "description": "The named ranges defined in a spreadsheet.", + "type": "array", + "items": { + "$ref": "NamedRange" } }, - "values": { - "methods": { - "batchGet": { - "httpMethod": "GET", - "response": { - "$ref": "BatchGetValuesResponse" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "parameters": { - "valueRenderOption": { - "location": "query", - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ], - "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string" - }, - "dateTimeRenderOption": { - "location": "query", - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", - "type": "string" - }, - "ranges": { - "location": "query", - "description": "The A1 notation of the values to retrieve.", - "type": "string", - "repeated": true - }, - "majorDimension": { - "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.", - "type": "string", - "location": "query", - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ] - }, - "spreadsheetId": { - "location": "path", - "description": "The ID of the spreadsheet to retrieve data from.", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/drive.readonly", - "https://www.googleapis.com/auth/spreadsheets", - "https://www.googleapis.com/auth/spreadsheets.readonly" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchGet", - "id": "sheets.spreadsheets.values.batchGet", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchGet", - "description": "Returns one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more ranges." - }, - "clear": { - "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}:clear", - "path": "v4/spreadsheets/{spreadsheetId}/values/{range}:clear", - "id": "sheets.spreadsheets.values.clear", - "request": { - "$ref": "ClearValuesRequest" - }, - "description": "Clears values from a spreadsheet.\nThe caller must specify the spreadsheet ID and range.\nOnly values are cleared -- all other properties of the cell (such as\nformatting, data validation, etc..) are kept.", - "response": { - "$ref": "ClearValuesResponse" - }, - "parameterOrder": [ - "spreadsheetId", - "range" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": { - "spreadsheetId": { - "description": "The ID of the spreadsheet to update.", - "required": true, - "type": "string", - "location": "path" - }, - "range": { - "required": true, - "type": "string", - "location": "path", - "description": "The A1 notation of the values to clear." - } - } - }, - "batchClearByDataFilter": { - "description": "Clears one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more\nDataFilters. Ranges matching any of the specified data\nfilters will be cleared. Only values are cleared -- all other properties\nof the cell (such as formatting, data validation, etc..) are kept.", - "request": { - "$ref": "BatchClearValuesByDataFilterRequest" - }, - "httpMethod": "POST", - "parameterOrder": [ - "spreadsheetId" - ], - "response": { - "$ref": "BatchClearValuesByDataFilterResponse" - }, - "parameters": { - "spreadsheetId": { - "location": "path", - "description": "The ID of the spreadsheet to update.", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter", - "id": "sheets.spreadsheets.values.batchClearByDataFilter", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter" - }, - "append": { - "parameters": { - "spreadsheetId": { - "required": true, - "type": "string", - "location": "path", - "description": "The ID of the spreadsheet to update." - }, - "responseValueRenderOption": { - "location": "query", - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ], - "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string" - }, - "insertDataOption": { - "type": "string", - "location": "query", - "enum": [ - "OVERWRITE", - "INSERT_ROWS" - ], - "description": "How the input data should be inserted." - }, - "valueInputOption": { - "location": "query", - "enum": [ - "INPUT_VALUE_OPTION_UNSPECIFIED", - "RAW", - "USER_ENTERED" - ], - "description": "How the input data should be interpreted.", - "type": "string" - }, - "responseDateTimeRenderOption": { - "location": "query", - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", - "type": "string" - }, - "range": { - "description": "The A1 notation of a range to search for a logical table of data.\nValues will be appended after the last row of the table.", - "required": true, - "type": "string", - "location": "path" - }, - "includeValuesInResponse": { - "type": "boolean", - "location": "query", - "description": "Determines if the update response should include the values\nof the cells that were appended. By default, responses\ndo not include the updated values." - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}:append", - "id": "sheets.spreadsheets.values.append", - "path": "v4/spreadsheets/{spreadsheetId}/values/{range}:append", - "description": "Appends values to a spreadsheet. The input range is used to search for\nexisting data and find a \"table\" within that range. Values will be\nappended to the next row of the table, starting with the first column of\nthe table. See the\n[guide](/sheets/api/guides/values#appending_values)\nand\n[sample code](/sheets/api/samples/writing#append_values)\nfor specific details of how tables are detected and data is appended.\n\nThe caller must specify the spreadsheet ID, range, and\na valueInputOption. The `valueInputOption` only\ncontrols how the input data will be added to the sheet (column-wise or\nrow-wise), it does not influence what cell the data starts being written\nto.", - "request": { - "$ref": "ValueRange" - }, - "httpMethod": "POST", - "parameterOrder": [ - "spreadsheetId", - "range" - ], - "response": { - "$ref": "AppendValuesResponse" - } - }, - "batchGetByDataFilter": { - "request": { - "$ref": "BatchGetValuesByDataFilterRequest" - }, - "description": "Returns one or more ranges of values that match the specified data filters.\nThe caller must specify the spreadsheet ID and one or more\nDataFilters. Ranges that match any of the data filters in\nthe request will be returned.", - "response": { - "$ref": "BatchGetValuesByDataFilterResponse" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST", - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": { - "spreadsheetId": { - "location": "path", - "description": "The ID of the spreadsheet to retrieve data from.", - "required": true, - "type": "string" - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter", - "id": "sheets.spreadsheets.values.batchGetByDataFilter" - }, - "batchClear": { - "description": "Clears one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more ranges.\nOnly values are cleared -- all other properties of the cell (such as\nformatting, data validation, etc..) are kept.", - "request": { - "$ref": "BatchClearValuesRequest" - }, - "response": { - "$ref": "BatchClearValuesResponse" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST", - "parameters": { - "spreadsheetId": { - "description": "The ID of the spreadsheet to update.", - "required": true, - "type": "string", - "location": "path" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchClear", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchClear", - "id": "sheets.spreadsheets.values.batchClear" - }, - "get": { - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/drive.readonly", - "https://www.googleapis.com/auth/spreadsheets", - "https://www.googleapis.com/auth/spreadsheets.readonly" - ], - "parameters": { - "majorDimension": { - "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.", - "type": "string", - "location": "query", - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ] - }, - "spreadsheetId": { - "description": "The ID of the spreadsheet to retrieve data from.", - "required": true, - "type": "string", - "location": "path" - }, - "range": { - "description": "The A1 notation of the values to retrieve.", - "required": true, - "type": "string", - "location": "path" - }, - "valueRenderOption": { - "location": "query", - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ], - "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string" - }, - "dateTimeRenderOption": { - "location": "query", - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", - "type": "string" - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}", - "id": "sheets.spreadsheets.values.get", - "path": "v4/spreadsheets/{spreadsheetId}/values/{range}", - "description": "Returns a range of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and a range.", - "httpMethod": "GET", - "parameterOrder": [ - "spreadsheetId", - "range" - ], - "response": { - "$ref": "ValueRange" - } - }, - "update": { - "httpMethod": "PUT", - "parameterOrder": [ - "spreadsheetId", - "range" - ], - "response": { - "$ref": "UpdateValuesResponse" - }, - "parameters": { - "spreadsheetId": { - "description": "The ID of the spreadsheet to update.", - "required": true, - "type": "string", - "location": "path" - }, - "responseValueRenderOption": { - "location": "query", - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ], - "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string" - }, - "valueInputOption": { - "location": "query", - "enum": [ - "INPUT_VALUE_OPTION_UNSPECIFIED", - "RAW", - "USER_ENTERED" - ], - "description": "How the input data should be interpreted.", - "type": "string" - }, - "responseDateTimeRenderOption": { - "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER.", - "type": "string", - "location": "query", - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ] - }, - "range": { - "description": "The A1 notation of the values to update.", - "required": true, - "type": "string", - "location": "path" - }, - "includeValuesInResponse": { - "type": "boolean", - "location": "query", - "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values.\nIf the range to write was larger than than the range actually written,\nthe response will include all values in the requested range (excluding\ntrailing empty rows and columns)." - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}", - "id": "sheets.spreadsheets.values.update", - "path": "v4/spreadsheets/{spreadsheetId}/values/{range}", - "description": "Sets values in a range of a spreadsheet.\nThe caller must specify the spreadsheet ID, range, and\na valueInputOption.", - "request": { - "$ref": "ValueRange" - } - }, - "batchUpdateByDataFilter": { - "description": "Sets values in one or more ranges of a spreadsheet.\nThe caller must specify the spreadsheet ID,\na valueInputOption, and one or more\nDataFilterValueRanges.", - "request": { - "$ref": "BatchUpdateValuesByDataFilterRequest" - }, - "response": { - "$ref": "BatchUpdateValuesByDataFilterResponse" - }, - "parameterOrder": [ - "spreadsheetId" - ], - "httpMethod": "POST", - "parameters": { - "spreadsheetId": { - "location": "path", - "description": "The ID of the spreadsheet to update.", - "required": true, - "type": "string" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter", - "id": "sheets.spreadsheets.values.batchUpdateByDataFilter" - }, - "batchUpdate": { - "httpMethod": "POST", - "parameterOrder": [ - "spreadsheetId" - ], - "response": { - "$ref": "BatchUpdateValuesResponse" - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "parameters": { - "spreadsheetId": { - "required": true, - "type": "string", - "location": "path", - "description": "The ID of the spreadsheet to update." - } - }, - "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchUpdate", - "id": "sheets.spreadsheets.values.batchUpdate", - "path": "v4/spreadsheets/{spreadsheetId}/values:batchUpdate", - "request": { - "$ref": "BatchUpdateValuesRequest" - }, - "description": "Sets values in one or more ranges of a spreadsheet.\nThe caller must specify the spreadsheet ID,\na valueInputOption, and one or more\nValueRanges." - } - } - }, - "sheets": { - "methods": { - "copyTo": { - "description": "Copies a single sheet from a spreadsheet to another spreadsheet.\nReturns the properties of the newly created sheet.", - "request": { - "$ref": "CopySheetToAnotherSpreadsheetRequest" - }, - "response": { - "$ref": "SheetProperties" - }, - "parameterOrder": [ - "spreadsheetId", - "sheetId" - ], - "httpMethod": "POST", - "parameters": { - "sheetId": { - "description": "The ID of the sheet to copy.", - "format": "int32", - "required": true, - "type": "integer", - "location": "path" - }, - "spreadsheetId": { - "description": "The ID of the spreadsheet containing the sheet to copy.", - "required": true, - "type": "string", - "location": "path" - } - }, - "scopes": [ - "https://www.googleapis.com/auth/drive", - "https://www.googleapis.com/auth/drive.file", - "https://www.googleapis.com/auth/spreadsheets" - ], - "flatPath": "v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo", - "path": "v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo", - "id": "sheets.spreadsheets.sheets.copyTo" - } - } - } - } - } - }, - "parameters": { - "callback": { - "type": "string", - "location": "query", - "description": "JSONP" - }, - "oauth_token": { - "description": "OAuth 2.0 token for the current user.", - "type": "string", - "location": "query" - }, - "$.xgafv": { - "location": "query", - "enum": [ - "1", - "2" - ], - "description": "V1 error format.", - "type": "string", - "enumDescriptions": [ - "v1 error format", - "v2 error format" - ] - }, - "alt": { - "type": "string", - "enumDescriptions": [ - "Responses with Content-Type of application/json", - "Media download with context-dependent Content-Type", - "Responses with Content-Type of application/x-protobuf" - ], - "location": "query", - "description": "Data format for response.", - "default": "json", - "enum": [ - "json", - "media", - "proto" - ] - }, - "key": { - "location": "query", - "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", - "type": "string" - }, - "access_token": { - "location": "query", - "description": "OAuth access token.", - "type": "string" - }, - "upload_protocol": { - "location": "query", - "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").", - "type": "string" - }, - "quotaUser": { - "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.", - "type": "string", - "location": "query" - }, - "prettyPrint": { - "description": "Returns response with indentations and line breaks.", - "type": "boolean", - "default": "true", - "location": "query" - }, - "uploadType": { - "location": "query", - "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\").", - "type": "string" - }, - "fields": { - "type": "string", - "location": "query", - "description": "Selector specifying which fields to include in a partial response." - } - }, - "version": "v4", - "baseUrl": "https://sheets.googleapis.com/", - "servicePath": "", - "description": "Reads and writes Google Sheets.", - "kind": "discovery#restDescription", - "basePath": "", - "revision": "20191115", - "documentationLink": "https://developers.google.com/sheets/", - "id": "sheets:v4", - "discoveryVersion": "v1", - "version_module": true, - "schemas": { - "MatchedDeveloperMetadata": { - "description": "A developer metadata entry and the data filters specified in the original\nrequest that matched it.", - "type": "object", - "properties": { - "dataFilters": { - "description": "All filters matching the returned developer metadata.", + "developerMetadata": { "type": "array", "items": { - "$ref": "DataFilter" - } - }, - "developerMetadata": { - "$ref": "DeveloperMetadata", - "description": "The developer metadata matching the specified filters." - } - }, - "id": "MatchedDeveloperMetadata" - }, - "MergeCellsRequest": { - "type": "object", - "properties": { - "mergeType": { - "description": "How the cells should be merged.", - "type": "string", - "enumDescriptions": [ - "Create a single merge from the range", - "Create a merge for each column in the range", - "Create a merge for each row in the range" - ], - "enum": [ - "MERGE_ALL", - "MERGE_COLUMNS", - "MERGE_ROWS" - ] + "$ref": "DeveloperMetadata" + }, + "description": "The developer metadata associated with a spreadsheet." }, - "range": { - "description": "The range of cells to merge.", - "$ref": "GridRange" - } - }, - "id": "MergeCellsRequest", - "description": "Merges all cells in the range." - }, - "AddProtectedRangeRequest": { - "description": "Adds a new protected range.", - "type": "object", - "properties": { - "protectedRange": { - "$ref": "ProtectedRange", - "description": "The protected range to be added. The\nprotectedRangeId field is optional; if\none is not set, an id will be randomly generated. (It is an error to\nspecify the ID of a range that already exists.)" - } - }, - "id": "AddProtectedRangeRequest" - }, - "DuplicateFilterViewResponse": { - "id": "DuplicateFilterViewResponse", - "description": "The result of a filter view being duplicated.", - "type": "object", - "properties": { - "filter": { - "description": "The newly created filter.", - "$ref": "FilterView" - } - } - }, - "DuplicateSheetResponse": { - "description": "The result of duplicating a sheet.", - "type": "object", - "properties": { - "properties": { - "$ref": "SheetProperties", - "description": "The properties of the duplicate sheet." - } - }, - "id": "DuplicateSheetResponse" - }, - "BatchUpdateSpreadsheetResponse": { - "type": "object", - "properties": { - "replies": { - "description": "The reply of the updates. This maps 1:1 with the updates, although\nreplies to some requests may be empty.", + "sheets": { + "description": "The sheets that are part of a spreadsheet.", "type": "array", "items": { - "$ref": "Response" + "$ref": "Sheet" } }, - "updatedSpreadsheet": { - "$ref": "Spreadsheet", - "description": "The spreadsheet after updates were applied. This is only set if\n[BatchUpdateSpreadsheetRequest.include_spreadsheet_in_response] is `true`." - }, - "spreadsheetId": { - "type": "string", - "description": "The spreadsheet the updates were applied to." + "spreadsheetUrl": { + "description": "The url of the spreadsheet.\nThis field is read-only.", + "type": "string" } }, - "id": "BatchUpdateSpreadsheetResponse", - "description": "The reply for batch updating a spreadsheet." - }, - "AddFilterViewRequest": { - "id": "AddFilterViewRequest", - "description": "Adds a filter view.", - "type": "object", - "properties": { - "filter": { - "$ref": "FilterView", - "description": "The filter to add. The filterViewId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a filter that already exists.)" - } - } + "id": "Spreadsheet", + "description": "Resource that represents a spreadsheet." }, - "DataFilterValueRange": { - "description": "A range of values whose location is specified by a DataFilter.", + "BandedRange": { + "description": "A banded (alternating colors) range in a sheet.", "type": "object", "properties": { - "dataFilter": { - "$ref": "DataFilter", - "description": "The data filter describing the location of the values in the spreadsheet." + "rowProperties": { + "$ref": "BandingProperties", + "description": "Properties for row bands. These properties are applied on a row-by-row\nbasis throughout all the rows in the range. At least one of\nrow_properties or column_properties must be specified." }, - "majorDimension": { - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ], - "description": "The major dimension of the values." + "columnProperties": { + "$ref": "BandingProperties", + "description": "Properties for column bands. These properties are applied on a column-\nby-column basis throughout all the columns in the range. At least one of\nrow_properties or column_properties must be specified." }, - "values": { - "description": "The data to be written. If the provided values exceed any of the ranges\nmatched by the data filter then the request will fail. If the provided\nvalues are less than the matched ranges only the specified values will be\nwritten, existing values in the matched ranges will remain unaffected.", - "type": "array", - "items": { - "type": "array", - "items": { - "type": "any" - } - } - } - }, - "id": "DataFilterValueRange" - }, - "NumberFormat": { - "description": "The number format of a cell.", - "type": "object", - "properties": { - "type": { - "description": "The type of the number format.\nWhen writing, this field must be set.", - "type": "string", - "enumDescriptions": [ - "The number format is not specified\nand is based on the contents of the cell.\nDo not explicitly use this.", - "Text formatting, e.g `1000.12`", - "Number formatting, e.g, `1,000.12`", - "Percent formatting, e.g `10.12%`", - "Currency formatting, e.g `$1,000.12`", - "Date formatting, e.g `9/26/2008`", - "Time formatting, e.g `3:59:00 PM`", - "Date+Time formatting, e.g `9/26/08 15:59:00`", - "Scientific number formatting, e.g `1.01E+03`" - ], - "enum": [ - "NUMBER_FORMAT_TYPE_UNSPECIFIED", - "TEXT", - "NUMBER", - "PERCENT", - "CURRENCY", - "DATE", - "TIME", - "DATE_TIME", - "SCIENTIFIC" - ] + "range": { + "$ref": "GridRange", + "description": "The range over which these properties are applied." }, - "pattern": { - "type": "string", - "description": "Pattern string used for formatting. If not set, a default pattern based on\nthe user's locale will be used if necessary for the given type.\nSee the [Date and Number Formats guide](/sheets/api/guides/formats) for\nmore information about the supported patterns." + "bandedRangeId": { + "description": "The id of the banded range.", + "format": "int32", + "type": "integer" } }, - "id": "NumberFormat" + "id": "BandedRange" }, - "OrgChartSpec": { - "description": "An \u003ca href=\"/chart/interactive/docs/gallery/orgchart\"\u003eorg chart\u003c/a\u003e.\nOrg charts require a unique set of labels in labels and may\noptionally include parent_labels and tooltips.\nparent_labels contain, for each node, the label identifying the parent\nnode. tooltips contain, for each node, an optional tooltip.\n\nFor example, to describe an OrgChart with Alice as the CEO, Bob as the\nPresident (reporting to Alice) and Cathy as VP of Sales (also reporting to\nAlice), have labels contain \"Alice\", \"Bob\", \"Cathy\",\nparent_labels contain \"\", \"Alice\", \"Alice\" and tooltips contain\n\"CEO\", \"President\", \"VP Sales\".", + "AddChartRequest": { + "description": "Adds a chart to a sheet in the spreadsheet.", "type": "object", "properties": { - "nodeColor": { - "$ref": "Color", - "description": "The color of the org chart nodes." - }, - "tooltips": { - "$ref": "ChartData", - "description": "The data containing the tooltip for the corresponding node. A blank value\nresults in no tooltip being displayed for the node.\nThis field is optional." - }, - "selectedNodeColor": { - "description": "The color of the selected org chart nodes.", - "$ref": "Color" - }, - "parentLabels": { - "description": "The data containing the label of the parent for the corresponding node.\nA blank value indicates that the node has no parent and is a top-level\nnode.\nThis field is optional.", - "$ref": "ChartData" - }, - "labels": { - "$ref": "ChartData", - "description": "The data containing the labels for all the nodes in the chart. Labels\nmust be unique." - }, - "nodeSize": { - "enumDescriptions": [ - "Default value, do not use.", - "The small org chart node size.", - "The medium org chart node size.", - "The large org chart node size." - ], - "enum": [ - "ORG_CHART_LABEL_SIZE_UNSPECIFIED", - "SMALL", - "MEDIUM", - "LARGE" - ], - "description": "The size of the org chart nodes.", - "type": "string" + "chart": { + "description": "The chart that should be added to the spreadsheet, including the position\nwhere it should be placed. The chartId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of an embedded object that already exists.)", + "$ref": "EmbeddedChart" } }, - "id": "OrgChartSpec" + "id": "AddChartRequest" }, - "FilterView": { - "description": "A filter view.", + "HistogramRule": { + "description": "Allows you to organize the numeric values in a source data column into\nbuckets of a constant size. All values from HistogramRule.start to\nHistogramRule.end are placed into groups of size\nHistogramRule.interval. In addition, all values below\nHistogramRule.start are placed in one group, and all values above\nHistogramRule.end are placed in another. Only\nHistogramRule.interval is required, though if HistogramRule.start\nand HistogramRule.end are both provided, HistogramRule.start must\nbe less than HistogramRule.end. For example, a pivot table showing\naverage purchase amount by age that has 50+ rows:\n\n +-----+-------------------+\n | Age | AVERAGE of Amount |\n +-----+-------------------+\n | 16 | $27.13 |\n | 17 | $5.24 |\n | 18 | $20.15 |\n ...\n +-----+-------------------+\ncould be turned into a pivot table that looks like the one below by\napplying a histogram group rule with a HistogramRule.start of 25,\nan HistogramRule.interval of 20, and an HistogramRule.end\nof 65.\n\n +-------------+-------------------+\n | Grouped Age | AVERAGE of Amount |\n +-------------+-------------------+\n | \u003c 25 | $19.34 |\n | 25-45 | $31.43 |\n | 45-65 | $35.87 |\n | \u003e 65 | $27.55 |\n +-------------+-------------------+\n | Grand Total | $29.12 |\n +-------------+-------------------+", "type": "object", "properties": { - "filterViewId": { - "type": "integer", - "description": "The ID of the filter view.", - "format": "int32" - }, - "criteria": { - "type": "object", - "additionalProperties": { - "$ref": "FilterCriteria" - }, - "description": "The criteria for showing/hiding values per column.\nThe map's key is the column index, and the value is the criteria for\nthat column." - }, - "title": { - "description": "The name of the filter view.", - "type": "string" - }, - "range": { - "$ref": "GridRange", - "description": "The range this filter view covers.\n\nWhen writing, only one of range or named_range_id\nmay be set." + "interval": { + "description": "The size of the buckets that are created. Must be positive.", + "format": "double", + "type": "number" }, - "sortSpecs": { - "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications.", - "type": "array", - "items": { - "$ref": "SortSpec" - } + "start": { + "description": "The minimum value at which items are placed into buckets\nof constant size. Values below start are lumped into a single bucket.\nThis field is optional.", + "format": "double", + "type": "number" }, - "namedRangeId": { - "type": "string", - "description": "The named range this filter view is backed by, if any.\n\nWhen writing, only one of range or named_range_id\nmay be set." + "end": { + "type": "number", + "description": "The maximum value at which items are placed into buckets\nof constant size. Values above end are lumped into a single bucket.\nThis field is optional.", + "format": "double" } }, - "id": "FilterView" + "id": "HistogramRule" }, - "Slicer": { - "description": "A slicer in a sheet.", + "UpdateProtectedRangeRequest": { + "description": "Updates an existing protected range with the specified\nprotectedRangeId.", "type": "object", "properties": { - "slicerId": { - "description": "The ID of the slicer.", - "format": "int32", - "type": "integer" - }, - "position": { - "$ref": "EmbeddedObjectPosition", - "description": "The position of the slicer. Note that slicer can be positioned only on\nexisting sheet. Also, width and height of slicer can be automatically\nadjusted to keep it within permitted limits." + "protectedRange": { + "$ref": "ProtectedRange", + "description": "The protected range to update with the new properties." }, - "spec": { - "description": "The specification of the slicer.", - "$ref": "SlicerSpec" + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `protectedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" } }, - "id": "Slicer" + "id": "UpdateProtectedRangeRequest" }, - "SearchDeveloperMetadataRequest": { + "AddSheetResponse": { + "description": "The result of adding a sheet.", "type": "object", "properties": { - "dataFilters": { - "description": "The data filters describing the criteria used to determine which\nDeveloperMetadata entries to return. DeveloperMetadata matching any of the\nspecified filters will be included in the response.", - "type": "array", - "items": { - "$ref": "DataFilter" - } + "properties": { + "$ref": "SheetProperties", + "description": "The properties of the newly added sheet." } }, - "id": "SearchDeveloperMetadataRequest", - "description": "A request to retrieve all developer metadata matching the set of specified\ncriteria." + "id": "AddSheetResponse" }, - "BandingProperties": { - "description": "Properties referring a single dimension (either row or column). If both\nBandedRange.row_properties and BandedRange.column_properties are\nset, the fill colors are applied to cells according to the following rules:\n\n* header_color and footer_color take priority over band colors.\n* first_band_color takes priority over second_band_color.\n* row_properties takes priority over column_properties.\n\nFor example, the first row color takes priority over the first column\ncolor, but the first column color takes priority over the second row color.\nSimilarly, the row header takes priority over the column header in the\ntop left cell, but the column header takes priority over the first row\ncolor if the row header is not set.", + "PivotGroupRule": { + "id": "PivotGroupRule", + "description": "An optional setting on a PivotGroup that defines buckets for the values\nin the source data column rather than breaking out each individual value.\nOnly one PivotGroup with a group rule may be added for each column in\nthe source data, though on any given column you may add both a\nPivotGroup that has a rule and a PivotGroup that does not.", "type": "object", "properties": { - "headerColor": { - "$ref": "Color", - "description": "The color of the first row or column. If this field is set, the first\nrow or column will be filled with this color and the colors will\nalternate between first_band_color and second_band_color starting\nfrom the second row or column. Otherwise, the first row or column will be\nfilled with first_band_color and the colors will proceed to alternate\nas they normally would." - }, - "firstBandColor": { - "$ref": "Color", - "description": "The first color that is alternating. (Required)" + "histogramRule": { + "$ref": "HistogramRule", + "description": "A HistogramRule." }, - "secondBandColor": { - "$ref": "Color", - "description": "The second color that is alternating. (Required)" + "dateTimeRule": { + "$ref": "DateTimeRule", + "description": "A DateTimeRule." }, - "footerColor": { - "$ref": "Color", - "description": "The color of the last row or column. If this field is not set, the last\nrow or column will be filled with either first_band_color or\nsecond_band_color, depending on the color of the previous row or\ncolumn." + "manualRule": { + "$ref": "ManualRule", + "description": "A ManualRule." } - }, - "id": "BandingProperties" + } }, - "BasicFilter": { - "description": "The default filter associated with a sheet.", + "AddFilterViewResponse": { + "description": "The result of adding a filter view.", "type": "object", "properties": { - "range": { - "$ref": "GridRange", - "description": "The range the filter covers." - }, - "criteria": { - "type": "object", - "additionalProperties": { - "$ref": "FilterCriteria" - }, - "description": "The criteria for showing/hiding values per column.\nThe map's key is the column index, and the value is the criteria for\nthat column." - }, - "sortSpecs": { - "type": "array", - "items": { - "$ref": "SortSpec" - }, - "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications." + "filter": { + "$ref": "FilterView", + "description": "The newly added filter view." } }, - "id": "BasicFilter" + "id": "AddFilterViewResponse" }, - "AddProtectedRangeResponse": { - "description": "The result of adding a new protected range.", + "IterativeCalculationSettings": { + "description": "Settings to control how circular dependencies are resolved with iterative\ncalculation.", "type": "object", "properties": { - "protectedRange": { - "$ref": "ProtectedRange", - "description": "The newly added protected range." + "maxIterations": { + "description": "When iterative calculation is enabled, the maximum number of calculation\nrounds to perform.", + "format": "int32", + "type": "integer" + }, + "convergenceThreshold": { + "type": "number", + "description": "When iterative calculation is enabled and successive results differ by\nless than this threshold value, the calculation rounds stop.", + "format": "double" } }, - "id": "AddProtectedRangeResponse" + "id": "IterativeCalculationSettings" }, - "PivotValue": { - "description": "The definition of how a value in a pivot table should be calculated.", + "ScorecardChartSpec": { + "description": "A scorecard chart. Scorecard charts are used to highlight key performance\nindicators, known as KPIs, on the spreadsheet. A scorecard chart can\nrepresent things like total sales, average cost, or a top selling item. You\ncan specify a single data value, or aggregate over a range of data.\nPercentage or absolute difference from a baseline value can be highlighted,\nlike changes over time.", "type": "object", "properties": { - "formula": { - "description": "A custom formula to calculate the value. The formula must start\nwith an `=` character.", - "type": "string" + "keyValueData": { + "$ref": "ChartData", + "description": "The data for scorecard key value." }, - "calculatedDisplayType": { - "description": "If specified, indicates that pivot values should be displayed as\nthe result of a calculation with another pivot value. For example, if\ncalculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the\npivot values are displayed as the percentage of the grand total. In\nthe Sheets UI, this is referred to as \"Show As\" in the value section of a\npivot table.", + "aggregateType": { + "enum": [ + "CHART_AGGREGATE_TYPE_UNSPECIFIED", + "AVERAGE", + "COUNT", + "MAX", + "MEDIAN", + "MIN", + "SUM" + ], + "description": "The aggregation type for key and baseline chart data in scorecard chart.\nThis field is optional.", "type": "string", "enumDescriptions": [ "Default value, do not use.", - "Shows the pivot values as percentage of the row total values.", - "Shows the pivot values as percentage of the column total values.", - "Shows the pivot values as percentage of the grand total values." - ], - "enum": [ - "PIVOT_VALUE_CALCULATED_DISPLAY_TYPE_UNSPECIFIED", - "PERCENT_OF_ROW_TOTAL", - "PERCENT_OF_COLUMN_TOTAL", - "PERCENT_OF_GRAND_TOTAL" + "Average aggregate function.", + "Count aggregate function.", + "Maximum aggregate function.", + "Median aggregate function.", + "Minimum aggregate function.", + "Sum aggregate function." ] }, - "summarizeFunction": { + "numberFormatSource": { + "type": "string", "enumDescriptions": [ - "The default, do not use.", - "Corresponds to the `SUM` function.", - "Corresponds to the `COUNTA` function.", - "Corresponds to the `COUNT` function.", - "Corresponds to the `COUNTUNIQUE` function.", - "Corresponds to the `AVERAGE` function.", - "Corresponds to the `MAX` function.", - "Corresponds to the `MIN` function.", - "Corresponds to the `MEDIAN` function.", - "Corresponds to the `PRODUCT` function.", - "Corresponds to the `STDEV` function.", - "Corresponds to the `STDEVP` function.", - "Corresponds to the `VAR` function.", - "Corresponds to the `VARP` function.", - "Indicates the formula should be used as-is.\nOnly valid if PivotValue.formula was set." + "Default value, do not use.", + "Inherit number formatting from data.", + "Apply custom formatting as specified by ChartCustomNumberFormatOptions." ], "enum": [ - "PIVOT_STANDARD_VALUE_FUNCTION_UNSPECIFIED", - "SUM", - "COUNTA", - "COUNT", - "COUNTUNIQUE", - "AVERAGE", - "MAX", - "MIN", - "MEDIAN", - "PRODUCT", - "STDEV", - "STDEVP", - "VAR", - "VARP", + "CHART_NUMBER_FORMAT_SOURCE_UNDEFINED", + "FROM_DATA", "CUSTOM" ], - "description": "A function to summarize the value.\nIf formula is set, the only supported values are\nSUM and\nCUSTOM.\nIf sourceColumnOffset is set, then `CUSTOM`\nis not supported.", - "type": "string" + "description": "The number format source used in the scorecard chart.\nThis field is optional." }, - "sourceColumnOffset": { - "description": "The column offset of the source range that this value reads from.\n\nFor example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`\nmeans this value refers to column `C`, whereas the offset `1` would\nrefer to column `D`.", - "format": "int32", - "type": "integer" + "keyValueFormat": { + "description": "Formatting options for key value.", + "$ref": "KeyValueFormat" }, - "name": { - "description": "A name to use for the value.", - "type": "string" + "customFormatOptions": { + "$ref": "ChartCustomNumberFormatOptions", + "description": "Custom formatting options for numeric key/baseline values in scorecard\nchart. This field is used only when number_format_source is set to\nCUSTOM. This field is optional." + }, + "scaleFactor": { + "description": "Value to scale scorecard key and baseline value. For example, a factor of\n10 can be used to divide all values in the chart by 10.\nThis field is optional.", + "format": "double", + "type": "number" + }, + "baselineValueFormat": { + "$ref": "BaselineValueFormat", + "description": "Formatting options for baseline value.\nThis field is needed only if baseline_value_data is specified." + }, + "baselineValueData": { + "$ref": "ChartData", + "description": "The data for scorecard baseline value.\nThis field is optional." } }, - "id": "PivotValue" + "id": "ScorecardChartSpec" }, - "ErrorValue": { - "description": "An error in a cell.", + "SpreadsheetProperties": { + "id": "SpreadsheetProperties", + "description": "Properties of a spreadsheet.", "type": "object", "properties": { - "type": { + "title": { "type": "string", + "description": "The title of the spreadsheet." + }, + "timeZone": { + "description": "The time zone of the spreadsheet, in CLDR format such as\n`America/New_York`. If the time zone isn't recognized, this may\nbe a custom time zone such as `GMT-07:00`.", + "type": "string" + }, + "locale": { + "description": "The locale of the spreadsheet in one of the following formats:\n\n* an ISO 639-1 language code such as `en`\n\n* an ISO 639-2 language code such as `fil`, if no 639-1 code exists\n\n* a combination of the ISO language code and country code, such as `en_US`\n\nNote: when updating this field, not all locales/languages are supported.", + "type": "string" + }, + "iterativeCalculationSettings": { + "$ref": "IterativeCalculationSettings", + "description": "Determines whether and how circular references are resolved with iterative\ncalculation. Absence of this field means that circular references will\nresult in calculation errors." + }, + "autoRecalc": { "enumDescriptions": [ - "The default error type, do not use this.", - "Corresponds to the `#ERROR!` error.", - "Corresponds to the `#NULL!` error.", - "Corresponds to the `#DIV/0` error.", - "Corresponds to the `#VALUE!` error.", - "Corresponds to the `#REF!` error.", - "Corresponds to the `#NAME?` error.", - "Corresponds to the `#NUM`! error.", - "Corresponds to the `#N/A` error.", - "Corresponds to the `Loading...` state." + "Default value. This value must not be used.", + "Volatile functions are updated on every change.", + "Volatile functions are updated on every change and every minute.", + "Volatile functions are updated on every change and hourly." ], "enum": [ - "ERROR_TYPE_UNSPECIFIED", - "ERROR", - "NULL_VALUE", - "DIVIDE_BY_ZERO", - "VALUE", - "REF", - "NAME", - "NUM", - "N_A", - "LOADING" + "RECALCULATION_INTERVAL_UNSPECIFIED", + "ON_CHANGE", + "MINUTE", + "HOUR" ], - "description": "The type of error." - }, - "message": { - "description": "A message with more information about the error\n(in the spreadsheet's locale).", - "type": "string" - } - }, - "id": "ErrorValue" - }, - "CopySheetToAnotherSpreadsheetRequest": { - "description": "The request to copy a sheet across spreadsheets.", - "type": "object", - "properties": { - "destinationSpreadsheetId": { - "type": "string", - "description": "The ID of the spreadsheet to copy the sheet to." - } - }, - "id": "CopySheetToAnotherSpreadsheetRequest" - }, - "CandlestickChartSpec": { - "id": "CandlestickChartSpec", - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/candlestickchart\"\u003ecandlestick\nchart\u003c/a\u003e.", - "type": "object", - "properties": { - "domain": { - "$ref": "CandlestickDomain", - "description": "The domain data (horizontal axis) for the candlestick chart. String data\nwill be treated as discrete labels, other data will be treated as\ncontinuous values." + "description": "The amount of time to wait before volatile functions are recalculated.", + "type": "string" }, - "data": { - "description": "The Candlestick chart data.\nOnly one CandlestickData is supported.", - "type": "array", - "items": { - "$ref": "CandlestickData" - } + "defaultFormat": { + "$ref": "CellFormat", + "description": "The default format of all cells in the spreadsheet.\nCellData.effectiveFormat will not be set if\nthe cell's format is equal to this default format. This field is read-only." } } }, - "BatchClearValuesByDataFilterResponse": { - "description": "The response when clearing a range of values selected with\nDataFilters in a spreadsheet.", + "OverlayPosition": { "type": "object", "properties": { - "spreadsheetId": { - "type": "string", - "description": "The spreadsheet the updates were applied to." + "widthPixels": { + "description": "The width of the object, in pixels. Defaults to 600.", + "format": "int32", + "type": "integer" }, - "clearedRanges": { - "description": "The ranges that were cleared, in A1 notation.\n(If the requests were for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual ranges\n that were cleared, bounded to the sheet's limits.)", - "type": "array", - "items": { - "type": "string" - } + "offsetXPixels": { + "description": "The horizontal offset, in pixels, that the object is offset\nfrom the anchor cell.", + "format": "int32", + "type": "integer" + }, + "anchorCell": { + "description": "The cell the object is anchored to.", + "$ref": "GridCoordinate" + }, + "offsetYPixels": { + "type": "integer", + "description": "The vertical offset, in pixels, that the object is offset\nfrom the anchor cell.", + "format": "int32" + }, + "heightPixels": { + "description": "The height of the object, in pixels. Defaults to 371.", + "format": "int32", + "type": "integer" } }, - "id": "BatchClearValuesByDataFilterResponse" + "id": "OverlayPosition", + "description": "The location an object is overlaid on top of a grid." }, - "TreemapChartColorScale": { + "AddChartResponse": { + "id": "AddChartResponse", + "description": "The result of adding a chart to a spreadsheet.", "type": "object", "properties": { - "minValueColor": { - "$ref": "Color", - "description": "The background color for cells with a color value less than or equal to\nminValue. Defaults to #dc3912 if not\nspecified." - }, - "noDataColor": { - "$ref": "Color", - "description": "The background color for cells that have no color data associated with\nthem. Defaults to #000000 if not specified." - }, - "midValueColor": { - "$ref": "Color", - "description": "The background color for cells with a color value at the midpoint between\nminValue and\nmaxValue. Defaults to #efe6dc if not\nspecified." - }, - "maxValueColor": { - "$ref": "Color", - "description": "The background color for cells with a color value greater than or equal\nto maxValue. Defaults to #109618 if not\nspecified." + "chart": { + "$ref": "EmbeddedChart", + "description": "The newly added chart." } - }, - "id": "TreemapChartColorScale", - "description": "A color scale for a treemap chart." + } }, - "EmbeddedObjectPosition": { - "description": "The position of an embedded object such as a chart.", + "InsertDimensionRequest": { + "description": "Inserts rows or columns in a sheet at a particular index.", "type": "object", "properties": { - "sheetId": { - "description": "The sheet this is on. Set only if the embedded object\nis on its own sheet. Must be non-negative.", - "format": "int32", - "type": "integer" - }, - "overlayPosition": { - "$ref": "OverlayPosition", - "description": "The position at which the object is overlaid on top of a grid." + "range": { + "description": "The dimensions to insert. Both the start and end indexes must be bounded.", + "$ref": "DimensionRange" }, - "newSheet": { - "description": "If true, the embedded object is put on a new sheet whose ID\nis chosen for you. Used only when writing.", + "inheritFromBefore": { + "description": "Whether dimension properties should be extended from the dimensions\nbefore or after the newly inserted dimensions.\nTrue to inherit from the dimensions before (in which case the start\nindex must be greater than 0), and false to inherit from the dimensions\nafter.\n\nFor example, if row index 0 has red background and row index 1\nhas a green background, then inserting 2 rows at index 1 can inherit\neither the green or red background. If `inheritFromBefore` is true,\nthe two new rows will be red (because the row before the insertion point\nwas red), whereas if `inheritFromBefore` is false, the two new rows will\nbe green (because the row after the insertion point was green).", "type": "boolean" } }, - "id": "EmbeddedObjectPosition" + "id": "InsertDimensionRequest" }, - "DeveloperMetadataLookup": { - "description": "Selects DeveloperMetadata that matches all of the specified fields. For\nexample, if only a metadata ID is specified this considers the\nDeveloperMetadata with that particular unique ID. If a metadata key is\nspecified, this considers all developer metadata with that key. If a\nkey, visibility, and location type are all specified, this considers all\ndeveloper metadata with that key and visibility that are associated with a\nlocation of that type. In general, this\nselects all DeveloperMetadata that matches the intersection of all the\nspecified fields; any field or combination of fields may be specified.", + "BatchUpdateValuesRequest": { "type": "object", "properties": { - "metadataLocation": { - "$ref": "DeveloperMetadataLocation", - "description": "Limits the selected developer metadata to those entries associated with\nthe specified location. This field either matches exact locations or all\nintersecting locations according the specified\nlocationMatchingStrategy." - }, - "locationMatchingStrategy": { + "responseDateTimeRenderOption": { "enumDescriptions": [ - "Default value. This value must not be used.", - "Indicates that a specified location should be matched exactly. For\nexample, if row three were specified as a location this matching strategy\nwould only match developer metadata also associated on row three. Metadata\nassociated on other locations would not be considered.", - "Indicates that a specified location should match that exact location as\nwell as any intersecting locations. For example, if row three were\nspecified as a location this matching strategy would match developer\nmetadata associated on row three as well as metadata associated on\nlocations that intersect row three. If, for instance, there was developer\nmetadata associated on column B, this matching strategy would also match\nthat location because column B intersects row three." + "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", + "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." ], "enum": [ - "DEVELOPER_METADATA_LOCATION_MATCHING_STRATEGY_UNSPECIFIED", - "EXACT_LOCATION", - "INTERSECTING_LOCATION" + "SERIAL_NUMBER", + "FORMATTED_STRING" ], - "description": "Determines how this lookup matches the location. If this field is\nspecified as EXACT, only developer metadata associated on the exact\nlocation specified is matched. If this field is specified to INTERSECTING,\ndeveloper metadata associated on intersecting locations is also\nmatched. If left unspecified, this field assumes a default value of\nINTERSECTING.\nIf this field is specified, a metadataLocation\nmust also be specified.", + "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER.", "type": "string" }, - "locationType": { - "description": "Limits the selected developer metadata to those entries which are\nassociated with locations of the specified type. For example, when this\nfield is specified as ROW this lookup\nonly considers developer metadata associated on rows. If the field is left\nunspecified, all location types are considered. This field cannot be\nspecified as SPREADSHEET when\nthe locationMatchingStrategy\nis specified as INTERSECTING or when the\nmetadataLocation is specified as a\nnon-spreadsheet location: spreadsheet metadata cannot intersect any other\ndeveloper metadata location. This field also must be left unspecified when\nthe locationMatchingStrategy\nis specified as EXACT.", + "responseValueRenderOption": { + "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", "type": "string", "enumDescriptions": [ - "Default value.", - "Developer metadata associated on an entire row dimension.", - "Developer metadata associated on an entire column dimension.", - "Developer metadata associated on an entire sheet.", - "Developer metadata associated on the entire spreadsheet." + "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", + "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", + "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." ], "enum": [ - "DEVELOPER_METADATA_LOCATION_TYPE_UNSPECIFIED", - "ROW", - "COLUMN", - "SHEET", - "SPREADSHEET" + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" ] }, - "metadataKey": { - "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_key.", - "type": "string" - }, - "metadataId": { - "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_id.", - "format": "int32", - "type": "integer" + "includeValuesInResponse": { + "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values. The `updatedData` field within\neach of the BatchUpdateValuesResponse.responses will contain\nthe updated values. If the range to write was larger than than the range\nactually written, the response will include all values in the requested\nrange (excluding trailing empty rows and columns).", + "type": "boolean" }, - "visibility": { + "valueInputOption": { "enumDescriptions": [ - "Default value.", - "Document-visible metadata is accessible from any developer project with\naccess to the document.", - "Project-visible metadata is only visible to and accessible by the developer\nproject that created the metadata." + "Default input value. This value must not be used.", + "The values the user has entered will not be parsed and will be stored\nas-is.", + "The values will be parsed as if the user typed them into the UI.\nNumbers will stay as numbers, but strings may be converted to numbers,\ndates, etc. following the same rules that are applied when entering\ntext into a cell via the Google Sheets UI." ], "enum": [ - "DEVELOPER_METADATA_VISIBILITY_UNSPECIFIED", - "DOCUMENT", - "PROJECT" + "INPUT_VALUE_OPTION_UNSPECIFIED", + "RAW", + "USER_ENTERED" ], - "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.visibility. If left unspecified, all developer\nmetadata visibile to the requesting project is considered.", - "type": "string" - }, - "metadataValue": { - "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_value.", + "description": "How the input data should be interpreted.", "type": "string" - } - }, - "id": "DeveloperMetadataLookup" - }, - "AutoFillRequest": { - "description": "Fills in more data based on existing data.", - "type": "object", - "properties": { - "useAlternateSeries": { - "description": "True if we should generate data with the \"alternate\" series.\nThis differs based on the type and amount of source data.", - "type": "boolean" - }, - "sourceAndDestination": { - "$ref": "SourceAndDestination", - "description": "The source and destination areas to autofill.\nThis explicitly lists the source of the autofill and where to\nextend that data." - }, - "range": { - "description": "The range to autofill. This will examine the range and detect\nthe location that has data and automatically fill that data\nin to the rest of the range.", - "$ref": "GridRange" - } - }, - "id": "AutoFillRequest" - }, - "GradientRule": { - "description": "A rule that applies a gradient color scale format, based on\nthe interpolation points listed. The format of a cell will vary\nbased on its contents as compared to the values of the interpolation\npoints.", - "type": "object", - "properties": { - "midpoint": { - "description": "An optional midway interpolation point.", - "$ref": "InterpolationPoint" - }, - "minpoint": { - "$ref": "InterpolationPoint", - "description": "The starting interpolation point." }, - "maxpoint": { - "$ref": "InterpolationPoint", - "description": "The final interpolation point." - } - }, - "id": "GradientRule" - }, - "ClearValuesRequest": { - "id": "ClearValuesRequest", - "description": "The request for clearing a range of values in a spreadsheet.", - "type": "object", - "properties": {} - }, - "SetBasicFilterRequest": { - "type": "object", - "properties": { - "filter": { - "$ref": "BasicFilter", - "description": "The filter to set." - } - }, - "id": "SetBasicFilterRequest", - "description": "Sets the basic filter associated with a sheet." - }, - "BatchClearValuesByDataFilterRequest": { - "description": "The request for clearing more than one range selected by a\nDataFilter in a spreadsheet.", - "type": "object", - "properties": { - "dataFilters": { - "description": "The DataFilters used to determine which ranges to clear.", + "data": { + "description": "The new values to apply to the spreadsheet.", "type": "array", "items": { - "$ref": "DataFilter" + "$ref": "ValueRange" } } }, - "id": "BatchClearValuesByDataFilterRequest" + "id": "BatchUpdateValuesRequest", + "description": "The request for updating more than one range of values in a spreadsheet." }, - "GetSpreadsheetByDataFilterRequest": { + "CutPasteRequest": { + "description": "Moves data from the source to the destination.", "type": "object", "properties": { - "dataFilters": { - "type": "array", - "items": { - "$ref": "DataFilter" - }, - "description": "The DataFilters used to select which ranges to retrieve from\nthe spreadsheet." + "source": { + "$ref": "GridRange", + "description": "The source data to cut." }, - "includeGridData": { - "type": "boolean", - "description": "True if grid data should be returned.\nThis parameter is ignored if a field mask was set in the request." + "pasteType": { + "enumDescriptions": [ + "Paste values, formulas, formats, and merges.", + "Paste the values ONLY without formats, formulas, or merges.", + "Paste the format and data validation only.", + "Like PASTE_NORMAL but without borders.", + "Paste the formulas only.", + "Paste the data validation only.", + "Paste the conditional formatting rules only." + ], + "enum": [ + "PASTE_NORMAL", + "PASTE_VALUES", + "PASTE_FORMAT", + "PASTE_NO_BORDERS", + "PASTE_FORMULA", + "PASTE_DATA_VALIDATION", + "PASTE_CONDITIONAL_FORMATTING" + ], + "description": "What kind of data to paste. All the source data will be cut, regardless\nof what is pasted.", + "type": "string" + }, + "destination": { + "$ref": "GridCoordinate", + "description": "The top-left coordinate where the data should be pasted." } - }, - "id": "GetSpreadsheetByDataFilterRequest", - "description": "The request for retrieving a Spreadsheet." + }, + "id": "CutPasteRequest" }, - "DeleteEmbeddedObjectRequest": { - "description": "Deletes the embedded object with the given ID.", + "ChartAxisViewWindowOptions": { + "description": "The options that define a \"view window\" for a chart (such as the visible\nvalues in an axis).", "type": "object", "properties": { - "objectId": { - "type": "integer", - "description": "The ID of the embedded object to delete.", - "format": "int32" + "viewWindowMin": { + "type": "number", + "description": "The minimum numeric value to be shown in this view window. If unset, will\nautomatically determine a minimum value that looks good for the data.", + "format": "double" + }, + "viewWindowMax": { + "type": "number", + "description": "The maximum numeric value to be shown in this view window. If unset, will\nautomatically determine a maximum value that looks good for the data.", + "format": "double" + }, + "viewWindowMode": { + "enumDescriptions": [ + "The default view window mode used in the Sheets editor for this chart\ntype. In most cases, if set, the default mode is equivalent to\n`PRETTY`.", + "Do not use. Represents that the currently set mode is not supported by\nthe API.", + "Follows the min and max exactly if specified. If a value is unspecified,\nit will fall back to the `PRETTY` value.", + "Chooses a min and max that make the chart look good. Both min and max are\nignored in this mode." + ], + "enum": [ + "DEFAULT_VIEW_WINDOW_MODE", + "VIEW_WINDOW_MODE_UNSUPPORTED", + "EXPLICIT", + "PRETTY" + ], + "description": "The view window's mode.", + "type": "string" } }, - "id": "DeleteEmbeddedObjectRequest" + "id": "ChartAxisViewWindowOptions" }, - "UpdateValuesByDataFilterResponse": { + "BasicChartSeries": { + "id": "BasicChartSeries", + "description": "A single series of data in a chart.\nFor example, if charting stock prices over time, multiple series may exist,\none for the \"Open Price\", \"High Price\", \"Low Price\" and \"Close Price\".", "type": "object", "properties": { - "updatedData": { - "description": "The values of the cells in the range matched by the dataFilter after all\nupdates were applied. This is only included if the request's\n`includeValuesInResponse` field was `true`.", - "$ref": "ValueRange" - }, - "updatedRows": { - "description": "The number of rows where at least one cell in the row was updated.", - "format": "int32", - "type": "integer" + "series": { + "$ref": "ChartData", + "description": "The data being visualized in this chart series." }, - "updatedColumns": { - "description": "The number of columns where at least one cell in the column was updated.", - "format": "int32", - "type": "integer" + "type": { + "enum": [ + "BASIC_CHART_TYPE_UNSPECIFIED", + "BAR", + "LINE", + "AREA", + "COLUMN", + "SCATTER", + "COMBO", + "STEPPED_AREA" + ], + "description": "The type of this series. Valid only if the\nchartType is\nCOMBO.\nDifferent types will change the way the series is visualized.\nOnly LINE, AREA,\nand COLUMN are supported.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "A \u003ca href=\"/chart/interactive/docs/gallery/barchart\"\u003ebar chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/linechart\"\u003eline chart\u003c/a\u003e.", + "An \u003ca href=\"/chart/interactive/docs/gallery/areachart\"\u003earea chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/columnchart\"\u003ecolumn chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/scatterchart\"\u003escatter\nchart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/combochart\"\u003ecombo chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/steppedareachart\"\u003estepped area\nchart\u003c/a\u003e." + ] }, - "updatedRange": { - "description": "The range (in A1 notation) that updates were applied to.", + "targetAxis": { + "enumDescriptions": [ + "Default value, do not use.", + "The axis rendered at the bottom of a chart.\nFor most charts, this is the standard major axis.\nFor bar charts, this is a minor axis.", + "The axis rendered at the left of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is the standard major axis.", + "The axis rendered at the right of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is an unusual major axis." + ], + "enum": [ + "BASIC_CHART_AXIS_POSITION_UNSPECIFIED", + "BOTTOM_AXIS", + "LEFT_AXIS", + "RIGHT_AXIS" + ], + "description": "The minor axis that will specify the range of values for this series.\nFor example, if charting stocks over time, the \"Volume\" series\nmay want to be pinned to the right with the prices pinned to the left,\nbecause the scale of trading volume is different than the scale of\nprices.\nIt is an error to specify an axis that isn't a valid minor axis\nfor the chart's type.", "type": "string" }, - "updatedCells": { - "description": "The number of cells updated.", - "format": "int32", - "type": "integer" + "color": { + "description": "The color for elements (i.e. bars, lines, points) associated with this\nseries. If empty, a default color is used.", + "$ref": "Color" }, - "dataFilter": { - "$ref": "DataFilter", - "description": "The data filter that selected the range that was updated." + "lineStyle": { + "$ref": "LineStyle", + "description": "The line style of this series. Valid only if the\nchartType is AREA,\nLINE, or SCATTER.\nCOMBO charts are also supported if the\nseries chart type is\nAREA or LINE." } - }, - "id": "UpdateValuesByDataFilterResponse", - "description": "The response when updating a range of values by a data filter in a\nspreadsheet." + } }, - "DeleteSheetRequest": { - "description": "Deletes the requested sheet.", + "AutoResizeDimensionsRequest": { "type": "object", "properties": { - "sheetId": { - "description": "The ID of the sheet to delete.", - "format": "int32", - "type": "integer" + "dimensions": { + "$ref": "DimensionRange", + "description": "The dimensions to automatically resize." } }, - "id": "DeleteSheetRequest" + "id": "AutoResizeDimensionsRequest", + "description": "Automatically resizes one or more dimensions based on the contents\nof the cells in that dimension." }, - "MatchedValueRange": { - "description": "A value range that was matched by one or more data filers.", + "UpdateBordersRequest": { + "description": "Updates the borders of a range.\nIf a field is not set in the request, that means the border remains as-is.\nFor example, with two subsequent UpdateBordersRequest:\n\n 1. range: A1:A5 `{ top: RED, bottom: WHITE }`\n 2. range: A1:A5 `{ left: BLUE }`\n\nThat would result in A1:A5 having a borders of\n`{ top: RED, bottom: WHITE, left: BLUE }`.\nIf you want to clear a border, explicitly set the style to\nNONE.", "type": "object", "properties": { - "valueRange": { - "description": "The values matched by the DataFilter.", - "$ref": "ValueRange" + "bottom": { + "$ref": "Border", + "description": "The border to put at the bottom of the range." }, - "dataFilters": { - "description": "The DataFilters from the request that matched the range of\nvalues.", - "type": "array", - "items": { - "$ref": "DataFilter" - } + "innerVertical": { + "description": "The vertical border to put within the range.", + "$ref": "Border" + }, + "right": { + "$ref": "Border", + "description": "The border to put at the right of the range." + }, + "range": { + "$ref": "GridRange", + "description": "The range whose borders should be updated." + }, + "innerHorizontal": { + "description": "The horizontal border to put within the range.", + "$ref": "Border" + }, + "top": { + "$ref": "Border", + "description": "The border to put at the top of the range." + }, + "left": { + "description": "The border to put at the left of the range.", + "$ref": "Border" } }, - "id": "MatchedValueRange" + "id": "UpdateBordersRequest" }, - "DeveloperMetadataLocation": { - "description": "A location where metadata may be associated in a spreadsheet.", + "CellFormat": { + "description": "The format of a cell.", "type": "object", "properties": { - "locationType": { + "numberFormat": { + "description": "A format describing how number values should be represented to the user.", + "$ref": "NumberFormat" + }, + "hyperlinkDisplayType": { + "description": "How a hyperlink, if it exists, should be displayed in the cell.", "type": "string", "enumDescriptions": [ - "Default value.", - "Developer metadata associated on an entire row dimension.", - "Developer metadata associated on an entire column dimension.", - "Developer metadata associated on an entire sheet.", - "Developer metadata associated on the entire spreadsheet." + "The default value: the hyperlink is rendered. Do not use this.", + "A hyperlink should be explicitly rendered.", + "A hyperlink should not be rendered." ], "enum": [ - "DEVELOPER_METADATA_LOCATION_TYPE_UNSPECIFIED", - "ROW", - "COLUMN", - "SHEET", - "SPREADSHEET" + "HYPERLINK_DISPLAY_TYPE_UNSPECIFIED", + "LINKED", + "PLAIN_TEXT" + ] + }, + "horizontalAlignment": { + "description": "The horizontal alignment of the value in the cell.", + "type": "string", + "enumDescriptions": [ + "The horizontal alignment is not specified. Do not use this.", + "The text is explicitly aligned to the left of the cell.", + "The text is explicitly aligned to the center of the cell.", + "The text is explicitly aligned to the right of the cell." ], - "description": "The type of location this object represents. This field is read-only." + "enum": [ + "HORIZONTAL_ALIGN_UNSPECIFIED", + "LEFT", + "CENTER", + "RIGHT" + ] }, - "dimensionRange": { - "$ref": "DimensionRange", - "description": "Represents the row or column when metadata is associated with\na dimension. The specified DimensionRange must represent a single row\nor column; it cannot be unbounded or span multiple rows or columns." + "textFormat": { + "description": "The format of the text in the cell (unless overridden by a format run).", + "$ref": "TextFormat" }, - "spreadsheet": { - "description": "True when metadata is associated with an entire spreadsheet.", - "type": "boolean" + "backgroundColor": { + "$ref": "Color", + "description": "The background color of the cell." }, - "sheetId": { - "description": "The ID of the sheet when metadata is associated with an entire sheet.", - "format": "int32", - "type": "integer" + "padding": { + "$ref": "Padding", + "description": "The padding of the cell." + }, + "verticalAlignment": { + "enum": [ + "VERTICAL_ALIGN_UNSPECIFIED", + "TOP", + "MIDDLE", + "BOTTOM" + ], + "description": "The vertical alignment of the value in the cell.", + "type": "string", + "enumDescriptions": [ + "The vertical alignment is not specified. Do not use this.", + "The text is explicitly aligned to the top of the cell.", + "The text is explicitly aligned to the middle of the cell.", + "The text is explicitly aligned to the bottom of the cell." + ] + }, + "borders": { + "description": "The borders of the cell.", + "$ref": "Borders" + }, + "textDirection": { + "enum": [ + "TEXT_DIRECTION_UNSPECIFIED", + "LEFT_TO_RIGHT", + "RIGHT_TO_LEFT" + ], + "description": "The direction of the text in the cell.", + "type": "string", + "enumDescriptions": [ + "The text direction is not specified. Do not use this.", + "The text direction of left-to-right was set by the user.", + "The text direction of right-to-left was set by the user." + ] + }, + "wrapStrategy": { + "description": "The wrap strategy for the value in the cell.", + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Lines that are longer than the cell width will be written in the next\ncell over, so long as that cell is empty. If the next cell over is\nnon-empty, this behaves the same as CLIP. The text will never wrap\nto the next line unless the user manually inserts a new line.\nExample:\n\n | First sentence. |\n | Manual newline that is very long. \u003c- Text continues into next cell\n | Next newline. |", + "This wrap strategy represents the old Google Sheets wrap strategy where\nwords that are longer than a line are clipped rather than broken. This\nstrategy is not supported on all platforms and is being phased out.\nExample:\n\n | Cell has a |\n | loooooooooo| \u003c- Word is clipped.\n | word. |", + "Lines that are longer than the cell width will be clipped.\nThe text will never wrap to the next line unless the user manually\ninserts a new line.\nExample:\n\n | First sentence. |\n | Manual newline t| \u003c- Text is clipped\n | Next newline. |", + "Words that are longer than a line are wrapped at the character level\nrather than clipped.\nExample:\n\n | Cell has a |\n | loooooooooo| \u003c- Word is broken.\n | ong word. |" + ], + "enum": [ + "WRAP_STRATEGY_UNSPECIFIED", + "OVERFLOW_CELL", + "LEGACY_WRAP", + "CLIP", + "WRAP" + ] + }, + "textRotation": { + "$ref": "TextRotation", + "description": "The rotation applied to text in a cell" } }, - "id": "DeveloperMetadataLocation" + "id": "CellFormat" }, - "DuplicateSheetRequest": { + "ClearValuesResponse": { + "description": "The response when clearing a range of values in a spreadsheet.", "type": "object", "properties": { - "sourceSheetId": { - "description": "The sheet to duplicate.", - "format": "int32", - "type": "integer" - }, - "newSheetId": { - "description": "If set, the ID of the new sheet. If not set, an ID is chosen.\nIf set, the ID must not conflict with any existing sheet ID.\nIf set, it must be non-negative.", - "format": "int32", - "type": "integer" - }, - "insertSheetIndex": { - "type": "integer", - "description": "The zero-based index where the new sheet should be inserted.\nThe index of all sheets after this are incremented.", - "format": "int32" - }, - "newSheetName": { - "description": "The name of the new sheet. If empty, a new name is chosen for you.", + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", "type": "string" + }, + "clearedRange": { + "type": "string", + "description": "The range (in A1 notation) that was cleared.\n(If the request was for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual range\n that was cleared, bounded to the sheet's limits.)" } }, - "id": "DuplicateSheetRequest", - "description": "Duplicates the contents of a sheet." + "id": "ClearValuesResponse" }, - "TreemapChartSpec": { - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/treemap\"\u003eTreemap chart\u003c/a\u003e.", + "WaterfallChartCustomSubtotal": { + "description": "A custom subtotal column for a waterfall chart series.", "type": "object", "properties": { - "textFormat": { - "$ref": "TextFormat", - "description": "The text format for all labels on the chart." - }, - "headerColor": { - "$ref": "Color", - "description": "The background color for header cells." - }, - "parentLabels": { - "$ref": "ChartData", - "description": "The data the contains the treemap cells' parent labels." - }, - "labels": { - "$ref": "ChartData", - "description": "The data that contains the treemap cell labels." - }, - "colorData": { - "$ref": "ChartData", - "description": "The data that determines the background color of each treemap data cell.\nThis field is optional. If not specified, size_data is used to\ndetermine background colors. If specified, the data is expected to be\nnumeric. color_scale will determine how the values in this data map to\ndata cell background colors." - }, - "maxValue": { - "type": "number", - "description": "The maximum possible data value. Cells with values greater than this will\nhave the same color as cells with this value. If not specified, defaults\nto the actual maximum value from color_data, or the maximum value from\nsize_data if color_data is not specified.", - "format": "double" - }, - "colorScale": { - "description": "The color scale for data cells in the treemap chart. Data cells are\nassigned colors based on their color values. These color values come from\ncolor_data, or from size_data if color_data is not specified.\nCells with color values less than or equal to min_value will\nhave minValueColor as their\nbackground color. Cells with color values greater than or equal to\nmax_value will have\nmaxValueColor as their background\ncolor. Cells with color values between min_value and max_value will\nhave background colors on a gradient between\nminValueColor and\nmaxValueColor, the midpoint of\nthe gradient being midValueColor.\nCells with missing or non-numeric color values will have\nnoDataColor as their background\ncolor.", - "$ref": "TreemapChartColorScale" - }, - "hideTooltips": { - "description": "True to hide tooltips.", - "type": "boolean" + "label": { + "description": "A label for the subtotal column.", + "type": "string" }, - "hintedLevels": { - "description": "The number of additional data levels beyond the labeled levels to be shown\non the treemap chart. These levels are not interactive and are shown\nwithout their labels. Defaults to 0 if not specified.", + "subtotalIndex": { + "description": "The 0-based index of a data point within the series. If\ndata_is_subtotal is true, the data point at this index is the\nsubtotal. Otherwise, the subtotal appears after the data point with\nthis index. A series can have multiple subtotals at arbitrary indices,\nbut subtotals do not affect the indices of the data points. For\nexample, if a series has three data points, their indices will always\nbe 0, 1, and 2, regardless of how many subtotals exist on the series or\nwhat data points they are associated with.", "format": "int32", "type": "integer" }, - "levels": { - "type": "integer", - "description": "The number of data levels to show on the treemap chart. These levels are\ninteractive and are shown with their labels. Defaults to 2 if not\nspecified.", - "format": "int32" - }, - "minValue": { - "description": "The minimum possible data value. Cells with values less than this will\nhave the same color as cells with this value. If not specified, defaults\nto the actual minimum value from color_data, or the minimum value from\nsize_data if color_data is not specified.", - "format": "double", - "type": "number" - }, - "sizeData": { - "$ref": "ChartData", - "description": "The data that determines the size of each treemap data cell. This data is\nexpected to be numeric. The cells corresponding to non-numeric or missing\ndata will not be rendered. If color_data is not specified, this data\nis used to determine data cell background colors as well." + "dataIsSubtotal": { + "type": "boolean", + "description": "True if the data point at subtotal_index is the subtotal. If false,\nthe subtotal will be computed and appear after the data point." } }, - "id": "TreemapChartSpec" + "id": "WaterfallChartCustomSubtotal" }, - "ExtendedValue": { + "ChartData": { + "description": "The data included in a domain or series.", "type": "object", "properties": { - "errorValue": { - "$ref": "ErrorValue", - "description": "Represents an error.\nThis field is read-only." - }, - "stringValue": { - "description": "Represents a string value.\nLeading single quotes are not included. For example, if the user typed\n`'123` into the UI, this would be represented as a `stringValue` of\n`\"123\"`.", - "type": "string" - }, - "boolValue": { - "description": "Represents a boolean value.", - "type": "boolean" - }, - "formulaValue": { - "description": "Represents a formula.", - "type": "string" - }, - "numberValue": { - "type": "number", - "description": "Represents a double value.\nNote: Dates, Times and DateTimes are represented as doubles in\n\"serial number\" format.", - "format": "double" + "sourceRange": { + "$ref": "ChartSourceRange", + "description": "The source ranges of the data." } }, - "id": "ExtendedValue", - "description": "The kinds of value that a cell in a spreadsheet can have." + "id": "ChartData" }, - "BatchClearValuesResponse": { + "BatchGetValuesResponse": { + "id": "BatchGetValuesResponse", + "description": "The response when retrieving more than one range of values in a spreadsheet.", "type": "object", "properties": { - "clearedRanges": { - "description": "The ranges that were cleared, in A1 notation.\n(If the requests were for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual ranges\n that were cleared, bounded to the sheet's limits.)", - "type": "array", - "items": { - "type": "string" - } - }, "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", + "description": "The ID of the spreadsheet the data was retrieved from.", "type": "string" + }, + "valueRanges": { + "type": "array", + "items": { + "$ref": "ValueRange" + }, + "description": "The requested values. The order of the ValueRanges is the same as the\norder of the requested ranges." } - }, - "id": "BatchClearValuesResponse", - "description": "The response when clearing a range of values in a spreadsheet." + } }, - "DataFilter": { + "UpdateBandingRequest": { + "description": "Updates properties of the supplied banded range.", "type": "object", "properties": { - "developerMetadataLookup": { - "$ref": "DeveloperMetadataLookup", - "description": "Selects data associated with the developer metadata matching the criteria\ndescribed by this DeveloperMetadataLookup." - }, - "a1Range": { - "description": "Selects data that matches the specified A1 range.", - "type": "string" + "fields": { + "type": "string", + "description": "The fields that should be updated. At least one field must be specified.\nThe root `bandedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask" }, - "gridRange": { - "$ref": "GridRange", - "description": "Selects data that matches the range described by the GridRange." + "bandedRange": { + "$ref": "BandedRange", + "description": "The banded range to update with the new properties." } }, - "id": "DataFilter", - "description": "Filter that describes what data should be selected or returned from a\nrequest." + "id": "UpdateBandingRequest" }, - "TextFormat": { - "description": "The format of a run of text in a cell.\nAbsent values indicate that the field isn't specified.", + "Color": { + "id": "Color", + "description": "Represents a color in the RGBA color space. This representation is designed\nfor simplicity of conversion to/from color representations in various\nlanguages over compactness; for example, the fields of this representation\ncan be trivially provided to the constructor of \"java.awt.Color\" in Java; it\ncan also be trivially provided to UIColor's \"+colorWithRed:green:blue:alpha\"\nmethod in iOS; and, with just a little work, it can be easily formatted into\na CSS \"rgba()\" string in JavaScript, as well.\n\nNote: this proto does not carry information about the absolute color space\nthat should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,\nDCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color\nspace.\n\nExample (Java):\n\n import com.google.type.Color;\n\n // ...\n public static java.awt.Color fromProto(Color protocolor) {\n float alpha = protocolor.hasAlpha()\n ? protocolor.getAlpha().getValue()\n : 1.0;\n\n return new java.awt.Color(\n protocolor.getRed(),\n protocolor.getGreen(),\n protocolor.getBlue(),\n alpha);\n }\n\n public static Color toProto(java.awt.Color color) {\n float red = (float) color.getRed();\n float green = (float) color.getGreen();\n float blue = (float) color.getBlue();\n float denominator = 255.0;\n Color.Builder resultBuilder =\n Color\n .newBuilder()\n .setRed(red / denominator)\n .setGreen(green / denominator)\n .setBlue(blue / denominator);\n int alpha = color.getAlpha();\n if (alpha != 255) {\n result.setAlpha(\n FloatValue\n .newBuilder()\n .setValue(((float) alpha) / denominator)\n .build());\n }\n return resultBuilder.build();\n }\n // ...\n\nExample (iOS / Obj-C):\n\n // ...\n static UIColor* fromProto(Color* protocolor) {\n float red = [protocolor red];\n float green = [protocolor green];\n float blue = [protocolor blue];\n FloatValue* alpha_wrapper = [protocolor alpha];\n float alpha = 1.0;\n if (alpha_wrapper != nil) {\n alpha = [alpha_wrapper value];\n }\n return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];\n }\n\n static Color* toProto(UIColor* color) {\n CGFloat red, green, blue, alpha;\n if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {\n return nil;\n }\n Color* result = [[Color alloc] init];\n [result setRed:red];\n [result setGreen:green];\n [result setBlue:blue];\n if (alpha \u003c= 0.9999) {\n [result setAlpha:floatWrapperWithValue(alpha)];\n }\n [result autorelease];\n return result;\n }\n // ...\n\n Example (JavaScript):\n\n // ...\n\n var protoToCssColor = function(rgb_color) {\n var redFrac = rgb_color.red || 0.0;\n var greenFrac = rgb_color.green || 0.0;\n var blueFrac = rgb_color.blue || 0.0;\n var red = Math.floor(redFrac * 255);\n var green = Math.floor(greenFrac * 255);\n var blue = Math.floor(blueFrac * 255);\n\n if (!('alpha' in rgb_color)) {\n return rgbToCssColor_(red, green, blue);\n }\n\n var alphaFrac = rgb_color.alpha.value || 0.0;\n var rgbParams = [red, green, blue].join(',');\n return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');\n };\n\n var rgbToCssColor_ = function(red, green, blue) {\n var rgbNumber = new Number((red \u003c\u003c 16) | (green \u003c\u003c 8) | blue);\n var hexString = rgbNumber.toString(16);\n var missingZeros = 6 - hexString.length;\n var resultBuilder = ['#'];\n for (var i = 0; i \u003c missingZeros; i++) {\n resultBuilder.push('0');\n }\n resultBuilder.push(hexString);\n return resultBuilder.join('');\n };\n\n // ...", "type": "object", "properties": { - "underline": { - "description": "True if the text is underlined.", - "type": "boolean" - }, - "foregroundColor": { - "$ref": "Color", - "description": "The foreground color of the text." - }, - "bold": { - "description": "True if the text is bold.", - "type": "boolean" - }, - "fontFamily": { - "type": "string", - "description": "The font family." + "green": { + "description": "The amount of green in the color as a value in the interval [0, 1].", + "format": "float", + "type": "number" }, - "strikethrough": { - "description": "True if the text has a strikethrough.", - "type": "boolean" + "blue": { + "type": "number", + "description": "The amount of blue in the color as a value in the interval [0, 1].", + "format": "float" }, - "italic": { - "description": "True if the text is italicized.", - "type": "boolean" + "alpha": { + "description": "The fraction of this color that should be applied to the pixel. That is,\nthe final pixel color is defined by the equation:\n\n pixel color = alpha * (this color) + (1.0 - alpha) * (background color)\n\nThis means that a value of 1.0 corresponds to a solid color, whereas\na value of 0.0 corresponds to a completely transparent color. This\nuses a wrapper message rather than a simple float scalar so that it is\npossible to distinguish between a default value and the value being unset.\nIf omitted, this color object is to be rendered as a solid color\n(as if the alpha value had been explicitly given with a value of 1.0).", + "format": "float", + "type": "number" }, - "fontSize": { - "description": "The size of the font.", - "format": "int32", - "type": "integer" + "red": { + "description": "The amount of red in the color as a value in the interval [0, 1].", + "format": "float", + "type": "number" } - }, - "id": "TextFormat" + } }, - "DeleteDuplicatesRequest": { - "description": "Removes rows within this range that contain values in the specified columns\nthat are duplicates of values in any previous row. Rows with identical values\nbut different letter cases, formatting, or formulas are considered to be\nduplicates.\n\nThis request also removes duplicate rows hidden from view (for example, due\nto a filter). When removing duplicates, the first instance of each duplicate\nrow scanning from the top downwards is kept in the resulting range. Content\noutside of the specified range isn't removed, and rows considered duplicates\ndo not have to be adjacent to each other in the range.", + "TrimWhitespaceRequest": { + "id": "TrimWhitespaceRequest", + "description": "Trims the whitespace (such as spaces, tabs, or new lines) in every cell in\nthe specified range. This request removes all whitespace from the start and\nend of each cell's text, and reduces any subsequence of remaining whitespace\ncharacters to a single space. If the resulting trimmed text starts with a '+'\nor '=' character, the text remains as a string value and isn't interpreted\nas a formula.", "type": "object", "properties": { "range": { - "description": "The range to remove duplicates rows from.", - "$ref": "GridRange" - }, - "comparisonColumns": { - "description": "The columns in the range to analyze for duplicate values. If no columns are\nselected then all columns are analyzed for duplicates.", + "$ref": "GridRange", + "description": "The range whose cells to trim." + } + } + }, + "ChartSourceRange": { + "description": "Source ranges for a chart.", + "type": "object", + "properties": { + "sources": { + "description": "The ranges of data for a series or domain.\nExactly one dimension must have a length of 1,\nand all sources in the list must have the same dimension\nwith length 1.\nThe domain (if it exists) & all series must have the same number\nof source ranges. If using more than one source range, then the source\nrange at a given offset must be in order and contiguous across the domain\nand series.\n\nFor example, these are valid configurations:\n\n domain sources: A1:A5\n series1 sources: B1:B5\n series2 sources: D6:D10\n\n domain sources: A1:A5, C10:C12\n series1 sources: B1:B5, D10:D12\n series2 sources: C1:C5, E10:E12", "type": "array", "items": { - "$ref": "DimensionRange" + "$ref": "GridRange" } } }, - "id": "DeleteDuplicatesRequest" + "id": "ChartSourceRange" }, - "RepeatCellRequest": { - "description": "Updates all cells in the range to the values in the given Cell object.\nOnly the fields listed in the fields field are updated; others are\nunchanged.\n\nIf writing a cell with a formula, the formula's ranges will automatically\nincrement for each field in the range.\nFor example, if writing a cell with formula `=A1` into range B2:C4,\nB2 would be `=A1`, B3 would be `=A2`, B4 would be `=A3`,\nC2 would be `=B1`, C3 would be `=B2`, C4 would be `=B3`.\n\nTo keep the formula's ranges static, use the `$` indicator.\nFor example, use the formula `=$A$1` to prevent both the row and the\ncolumn from incrementing.", + "ValueRange": { + "description": "Data within a range of the spreadsheet.", "type": "object", "properties": { "range": { - "$ref": "GridRange", - "description": "The range to repeat the cell in." + "type": "string", + "description": "The range the values cover, in A1 notation.\nFor output, this range indicates the entire requested range,\neven though the values will exclude trailing rows and columns.\nWhen appending values, this field represents the range to search for a\ntable, after which values will be appended." }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `cell` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" + "majorDimension": { + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The major dimension of the values.\n\nFor output, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.\n\nFor input, with `range=A1:B2,majorDimension=ROWS` then `[[1,2],[3,4]]`\nwill set `A1=1,B1=2,A2=3,B2=4`. With `range=A1:B2,majorDimension=COLUMNS`\nthen `[[1,2],[3,4]]` will set `A1=1,B1=3,A2=2,B2=4`.\n\nWhen writing, if this field is not set, it defaults to ROWS." }, - "cell": { - "$ref": "CellData", - "description": "The data to write." + "values": { + "description": "The data that was read or to be written. This is an array of arrays,\nthe outer array representing all the data and each inner array\nrepresenting a major dimension. Each item in the inner array\ncorresponds with one cell.\n\nFor output, empty trailing rows and columns will not be included.\n\nFor input, supported value types are: bool, string, and double.\nNull values will be skipped.\nTo set a cell to an empty value, set the string value to an empty string.", + "type": "array", + "items": { + "type": "array", + "items": { + "type": "any" + } + } } }, - "id": "RepeatCellRequest" - }, - "UpdateSpreadsheetPropertiesRequest": { - "description": "Updates properties of a spreadsheet.", + "id": "ValueRange" + }, + "AddBandingRequest": { "type": "object", "properties": { - "properties": { - "$ref": "SpreadsheetProperties", - "description": "The properties to update." - }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root 'properties' is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" + "bandedRange": { + "description": "The banded range to add. The bandedRangeId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a range that already exists.)", + "$ref": "BandedRange" } }, - "id": "UpdateSpreadsheetPropertiesRequest" + "id": "AddBandingRequest", + "description": "Adds a new banded range to the spreadsheet." }, - "ProtectedRange": { - "description": "A protected range.", + "Response": { "type": "object", "properties": { - "warningOnly": { - "description": "True if this protected range will show a warning when editing.\nWarning-based protection means that every user can edit data in the\nprotected range, except editing will prompt a warning asking the user\nto confirm the edit.\n\nWhen writing: if this field is true, then editors is ignored.\nAdditionally, if this field is changed from true to false and the\n`editors` field is not set (nor included in the field mask), then\nthe editors will be set to all the editors in the document.", - "type": "boolean" + "addSheet": { + "$ref": "AddSheetResponse", + "description": "A reply from adding a sheet." }, - "requestingUserCanEdit": { - "description": "True if the user who requested this protected range can edit the\nprotected area.\nThis field is read-only.", - "type": "boolean" + "updateConditionalFormatRule": { + "$ref": "UpdateConditionalFormatRuleResponse", + "description": "A reply from updating a conditional format rule." }, - "editors": { - "$ref": "Editors", - "description": "The users and groups with edit access to the protected range.\nThis field is only visible to users with edit access to the protected\nrange and the document.\nEditors are not supported with warning_only protection." + "createDeveloperMetadata": { + "$ref": "CreateDeveloperMetadataResponse", + "description": "A reply from creating a developer metadata entry." }, - "range": { - "$ref": "GridRange", - "description": "The range that is being protected.\nThe range may be fully unbounded, in which case this is considered\na protected sheet.\n\nWhen writing, only one of range or named_range_id\nmay be set." + "addNamedRange": { + "$ref": "AddNamedRangeResponse", + "description": "A reply from adding a named range." }, - "description": { - "description": "The description of this protected range.", - "type": "string" + "deleteDeveloperMetadata": { + "$ref": "DeleteDeveloperMetadataResponse", + "description": "A reply from deleting a developer metadata entry." }, - "unprotectedRanges": { - "description": "The list of unprotected ranges within a protected sheet.\nUnprotected ranges are only supported on protected sheets.", - "type": "array", - "items": { - "$ref": "GridRange" - } + "trimWhitespace": { + "description": "A reply from trimming whitespace.", + "$ref": "TrimWhitespaceResponse" }, - "namedRangeId": { - "description": "The named range this protected range is backed by, if any.\n\nWhen writing, only one of range or named_range_id\nmay be set.", - "type": "string" + "deleteDuplicates": { + "$ref": "DeleteDuplicatesResponse", + "description": "A reply from removing rows containing duplicate values." }, - "protectedRangeId": { - "description": "The ID of the protected range.\nThis field is read-only.", - "format": "int32", - "type": "integer" - } - }, - "id": "ProtectedRange" - }, - "DimensionProperties": { - "id": "DimensionProperties", - "description": "Properties about a dimension.", - "type": "object", - "properties": { - "developerMetadata": { - "description": "The developer metadata associated with a single row or column.", - "type": "array", - "items": { - "$ref": "DeveloperMetadata" - } + "addFilterView": { + "$ref": "AddFilterViewResponse", + "description": "A reply from adding a filter view." }, - "pixelSize": { - "description": "The height (if a row) or width (if a column) of the dimension in pixels.", - "format": "int32", - "type": "integer" + "addBanding": { + "$ref": "AddBandingResponse", + "description": "A reply from adding a banded range." }, - "hiddenByFilter": { - "description": "True if this dimension is being filtered.\nThis field is read-only.", - "type": "boolean" + "addProtectedRange": { + "$ref": "AddProtectedRangeResponse", + "description": "A reply from adding a protected range." }, - "hiddenByUser": { - "description": "True if this dimension is explicitly hidden.", - "type": "boolean" + "duplicateSheet": { + "description": "A reply from duplicating a sheet.", + "$ref": "DuplicateSheetResponse" + }, + "deleteConditionalFormatRule": { + "$ref": "DeleteConditionalFormatRuleResponse", + "description": "A reply from deleting a conditional format rule." + }, + "updateEmbeddedObjectPosition": { + "$ref": "UpdateEmbeddedObjectPositionResponse", + "description": "A reply from updating an embedded object's position." + }, + "addSlicer": { + "$ref": "AddSlicerResponse", + "description": "A reply from adding a slicer." + }, + "deleteDimensionGroup": { + "description": "A reply from deleting a dimension group.", + "$ref": "DeleteDimensionGroupResponse" + }, + "duplicateFilterView": { + "$ref": "DuplicateFilterViewResponse", + "description": "A reply from duplicating a filter view." + }, + "addDimensionGroup": { + "description": "A reply from adding a dimension group.", + "$ref": "AddDimensionGroupResponse" + }, + "addChart": { + "description": "A reply from adding a chart.", + "$ref": "AddChartResponse" + }, + "updateDeveloperMetadata": { + "description": "A reply from updating a developer metadata entry.", + "$ref": "UpdateDeveloperMetadataResponse" + }, + "findReplace": { + "description": "A reply from doing a find/replace.", + "$ref": "FindReplaceResponse" } - } + }, + "id": "Response", + "description": "A single response from an update." }, - "DimensionRange": { + "InsertRangeRequest": { "type": "object", "properties": { - "dimension": { + "shiftDimension": { + "type": "string", "enumDescriptions": [ "The default value, do not use.", "Operates on the rows of a sheet.", @@ -1936,3908 +1166,4247 @@ "ROWS", "COLUMNS" ], - "description": "The dimension of the span.", - "type": "string" - }, - "startIndex": { - "type": "integer", - "description": "The start (inclusive) of the span, or not set if unbounded.", - "format": "int32" + "description": "The dimension which will be shifted when inserting cells.\nIf ROWS, existing cells will be shifted down.\nIf COLUMNS, existing cells will be shifted right." }, - "endIndex": { - "description": "The end (exclusive) of the span, or not set if unbounded.", + "range": { + "$ref": "GridRange", + "description": "The range to insert new cells into." + } + }, + "id": "InsertRangeRequest", + "description": "Inserts cells into a range, shifting the existing cells over or down." + }, + "EmbeddedChart": { + "description": "A chart embedded in a sheet.", + "type": "object", + "properties": { + "chartId": { + "description": "The ID of the chart.", "format": "int32", "type": "integer" }, - "sheetId": { - "description": "The sheet this span is on.", - "format": "int32", - "type": "integer" + "position": { + "$ref": "EmbeddedObjectPosition", + "description": "The position of the chart." + }, + "spec": { + "$ref": "ChartSpec", + "description": "The specification of the chart." } }, - "id": "DimensionRange", - "description": "A range along a single dimension on a sheet.\nAll indexes are zero-based.\nIndexes are half open: the start index is inclusive\nand the end index is exclusive.\nMissing indexes indicate the range is unbounded on that side." + "id": "EmbeddedChart" }, - "NamedRange": { + "AddNamedRangeResponse": { + "id": "AddNamedRangeResponse", + "description": "The result of adding a named range.", "type": "object", "properties": { - "namedRangeId": { - "description": "The ID of the named range.", - "type": "string" - }, - "range": { - "$ref": "GridRange", - "description": "The range this represents." - }, - "name": { - "type": "string", - "description": "The name of the named range." + "namedRange": { + "$ref": "NamedRange", + "description": "The named range to add." + } + } + }, + "AddSheetRequest": { + "description": "Adds a new sheet.\nWhen a sheet is added at a given index,\nall subsequent sheets' indexes are incremented.\nTo add an object sheet, use AddChartRequest instead and specify\nEmbeddedObjectPosition.sheetId or\nEmbeddedObjectPosition.newSheet.", + "type": "object", + "properties": { + "properties": { + "$ref": "SheetProperties", + "description": "The properties the new sheet should have.\nAll properties are optional.\nThe sheetId field is optional; if one is not\nset, an id will be randomly generated. (It is an error to specify the ID\nof a sheet that already exists.)" } }, - "id": "NamedRange", - "description": "A named range." + "id": "AddSheetRequest" }, - "ChartCustomNumberFormatOptions": { - "description": "Custom number formatting options for chart attributes.", + "DeleteConditionalFormatRuleResponse": { + "id": "DeleteConditionalFormatRuleResponse", + "description": "The result of deleting a conditional format rule.", "type": "object", "properties": { - "prefix": { - "description": "Custom prefix to be prepended to the chart attribute.\nThis field is optional.", - "type": "string" - }, - "suffix": { - "description": "Custom suffix to be appended to the chart attribute.\nThis field is optional.", - "type": "string" + "rule": { + "$ref": "ConditionalFormatRule", + "description": "The rule that was deleted." + } + } + }, + "AddSlicerRequest": { + "description": "Adds a slicer to a sheet in the spreadsheet.", + "type": "object", + "properties": { + "slicer": { + "$ref": "Slicer", + "description": "The slicer that should be added to the spreadsheet, including\nthe position where it should be placed. The slicerId field is optional; if one is not set, an id\nwill be randomly generated. (It is an error to specify the ID\nof a slicer that already exists.)" } }, - "id": "ChartCustomNumberFormatOptions" + "id": "AddSlicerRequest" }, - "Borders": { + "GridCoordinate": { "type": "object", "properties": { - "left": { - "$ref": "Border", - "description": "The left border of the cell." - }, - "right": { - "$ref": "Border", - "description": "The right border of the cell." + "sheetId": { + "type": "integer", + "description": "The sheet this coordinate is on.", + "format": "int32" }, - "bottom": { - "$ref": "Border", - "description": "The bottom border of the cell." + "rowIndex": { + "description": "The row index of the coordinate.", + "format": "int32", + "type": "integer" }, - "top": { - "$ref": "Border", - "description": "The top border of the cell." + "columnIndex": { + "description": "The column index of the coordinate.", + "format": "int32", + "type": "integer" } }, - "id": "Borders", - "description": "The borders of the cell." + "id": "GridCoordinate", + "description": "A coordinate in a sheet.\nAll indexes are zero-based." }, - "ManualRule": { - "id": "ManualRule", - "description": "Allows you to manually organize the values in a source data column into\nbuckets with names of your choosing. For example, a pivot table that\naggregates population by state:\n\n +-------+-------------------+\n | State | SUM of Population |\n +-------+-------------------+\n | AK | 0.7 |\n | AL | 4.8 |\n | AR | 2.9 |\n ...\n +-------+-------------------+\ncould be turned into a pivot table that aggregates population by time zone\nby providing a list of groups (for example, groupName = 'Central',\nitems = ['AL', 'AR', 'IA', ...]) to a manual group rule.\nNote that a similar effect could be achieved by adding a time zone column\nto the source data and adjusting the pivot table.\n\n +-----------+-------------------+\n | Time Zone | SUM of Population |\n +-----------+-------------------+\n | Central | 106.3 |\n | Eastern | 151.9 |\n | Mountain | 17.4 |\n ...\n +-----------+-------------------+", + "UpdateSheetPropertiesRequest": { + "description": "Updates properties of the sheet with the specified\nsheetId.", "type": "object", "properties": { - "groups": { - "description": "The list of group names and the corresponding items from the source data\nthat map to each group name.", - "type": "array", - "items": { - "$ref": "ManualRuleGroup" - } + "properties": { + "$ref": "SheetProperties", + "description": "The properties to update." + }, + "fields": { + "type": "string", + "description": "The fields that should be updated. At least one field must be specified.\nThe root `properties` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask" } - } + }, + "id": "UpdateSheetPropertiesRequest" }, - "DeleteConditionalFormatRuleRequest": { - "description": "Deletes a conditional format rule at the given index.\nAll subsequent rules' indexes are decremented.", + "GridProperties": { + "description": "Properties of a grid.", "type": "object", "properties": { - "index": { - "description": "The zero-based index of the rule to be deleted.", + "frozenRowCount": { + "description": "The number of rows that are frozen in the grid.", "format": "int32", "type": "integer" }, - "sheetId": { + "columnCount": { "type": "integer", - "description": "The sheet the rule is being deleted from.", + "description": "The number of columns in the grid.", "format": "int32" + }, + "frozenColumnCount": { + "description": "The number of columns that are frozen in the grid.", + "format": "int32", + "type": "integer" + }, + "columnGroupControlAfter": { + "description": "True if the column grouping control toggle is shown after the group.", + "type": "boolean" + }, + "rowGroupControlAfter": { + "description": "True if the row grouping control toggle is shown after the group.", + "type": "boolean" + }, + "rowCount": { + "description": "The number of rows in the grid.", + "format": "int32", + "type": "integer" + }, + "hideGridlines": { + "description": "True if the grid isn't showing gridlines in the UI.", + "type": "boolean" } }, - "id": "DeleteConditionalFormatRuleRequest" - }, - "DeleteNamedRangeRequest": { - "description": "Removes the named range with the given ID from the spreadsheet.", - "type": "object", - "properties": { - "namedRangeId": { - "type": "string", - "description": "The ID of the named range to delete." - } - }, - "id": "DeleteNamedRangeRequest" + "id": "GridProperties" }, - "AddBandingResponse": { + "AddSlicerResponse": { + "id": "AddSlicerResponse", + "description": "The result of adding a slicer to a spreadsheet.", "type": "object", "properties": { - "bandedRange": { - "description": "The banded range that was added.", - "$ref": "BandedRange" + "slicer": { + "$ref": "Slicer", + "description": "The newly added slicer." } - }, - "id": "AddBandingResponse", - "description": "The result of adding a banded range." + } }, - "AddDimensionGroupResponse": { - "description": "The result of adding a group.", + "Sheet": { + "description": "A sheet in a spreadsheet.", "type": "object", "properties": { - "dimensionGroups": { - "description": "All groups of a dimension after adding a group to that dimension.", + "charts": { + "description": "The specifications of every chart on this sheet.", "type": "array", "items": { - "$ref": "DimensionGroup" + "$ref": "EmbeddedChart" } - } - }, - "id": "AddDimensionGroupResponse" - }, - "ManualRuleGroup": { - "type": "object", - "properties": { - "items": { - "description": "The items in the source data that should be placed into this group. Each\nitem may be a string, number, or boolean. Items may appear in at most one\ngroup within a given ManualRule. Items that do not appear in any\ngroup will appear on their own.", + }, + "filterViews": { + "description": "The filter views in this sheet.", "type": "array", "items": { - "$ref": "ExtendedValue" + "$ref": "FilterView" } }, - "groupName": { - "$ref": "ExtendedValue", - "description": "The group name, which must be a string. Each group in a given\nManualRule must have a unique group name." - } - }, - "id": "ManualRuleGroup", - "description": "A group name and a list of items from the source data that should be placed\nin the group with this name." - }, - "PivotGroup": { - "description": "A single grouping (either row or column) in a pivot table.", - "type": "object", - "properties": { - "valueBucket": { - "$ref": "PivotGroupSortValueBucket", - "description": "The bucket of the opposite pivot group to sort by.\nIf not specified, sorting is alphabetical by this group's values." - }, - "valueMetadata": { - "description": "Metadata about values in the grouping.", + "slicers": { + "description": "The slicers on this sheet.", "type": "array", "items": { - "$ref": "PivotGroupValueMetadata" + "$ref": "Slicer" } }, - "showTotals": { - "type": "boolean", - "description": "True if the pivot table should include the totals for this grouping." - }, - "groupRule": { - "$ref": "PivotGroupRule", - "description": "The group rule to apply to this row/column group." - }, - "label": { - "description": "The labels to use for the row/column groups which can be customized. For\nexample, in the following pivot table, the row label is `Region` (which\ncould be renamed to `State`) and the column label is `Product` (which\ncould be renamed `Item`). Pivot tables created before December 2017 do\nnot have header labels. If you'd like to add header labels to an existing\npivot table, please delete the existing pivot table and then create a new\npivot table with same parameters.\n\n +--------------+---------+-------+\n | SUM of Units | Product | |\n | Region | Pen | Paper |\n +--------------+---------+-------+\n | New York | 345 | 98 |\n | Oregon | 234 | 123 |\n | Tennessee | 531 | 415 |\n +--------------+---------+-------+\n | Grand Total | 1110 | 636 |\n +--------------+---------+-------+", - "type": "string" - }, - "repeatHeadings": { - "type": "boolean", - "description": "True if the headings in this pivot group should be repeated.\nThis is only valid for row groupings and is ignored by columns.\n\nBy default, we minimize repitition of headings by not showing higher\nlevel headings where they are the same. For example, even though the\nthird row below corresponds to \"Q1 Mar\", \"Q1\" is not shown because\nit is redundant with previous rows. Setting repeat_headings to true\nwould cause \"Q1\" to be repeated for \"Feb\" and \"Mar\".\n\n +--------------+\n | Q1 | Jan |\n | | Feb |\n | | Mar |\n +--------+-----+\n | Q1 Total |\n +--------------+" + "rowGroups": { + "description": "All row groups on this sheet, ordered by increasing range start index, then\nby group depth.", + "type": "array", + "items": { + "$ref": "DimensionGroup" + } }, - "sourceColumnOffset": { - "type": "integer", - "description": "The column offset of the source range that this grouping is based on.\n\nFor example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`\nmeans this group refers to column `C`, whereas the offset `1` would refer\nto column `D`.", - "format": "int32" + "data": { + "description": "Data in the grid, if this is a grid sheet.\nThe number of GridData objects returned is dependent on the number of\nranges requested on this sheet. For example, if this is representing\n`Sheet1`, and the spreadsheet was requested with ranges\n`Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a\nstartRow/startColumn of `0`,\nwhile the second one will have `startRow 14` (zero-based row 15),\nand `startColumn 3` (zero-based column D).", + "type": "array", + "items": { + "$ref": "GridData" + } }, - "sortOrder": { - "type": "string", - "enumDescriptions": [ - "Default value, do not use this.", - "Sort ascending.", - "Sort descending." - ], - "enum": [ - "SORT_ORDER_UNSPECIFIED", - "ASCENDING", - "DESCENDING" - ], - "description": "The order the values in this group should be sorted." - } - }, - "id": "PivotGroup" - }, - "TrimWhitespaceResponse": { - "description": "The result of trimming whitespace in cells.", - "type": "object", - "properties": { - "cellsChangedCount": { - "type": "integer", - "description": "The number of cells that were trimmed of whitespace.", - "format": "int32" - } - }, - "id": "TrimWhitespaceResponse" - }, - "PivotTable": { - "description": "A pivot table.", - "type": "object", - "properties": { - "valueLayout": { - "enumDescriptions": [ - "Values are laid out horizontally (as columns).", - "Values are laid out vertically (as rows)." - ], - "enum": [ - "HORIZONTAL", - "VERTICAL" - ], - "description": "Whether values should be listed horizontally (as columns)\nor vertically (as rows).", - "type": "string" + "properties": { + "description": "The properties of the sheet.", + "$ref": "SheetProperties" }, - "values": { - "description": "A list of values to include in the pivot table.", + "developerMetadata": { + "description": "The developer metadata associated with a sheet.", "type": "array", "items": { - "$ref": "PivotValue" + "$ref": "DeveloperMetadata" } }, - "source": { - "$ref": "GridRange", - "description": "The range the pivot table is reading data from." + "protectedRanges": { + "description": "The protected ranges in this sheet.", + "type": "array", + "items": { + "$ref": "ProtectedRange" + } }, - "columns": { - "description": "Each column grouping in the pivot table.", + "conditionalFormats": { + "description": "The conditional format rules in this sheet.", "type": "array", "items": { - "$ref": "PivotGroup" + "$ref": "ConditionalFormatRule" } }, - "criteria": { - "description": "An optional mapping of filters per source column offset.\n\nThe filters are applied before aggregating data into the pivot table.\nThe map's key is the column offset of the source range that you want to\nfilter, and the value is the criteria for that column.\n\nFor example, if the source was `C10:E15`, a key of `0` will have the filter\nfor column `C`, whereas the key `1` is for column `D`.", - "type": "object", - "additionalProperties": { - "$ref": "PivotFilterCriteria" + "columnGroups": { + "description": "All column groups on this sheet, ordered by increasing range start index,\nthen by group depth.", + "type": "array", + "items": { + "$ref": "DimensionGroup" } }, - "rows": { + "basicFilter": { + "$ref": "BasicFilter", + "description": "The filter on this sheet, if any." + }, + "merges": { "type": "array", "items": { - "$ref": "PivotGroup" + "$ref": "GridRange" }, - "description": "Each row grouping in the pivot table." - } - }, - "id": "PivotTable" - }, - "SearchDeveloperMetadataResponse": { - "type": "object", - "properties": { - "matchedDeveloperMetadata": { - "description": "The metadata matching the criteria of the search request.", + "description": "The ranges that are merged together." + }, + "bandedRanges": { "type": "array", "items": { - "$ref": "MatchedDeveloperMetadata" - } + "$ref": "BandedRange" + }, + "description": "The banded (alternating colors) ranges on this sheet." } }, - "id": "SearchDeveloperMetadataResponse", - "description": "A reply to a developer metadata search request." + "id": "Sheet" }, - "AppendCellsRequest": { - "id": "AppendCellsRequest", - "description": "Adds new cells after the last row with data in a sheet,\ninserting new rows into the sheet if necessary.", + "PivotGroupValueMetadata": { + "description": "Metadata about a value in a pivot grouping.", "type": "object", "properties": { - "rows": { - "description": "The data to append.", - "type": "array", - "items": { - "$ref": "RowData" - } - }, - "fields": { - "type": "string", - "description": "The fields of CellData that should be updated.\nAt least one field must be specified.\nThe root is the CellData; 'row.values.' should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask" + "value": { + "$ref": "ExtendedValue", + "description": "The calculated value the metadata corresponds to.\n(Note that formulaValue is not valid,\n because the values will be calculated.)" }, - "sheetId": { - "description": "The sheet ID to append the data to.", - "format": "int32", - "type": "integer" + "collapsed": { + "description": "True if the data corresponding to the value is collapsed.", + "type": "boolean" } - } + }, + "id": "PivotGroupValueMetadata" }, - "TextFormatRun": { + "FilterCriteria": { + "description": "Criteria for showing/hiding rows in a filter or filter view.", "type": "object", "properties": { - "startIndex": { - "description": "The character index where this run starts.", - "format": "int32", - "type": "integer" + "visibleForegroundColor": { + "$ref": "Color", + "description": "The text color to filter by; only cells with this text color are shown.\nMutually exclusive with all other filter criteria. Requests to set this\nfield will fail with a 400 error if any other filter criteria field is set." + }, + "hiddenValues": { + "description": "Values that should be hidden.", + "type": "array", + "items": { + "type": "string" + } }, - "format": { - "$ref": "TextFormat", - "description": "The format of this run. Absent values inherit the cell's format." + "condition": { + "$ref": "BooleanCondition", + "description": "A condition that must be true for values to be shown.\n(This does not override hidden_values -- if a value is listed there,\n it will still be hidden.)" + }, + "visibleBackgroundColor": { + "description": "The background fill color to filter by; only cells with this fill color are\nshown. Mutually exclusive with all other filter criteria. Requests to set\nthis field will fail with a 400 error if any other filter criteria field is\nset.", + "$ref": "Color" } }, - "id": "TextFormatRun", - "description": "A run of a text format. The format of this run continues until the start\nindex of the next run.\nWhen updating, all fields must be set." + "id": "FilterCriteria" }, - "BatchUpdateValuesByDataFilterResponse": { + "Editors": { + "description": "The editors of a protected range.", "type": "object", "properties": { - "totalUpdatedColumns": { - "description": "The total number of columns where at least one cell in the column was\nupdated.", - "format": "int32", - "type": "integer" - }, - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", - "type": "string" - }, - "totalUpdatedRows": { - "type": "integer", - "description": "The total number of rows where at least one cell in the row was updated.", - "format": "int32" - }, - "responses": { - "description": "The response for each range updated.", + "users": { + "description": "The email addresses of users with edit access to the protected range.", "type": "array", "items": { - "$ref": "UpdateValuesByDataFilterResponse" + "type": "string" } }, - "totalUpdatedSheets": { - "description": "The total number of sheets where at least one cell in the sheet was\nupdated.", - "format": "int32", - "type": "integer" + "groups": { + "description": "The email addresses of groups with edit access to the protected range.", + "type": "array", + "items": { + "type": "string" + } }, - "totalUpdatedCells": { - "description": "The total number of cells updated.", - "format": "int32", - "type": "integer" + "domainUsersCanEdit": { + "description": "True if anyone in the document's domain has edit access to the protected\nrange. Domain protection is only supported on documents within a domain.", + "type": "boolean" } }, - "id": "BatchUpdateValuesByDataFilterResponse", - "description": "The response when updating a range of values in a spreadsheet." + "id": "Editors" }, - "RowData": { - "description": "Data about each cell in a row.", + "DataValidationRule": { + "description": "A data validation rule.", "type": "object", "properties": { - "values": { - "description": "The values in the row, one per column.", - "type": "array", - "items": { - "$ref": "CellData" - } + "condition": { + "description": "The condition that data in the cell must match.", + "$ref": "BooleanCondition" + }, + "showCustomUi": { + "description": "True if the UI should be customized based on the kind of condition.\nIf true, \"List\" conditions will show a dropdown.", + "type": "boolean" + }, + "strict": { + "description": "True if invalid data should be rejected.", + "type": "boolean" + }, + "inputMessage": { + "description": "A message to show the user when adding data to the cell.", + "type": "string" } }, - "id": "RowData" + "id": "DataValidationRule" }, - "Border": { + "TextRotation": { "type": "object", "properties": { - "width": { - "description": "The width of the border, in pixels.\nDeprecated; the width is determined by the \"style\" field.", + "angle": { + "description": "The angle between the standard orientation and the desired orientation.\nMeasured in degrees. Valid values are between -90 and 90. Positive\nangles are angled upwards, negative are angled downwards.\n\nNote: For LTR text direction positive angles are in the\ncounterclockwise direction, whereas for RTL they are in the clockwise\ndirection", "format": "int32", "type": "integer" }, - "style": { - "enumDescriptions": [ - "The style is not specified. Do not use this.", - "The border is dotted.", - "The border is dashed.", - "The border is a thin solid line.", - "The border is a medium solid line.", - "The border is a thick solid line.", - "No border.\nUsed only when updating a border in order to erase it.", - "The border is two solid lines." - ], - "enum": [ - "STYLE_UNSPECIFIED", - "DOTTED", - "DASHED", - "SOLID", - "SOLID_MEDIUM", - "SOLID_THICK", - "NONE", - "DOUBLE" - ], - "description": "The style of the border.", - "type": "string" - }, - "color": { - "$ref": "Color", - "description": "The color of the border." + "vertical": { + "description": "If true, text reads top to bottom, but the orientation of individual\ncharacters is unchanged.\nFor example:\n\n | V |\n | e |\n | r |\n | t |\n | i |\n | c |\n | a |\n | l |", + "type": "boolean" } }, - "id": "Border", - "description": "A border along a cell." + "id": "TextRotation", + "description": "The rotation applied to text in a cell." }, - "GridData": { + "DeleteDimensionGroupResponse": { "type": "object", "properties": { - "columnMetadata": { - "description": "Metadata about the requested columns in the grid, starting with the column\nin start_column.", - "type": "array", - "items": { - "$ref": "DimensionProperties" - } - }, - "startColumn": { - "type": "integer", - "description": "The first column this GridData refers to, zero-based.", - "format": "int32" - }, - "rowMetadata": { - "description": "Metadata about the requested rows in the grid, starting with the row\nin start_row.", - "type": "array", - "items": { - "$ref": "DimensionProperties" - } - }, - "rowData": { - "description": "The data in the grid, one entry per row,\nstarting with the row in startRow.\nThe values in RowData will correspond to columns starting\nat start_column.", + "dimensionGroups": { "type": "array", "items": { - "$ref": "RowData" - } - }, - "startRow": { - "description": "The first row this GridData refers to, zero-based.", - "format": "int32", - "type": "integer" + "$ref": "DimensionGroup" + }, + "description": "All groups of a dimension after deleting a group from that dimension." } }, - "id": "GridData", - "description": "Data in the grid, as well as metadata about the dimensions." + "id": "DeleteDimensionGroupResponse", + "description": "The result of deleting a group." }, - "UpdateNamedRangeRequest": { + "UpdateDeveloperMetadataRequest": { + "description": "A request to update properties of developer metadata.\nUpdates the properties of the developer metadata selected by the filters to\nthe values provided in the DeveloperMetadata resource. Callers must\nspecify the properties they wish to update in the fields parameter, as well\nas specify at least one DataFilter matching the metadata they wish to\nupdate.", "type": "object", "properties": { - "namedRange": { - "$ref": "NamedRange", - "description": "The named range to update with the new properties." + "dataFilters": { + "type": "array", + "items": { + "$ref": "DataFilter" + }, + "description": "The filters matching the developer metadata entries to update." }, "fields": { "type": "string", - "description": "The fields that should be updated. At least one field must be specified.\nThe root `namedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "description": "The fields that should be updated. At least one field must be specified.\nThe root `developerMetadata` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", "format": "google-fieldmask" + }, + "developerMetadata": { + "$ref": "DeveloperMetadata", + "description": "The value that all metadata matched by the data filters will be updated to." } }, - "id": "UpdateNamedRangeRequest", - "description": "Updates properties of the named range with the specified\nnamedRangeId." + "id": "UpdateDeveloperMetadataRequest" }, - "FindReplaceRequest": { - "description": "Finds and replaces data in cells over a range, sheet, or all sheets.", + "PieChartSpec": { + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/piechart\"\u003epie chart\u003c/a\u003e.", "type": "object", "properties": { - "sheetId": { - "description": "The sheet to find/replace over.", - "format": "int32", - "type": "integer" + "domain": { + "description": "The data that covers the domain of the pie chart.", + "$ref": "ChartData" }, - "matchCase": { + "threeDimensional": { "type": "boolean", - "description": "True if the search is case sensitive." - }, - "allSheets": { - "description": "True to find/replace over all sheets.", - "type": "boolean" - }, - "includeFormulas": { - "description": "True if the search should include cells with formulas.\nFalse to skip cells with formulas.", - "type": "boolean" + "description": "True if the pie is three dimensional." }, - "matchEntireCell": { - "description": "True if the find value should match the entire cell.", - "type": "boolean" + "series": { + "$ref": "ChartData", + "description": "The data that covers the one and only series of the pie chart." }, - "find": { - "description": "The value to search.", - "type": "string" + "legendPosition": { + "enum": [ + "PIE_CHART_LEGEND_POSITION_UNSPECIFIED", + "BOTTOM_LEGEND", + "LEFT_LEGEND", + "RIGHT_LEGEND", + "TOP_LEGEND", + "NO_LEGEND", + "LABELED_LEGEND" + ], + "description": "Where the legend of the pie chart should be drawn.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "The legend is rendered on the bottom of the chart.", + "The legend is rendered on the left of the chart.", + "The legend is rendered on the right of the chart.", + "The legend is rendered on the top of the chart.", + "No legend is rendered.", + "Each pie slice has a label attached to it." + ] }, - "searchByRegex": { - "description": "True if the find value is a regex.\nThe regular expression and replacement should follow Java regex rules\nat https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html.\nThe replacement string is allowed to refer to capturing groups.\nFor example, if one cell has the contents `\"Google Sheets\"` and another\nhas `\"Google Docs\"`, then searching for `\"o.* (.*)\"` with a replacement of\n`\"$1 Rocks\"` would change the contents of the cells to\n`\"GSheets Rocks\"` and `\"GDocs Rocks\"` respectively.", - "type": "boolean" + "pieHole": { + "type": "number", + "description": "The size of the hole in the pie chart.", + "format": "double" + } + }, + "id": "PieChartSpec" + }, + "UpdateSlicerSpecRequest": { + "description": "Updates a slicer’s specifications.\n(This does not move or resize a slicer. To move or resize a slicer use\nUpdateEmbeddedObjectPositionRequest.", + "type": "object", + "properties": { + "spec": { + "$ref": "SlicerSpec", + "description": "The specification to apply to the slicer." }, - "replacement": { - "description": "The value to use as the replacement.", + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `SlicerSpec` is implied and should not be specified. A single \"*\"`\ncan be used as short-hand for listing every field.", + "format": "google-fieldmask", "type": "string" }, - "range": { - "$ref": "GridRange", - "description": "The range to find/replace over." + "slicerId": { + "type": "integer", + "description": "The id of the slicer to update.", + "format": "int32" } }, - "id": "FindReplaceRequest" + "id": "UpdateSlicerSpecRequest" }, - "UpdateCellsRequest": { - "description": "Updates all cells in a range with new data.", + "UpdateFilterViewRequest": { + "description": "Updates properties of the filter view.", "type": "object", "properties": { - "range": { - "$ref": "GridRange", - "description": "The range to write data to.\n\nIf the data in rows does not cover the entire requested range,\nthe fields matching those set in fields will be cleared." - }, - "rows": { - "description": "The data to write.", - "type": "array", - "items": { - "$ref": "RowData" - } + "filter": { + "$ref": "FilterView", + "description": "The new properties of the filter view." }, "fields": { - "description": "The fields of CellData that should be updated.\nAt least one field must be specified.\nThe root is the CellData; 'row.values.' should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "description": "The fields that should be updated. At least one field must be specified.\nThe root `filter` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", "format": "google-fieldmask", "type": "string" - }, - "start": { - "$ref": "GridCoordinate", - "description": "The coordinate to start writing data at.\nAny number of rows and columns (including a different number of\ncolumns per row) may be written." } }, - "id": "UpdateCellsRequest" + "id": "UpdateFilterViewRequest" }, - "RandomizeRangeRequest": { + "ConditionalFormatRule": { "type": "object", "properties": { - "range": { - "$ref": "GridRange", - "description": "The range to randomize." + "booleanRule": { + "$ref": "BooleanRule", + "description": "The formatting is either \"on\" or \"off\" according to the rule." + }, + "ranges": { + "type": "array", + "items": { + "$ref": "GridRange" + }, + "description": "The ranges that are formatted if the condition is true.\nAll the ranges must be on the same grid." + }, + "gradientRule": { + "$ref": "GradientRule", + "description": "The formatting will vary based on the gradients in the rule." } }, - "id": "RandomizeRangeRequest", - "description": "Randomizes the order of the rows in a range." + "id": "ConditionalFormatRule", + "description": "A rule describing a conditional format." }, - "DeleteRangeRequest": { - "id": "DeleteRangeRequest", - "description": "Deletes a range of cells, shifting other cells into the deleted area.", + "CopyPasteRequest": { + "id": "CopyPasteRequest", + "description": "Copies data from the source to the destination.", "type": "object", "properties": { - "shiftDimension": { + "destination": { + "$ref": "GridRange", + "description": "The location to paste to. If the range covers a span that's\na multiple of the source's height or width, then the\ndata will be repeated to fill in the destination range.\nIf the range is smaller than the source range, the entire\nsource data will still be copied (beyond the end of the destination range)." + }, + "pasteOrientation": { + "enum": [ + "NORMAL", + "TRANSPOSE" + ], + "description": "How that data should be oriented when pasting.", + "type": "string", "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." + "Paste normally.", + "Paste transposed, where all rows become columns and vice versa." + ] + }, + "source": { + "$ref": "GridRange", + "description": "The source range to copy." + }, + "pasteType": { + "enumDescriptions": [ + "Paste values, formulas, formats, and merges.", + "Paste the values ONLY without formats, formulas, or merges.", + "Paste the format and data validation only.", + "Like PASTE_NORMAL but without borders.", + "Paste the formulas only.", + "Paste the data validation only.", + "Paste the conditional formatting rules only." ], "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" + "PASTE_NORMAL", + "PASTE_VALUES", + "PASTE_FORMAT", + "PASTE_NO_BORDERS", + "PASTE_FORMULA", + "PASTE_DATA_VALIDATION", + "PASTE_CONDITIONAL_FORMATTING" ], - "description": "The dimension from which deleted cells will be replaced with.\nIf ROWS, existing cells will be shifted upward to\nreplace the deleted cells. If COLUMNS, existing cells\nwill be shifted left to replace the deleted cells.", + "description": "What kind of data to paste.", "type": "string" - }, - "range": { - "$ref": "GridRange", - "description": "The range of cells to delete." } } }, - "DeleteDuplicatesResponse": { - "description": "The result of removing duplicates in a range.", + "BooleanCondition": { + "id": "BooleanCondition", + "description": "A condition that can evaluate to true or false.\nBooleanConditions are used by conditional formatting,\ndata validation, and the criteria in filters.", "type": "object", "properties": { - "duplicatesRemovedCount": { - "type": "integer", - "description": "The number of duplicate rows removed.", - "format": "int32" + "type": { + "description": "The type of condition.", + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "The cell's value must be greater than the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be greater than or equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be less than the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be less than or equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be not equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be between the two condition values.\nSupported by data validation, conditional formatting and filters.\nRequires exactly two ConditionValues.", + "The cell's value must not be between the two condition values.\nSupported by data validation, conditional formatting and filters.\nRequires exactly two ConditionValues.", + "The cell's value must contain the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must not contain the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must start with the condition's value.\nSupported by conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must end with the condition's value.\nSupported by conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be exactly the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be a valid email address.\nSupported by data validation.\nRequires no ConditionValues.", + "The cell's value must be a valid URL.\nSupported by data validation.\nRequires no ConditionValues.", + "The cell's value must be the same date as the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be before the date of the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue\nthat may be a relative date.", + "The cell's value must be after the date of the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue\nthat may be a relative date.", + "The cell's value must be on or before the date of the condition's value.\nSupported by data validation.\nRequires a single ConditionValue\nthat may be a relative date.", + "The cell's value must be on or after the date of the condition's value.\nSupported by data validation.\nRequires a single ConditionValue\nthat may be a relative date.", + "The cell's value must be between the dates of the two condition values.\nSupported by data validation.\nRequires exactly two ConditionValues.", + "The cell's value must be outside the dates of the two condition values.\nSupported by data validation.\nRequires exactly two ConditionValues.", + "The cell's value must be a date.\nSupported by data validation.\nRequires no ConditionValues.", + "The cell's value must be listed in the grid in condition value's range.\nSupported by data validation.\nRequires a single ConditionValue,\nand the value must be a valid range in A1 notation.", + "The cell's value must be in the list of condition values.\nSupported by data validation.\nSupports any number of condition values,\none per item in the list.\nFormulas are not supported in the values.", + "The cell's value must be empty.\nSupported by conditional formatting and filters.\nRequires no ConditionValues.", + "The cell's value must not be empty.\nSupported by conditional formatting and filters.\nRequires no ConditionValues.", + "The condition's formula must evaluate to true.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", + "The cell's value must be TRUE/FALSE or in the list of condition values.\nSupported by data validation.\nRenders as a cell checkbox.\nSupports zero, one or two ConditionValues. No\nvalues indicates the cell must be TRUE or FALSE, where TRUE renders as\nchecked and FALSE renders as unchecked. One value indicates the cell\nwill render as checked when it contains that value and unchecked when it\nis blank. Two values indicate that the cell will render as checked when\nit contains the first value and unchecked when it contains the second\nvalue. For example, [\"Yes\",\"No\"] indicates that the cell will render a\nchecked box when it has the value \"Yes\" and an unchecked box when it has\nthe value \"No\"." + ], + "enum": [ + "CONDITION_TYPE_UNSPECIFIED", + "NUMBER_GREATER", + "NUMBER_GREATER_THAN_EQ", + "NUMBER_LESS", + "NUMBER_LESS_THAN_EQ", + "NUMBER_EQ", + "NUMBER_NOT_EQ", + "NUMBER_BETWEEN", + "NUMBER_NOT_BETWEEN", + "TEXT_CONTAINS", + "TEXT_NOT_CONTAINS", + "TEXT_STARTS_WITH", + "TEXT_ENDS_WITH", + "TEXT_EQ", + "TEXT_IS_EMAIL", + "TEXT_IS_URL", + "DATE_EQ", + "DATE_BEFORE", + "DATE_AFTER", + "DATE_ON_OR_BEFORE", + "DATE_ON_OR_AFTER", + "DATE_BETWEEN", + "DATE_NOT_BETWEEN", + "DATE_IS_VALID", + "ONE_OF_RANGE", + "ONE_OF_LIST", + "BLANK", + "NOT_BLANK", + "CUSTOM_FORMULA", + "BOOLEAN" + ] + }, + "values": { + "description": "The values of the condition. The number of supported values depends\non the condition type. Some support zero values,\nothers one or two values,\nand ConditionType.ONE_OF_LIST supports an arbitrary number of values.", + "type": "array", + "items": { + "$ref": "ConditionValue" + } } - }, - "id": "DeleteDuplicatesResponse" + } }, - "UnmergeCellsRequest": { + "AddDimensionGroupRequest": { + "description": "Creates a group over the specified range.\n\nIf the requested range is a superset of the range of an existing group G,\nthen the depth of G is incremented and this new group G' has the\ndepth of that group. For example, a group [C:D, depth 1] + [B:E] results in\ngroups [B:E, depth 1] and [C:D, depth 2].\nIf the requested range is a subset of the range of an existing group G,\nthen the depth of the new group G' becomes one greater than the depth of G.\nFor example, a group [B:E, depth 1] + [C:D] results in groups [B:E, depth 1]\nand [C:D, depth 2].\nIf the requested range starts before and ends within, or starts within and\nends after, the range of an existing group G, then the range of the existing\ngroup G becomes the union of the ranges, and the new group G' has\ndepth one greater than the depth of G and range as the intersection of the\nranges. For example, a group [B:D, depth 1] + [C:E] results in groups [B:E,\ndepth 1] and [C:D, depth 2].", "type": "object", "properties": { "range": { - "$ref": "GridRange", - "description": "The range within which all cells should be unmerged.\nIf the range spans multiple merges, all will be unmerged.\nThe range must not partially span any merge." + "description": "The range over which to create a group.", + "$ref": "DimensionRange" } }, - "id": "UnmergeCellsRequest", - "description": "Unmerges cells in the given range." + "id": "AddDimensionGroupRequest" }, - "SortSpec": { - "description": "A sort order associated with a specific column or row.", + "BasicChartSpec": { + "description": "The specification for a basic chart. See BasicChartType for the list\nof charts this supports.", "type": "object", "properties": { - "dimensionIndex": { - "description": "The dimension the sort should be applied to.", + "headerCount": { + "description": "The number of rows or columns in the data that are \"headers\".\nIf not set, Google Sheets will guess how many rows are headers based\non the data.\n\n(Note that BasicChartAxis.title may override the axis title\n inferred from the header values.)", "format": "int32", "type": "integer" }, - "backgroundColor": { - "$ref": "Color", - "description": "The background fill color to sort by. Mutually exclusive with sorting by\ntext color. Requests to set this field will fail with a 400 error if\nforeground color is also set." + "stackedType": { + "description": "The stacked type for charts that support vertical stacking.\nApplies to Area, Bar, Column, Combo, and Stepped Area charts.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "Series are not stacked.", + "Series values are stacked, each value is rendered vertically beginning\nfrom the top of the value below it.", + "Vertical stacks are stretched to reach the top of the chart, with\nvalues laid out as percentages of each other." + ], + "enum": [ + "BASIC_CHART_STACKED_TYPE_UNSPECIFIED", + "NOT_STACKED", + "STACKED", + "PERCENT_STACKED" + ] }, - "sortOrder": { + "axis": { + "type": "array", + "items": { + "$ref": "BasicChartAxis" + }, + "description": "The axis on the chart." + }, + "threeDimensional": { + "description": "True to make the chart 3D.\nApplies to Bar and Column charts.", + "type": "boolean" + }, + "chartType": { + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "A \u003ca href=\"/chart/interactive/docs/gallery/barchart\"\u003ebar chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/linechart\"\u003eline chart\u003c/a\u003e.", + "An \u003ca href=\"/chart/interactive/docs/gallery/areachart\"\u003earea chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/columnchart\"\u003ecolumn chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/scatterchart\"\u003escatter\nchart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/combochart\"\u003ecombo chart\u003c/a\u003e.", + "A \u003ca href=\"/chart/interactive/docs/gallery/steppedareachart\"\u003estepped area\nchart\u003c/a\u003e." + ], "enum": [ - "SORT_ORDER_UNSPECIFIED", - "ASCENDING", - "DESCENDING" + "BASIC_CHART_TYPE_UNSPECIFIED", + "BAR", + "LINE", + "AREA", + "COLUMN", + "SCATTER", + "COMBO", + "STEPPED_AREA" ], - "description": "The order data should be sorted.", + "description": "The type of the chart." + }, + "interpolateNulls": { + "description": "If some values in a series are missing, gaps may appear in the chart (e.g,\nsegments of lines in a line chart will be missing). To eliminate these\ngaps set this to true.\nApplies to Line, Area, and Combo charts.", + "type": "boolean" + }, + "series": { + "description": "The data this chart is visualizing.", + "type": "array", + "items": { + "$ref": "BasicChartSeries" + } + }, + "legendPosition": { + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "The legend is rendered on the bottom of the chart.", + "The legend is rendered on the left of the chart.", + "The legend is rendered on the right of the chart.", + "The legend is rendered on the top of the chart.", + "No legend is rendered." + ], + "enum": [ + "BASIC_CHART_LEGEND_POSITION_UNSPECIFIED", + "BOTTOM_LEGEND", + "LEFT_LEGEND", + "RIGHT_LEGEND", + "TOP_LEGEND", + "NO_LEGEND" + ], + "description": "The position of the chart legend." + }, + "compareMode": { "type": "string", "enumDescriptions": [ - "Default value, do not use this.", - "Sort ascending.", - "Sort descending." - ] + "Default value, do not use.", + "Only the focused data element is highlighted and shown in the tooltip.", + "All data elements with the same category (e.g., domain value) are\nhighlighted and shown in the tooltip." + ], + "enum": [ + "BASIC_CHART_COMPARE_MODE_UNSPECIFIED", + "DATUM", + "CATEGORY" + ], + "description": "The behavior of tooltips and data highlighting when hovering on data and\nchart area." }, - "foregroundColor": { - "$ref": "Color", - "description": "The text color to sort by. Mutually exclusive with sorting by background\nfill color. Requests to set this field will fail with a 400 error if\nbackground color is also set." - } - }, - "id": "SortSpec" - }, - "UpdateEmbeddedObjectPositionResponse": { - "type": "object", - "properties": { - "position": { - "description": "The new position of the embedded object.", - "$ref": "EmbeddedObjectPosition" + "domains": { + "description": "The domain of data this is charting.\nOnly a single domain is supported.", + "type": "array", + "items": { + "$ref": "BasicChartDomain" + } + }, + "lineSmoothing": { + "description": "Gets whether all lines should be rendered smooth or straight by default.\nApplies to Line charts.", + "type": "boolean" } }, - "id": "UpdateEmbeddedObjectPositionResponse", - "description": "The result of updating an embedded object's position." + "id": "BasicChartSpec" }, - "BooleanRule": { - "id": "BooleanRule", - "description": "A rule that may or may not match, depending on the condition.", + "CellData": { + "description": "Data about a specific cell.", "type": "object", "properties": { - "condition": { - "description": "The condition of the rule. If the condition evaluates to true,\nthe format is applied.", - "$ref": "BooleanCondition" + "formattedValue": { + "description": "The formatted value of the cell.\nThis is the value as it's shown to the user.\nThis field is read-only.", + "type": "string" }, - "format": { + "textFormatRuns": { + "description": "Runs of rich text applied to subsections of the cell. Runs are only valid\non user entered strings, not formulas, bools, or numbers.\nRuns start at specific indexes in the text and continue until the next\nrun. Properties of a run will continue unless explicitly changed\nin a subsequent run (and properties of the first run will continue\nthe properties of the cell unless explicitly changed).\n\nWhen writing, the new runs will overwrite any prior runs. When writing a\nnew user_entered_value, previous runs are erased.", + "type": "array", + "items": { + "$ref": "TextFormatRun" + } + }, + "hyperlink": { + "description": "A hyperlink this cell points to, if any.\nThis field is read-only. (To set it, use a `=HYPERLINK` formula\nin the userEnteredValue.formulaValue\nfield.)", + "type": "string" + }, + "pivotTable": { + "description": "A pivot table anchored at this cell. The size of pivot table itself\nis computed dynamically based on its data, grouping, filters, values,\netc. Only the top-left cell of the pivot table contains the pivot table\ndefinition. The other cells will contain the calculated values of the\nresults of the pivot in their effective_value fields.", + "$ref": "PivotTable" + }, + "userEnteredFormat": { "$ref": "CellFormat", - "description": "The format to apply.\nConditional formatting can only apply a subset of formatting:\nbold, italic,\nstrikethrough,\nforeground color &\nbackground color." + "description": "The format the user entered for the cell.\n\nWhen writing, the new format will be merged with the existing format." + }, + "note": { + "description": "Any note on the cell.", + "type": "string" + }, + "effectiveFormat": { + "$ref": "CellFormat", + "description": "The effective format being used by the cell.\nThis includes the results of applying any conditional formatting and,\nif the cell contains a formula, the computed number format.\nIf the effective format is the default format, effective format will\nnot be written.\nThis field is read-only." + }, + "userEnteredValue": { + "$ref": "ExtendedValue", + "description": "The value the user entered in the cell. e.g, `1234`, `'Hello'`, or `=NOW()`\nNote: Dates, Times and DateTimes are represented as doubles in\nserial number format." + }, + "dataValidation": { + "$ref": "DataValidationRule", + "description": "A data validation rule on the cell, if any.\n\nWhen writing, the new data validation rule will overwrite any prior rule." + }, + "effectiveValue": { + "$ref": "ExtendedValue", + "description": "The effective value of the cell. For cells with formulas, this is\nthe calculated value. For cells with literals, this is\nthe same as the user_entered_value.\nThis field is read-only." } - } + }, + "id": "CellData" }, - "WaterfallChartSpec": { - "description": "A waterfall chart.", + "BatchUpdateValuesByDataFilterRequest": { + "id": "BatchUpdateValuesByDataFilterRequest", + "description": "The request for updating more than one range of values in a spreadsheet.", "type": "object", "properties": { - "firstValueIsTotal": { - "description": "True to interpret the first value as a total.", + "includeValuesInResponse": { + "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values. The `updatedData` field within\neach of the BatchUpdateValuesResponse.responses will contain\nthe updated values. If the range to write was larger than than the range\nactually written, the response will include all values in the requested\nrange (excluding trailing empty rows and columns).", "type": "boolean" }, - "stackedType": { + "valueInputOption": { "enumDescriptions": [ - "Default value, do not use.", - "Values corresponding to the same domain (horizontal axis) value will be\nstacked vertically.", - "Series will spread out along the horizontal axis." + "Default input value. This value must not be used.", + "The values the user has entered will not be parsed and will be stored\nas-is.", + "The values will be parsed as if the user typed them into the UI.\nNumbers will stay as numbers, but strings may be converted to numbers,\ndates, etc. following the same rules that are applied when entering\ntext into a cell via the Google Sheets UI." ], "enum": [ - "WATERFALL_STACKED_TYPE_UNSPECIFIED", - "STACKED", - "SEQUENTIAL" + "INPUT_VALUE_OPTION_UNSPECIFIED", + "RAW", + "USER_ENTERED" ], - "description": "The stacked type.", + "description": "How the input data should be interpreted.", "type": "string" }, - "hideConnectorLines": { - "description": "True to hide connector lines between columns.", - "type": "boolean" - }, - "series": { - "description": "The data this waterfall chart is visualizing.", + "data": { + "description": "The new values to apply to the spreadsheet. If more than one range is\nmatched by the specified DataFilter the specified values will be\napplied to all of those ranges.", "type": "array", "items": { - "$ref": "WaterfallChartSeries" + "$ref": "DataFilterValueRange" } }, - "connectorLineStyle": { - "description": "The line style for the connector lines.", - "$ref": "LineStyle" + "responseDateTimeRenderOption": { + "type": "string", + "enumDescriptions": [ + "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", + "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." + ], + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ], + "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER." }, - "domain": { - "$ref": "WaterfallChartDomain", - "description": "The domain data (horizontal axis) for the waterfall chart." + "responseValueRenderOption": { + "type": "string", + "enumDescriptions": [ + "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", + "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", + "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." + ], + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" + ], + "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE." } - }, - "id": "WaterfallChartSpec" + } }, - "UpdateConditionalFormatRuleRequest": { + "UpdateDimensionGroupRequest": { + "id": "UpdateDimensionGroupRequest", + "description": "Updates the state of the specified group.", "type": "object", "properties": { - "sheetId": { - "description": "The sheet of the rule to move. Required if new_index is set,\nunused otherwise.", - "format": "int32", - "type": "integer" - }, - "newIndex": { - "type": "integer", - "description": "The zero-based new index the rule should end up at.", - "format": "int32" - }, - "rule": { - "description": "The rule that should replace the rule at the given index.", - "$ref": "ConditionalFormatRule" + "fields": { + "type": "string", + "description": "The fields that should be updated. At least one field must be specified.\nThe root `dimensionGroup` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask" }, - "index": { - "type": "integer", - "description": "The zero-based index of the rule that should be replaced or moved.", - "format": "int32" + "dimensionGroup": { + "$ref": "DimensionGroup", + "description": "The group whose state should be updated. The range and depth of the group\nshould specify a valid group on the sheet, and all other fields updated." } - }, - "id": "UpdateConditionalFormatRuleRequest", - "description": "Updates a conditional format rule at the given index,\nor moves a conditional format rule to another index." + } }, - "BasicChartDomain": { - "description": "The domain of a chart.\nFor example, if charting stock prices over time, this would be the date.", + "DeleteDeveloperMetadataResponse": { + "id": "DeleteDeveloperMetadataResponse", + "description": "The response from deleting developer metadata.", "type": "object", "properties": { - "reversed": { - "description": "True to reverse the order of the domain values (horizontal axis).", - "type": "boolean" + "deletedDeveloperMetadata": { + "description": "The metadata that was deleted.", + "type": "array", + "items": { + "$ref": "DeveloperMetadata" + } + } + } + }, + "SortRangeRequest": { + "description": "Sorts data in rows based on a sort order per column.", + "type": "object", + "properties": { + "range": { + "description": "The range to sort.", + "$ref": "GridRange" }, - "domain": { - "description": "The data of the domain. For example, if charting stock prices over time,\nthis is the data representing the dates.", - "$ref": "ChartData" + "sortSpecs": { + "type": "array", + "items": { + "$ref": "SortSpec" + }, + "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications." } }, - "id": "BasicChartDomain" + "id": "SortRangeRequest" }, - "PasteDataRequest": { + "MergeCellsRequest": { + "description": "Merges all cells in the range.", "type": "object", "properties": { - "coordinate": { - "$ref": "GridCoordinate", - "description": "The coordinate at which the data should start being inserted." - }, - "data": { - "description": "The data to insert.", - "type": "string" - }, - "delimiter": { - "description": "The delimiter in the data.", - "type": "string" + "range": { + "$ref": "GridRange", + "description": "The range of cells to merge." }, - "type": { + "mergeType": { "enum": [ - "PASTE_NORMAL", - "PASTE_VALUES", - "PASTE_FORMAT", - "PASTE_NO_BORDERS", - "PASTE_FORMULA", - "PASTE_DATA_VALIDATION", - "PASTE_CONDITIONAL_FORMATTING" + "MERGE_ALL", + "MERGE_COLUMNS", + "MERGE_ROWS" ], - "description": "How the data should be pasted.", + "description": "How the cells should be merged.", "type": "string", "enumDescriptions": [ - "Paste values, formulas, formats, and merges.", - "Paste the values ONLY without formats, formulas, or merges.", - "Paste the format and data validation only.", - "Like PASTE_NORMAL but without borders.", - "Paste the formulas only.", - "Paste the data validation only.", - "Paste the conditional formatting rules only." - ] - }, - "html": { - "description": "True if the data is HTML.", - "type": "boolean" - } - }, - "id": "PasteDataRequest", - "description": "Inserts data into the spreadsheet starting at the specified coordinate." - }, - "UpdateDeveloperMetadataResponse": { - "description": "The response from updating developer metadata.", - "type": "object", - "properties": { - "developerMetadata": { - "description": "The updated developer metadata.", - "type": "array", - "items": { - "$ref": "DeveloperMetadata" - } + "Create a single merge from the range", + "Create a merge for each column in the range", + "Create a merge for each row in the range" + ] } }, - "id": "UpdateDeveloperMetadataResponse" + "id": "MergeCellsRequest" }, - "AppendDimensionRequest": { - "description": "Appends rows or columns to the end of a sheet.", + "MatchedDeveloperMetadata": { + "description": "A developer metadata entry and the data filters specified in the original\nrequest that matched it.", "type": "object", "properties": { - "sheetId": { - "type": "integer", - "description": "The sheet to append rows or columns to.", - "format": "int32" - }, - "dimension": { - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ], - "description": "Whether rows or columns should be appended." + "dataFilters": { + "type": "array", + "items": { + "$ref": "DataFilter" + }, + "description": "All filters matching the returned developer metadata." }, - "length": { - "description": "The number of rows or columns to append.", - "format": "int32", - "type": "integer" + "developerMetadata": { + "description": "The developer metadata matching the specified filters.", + "$ref": "DeveloperMetadata" } }, - "id": "AppendDimensionRequest" + "id": "MatchedDeveloperMetadata" }, - "AddNamedRangeRequest": { + "AddProtectedRangeRequest": { + "description": "Adds a new protected range.", "type": "object", "properties": { - "namedRange": { - "$ref": "NamedRange", - "description": "The named range to add. The namedRangeId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a range that already exists.)" + "protectedRange": { + "$ref": "ProtectedRange", + "description": "The protected range to be added. The\nprotectedRangeId field is optional; if\none is not set, an id will be randomly generated. (It is an error to\nspecify the ID of a range that already exists.)" } }, - "id": "AddNamedRangeRequest", - "description": "Adds a named range to the spreadsheet." + "id": "AddProtectedRangeRequest" }, - "CreateDeveloperMetadataResponse": { - "description": "The response from creating developer metadata.", + "DuplicateFilterViewResponse": { "type": "object", "properties": { - "developerMetadata": { - "$ref": "DeveloperMetadata", - "description": "The developer metadata that was created." + "filter": { + "$ref": "FilterView", + "description": "The newly created filter." } }, - "id": "CreateDeveloperMetadataResponse" + "id": "DuplicateFilterViewResponse", + "description": "The result of a filter view being duplicated." }, - "UpdateEmbeddedObjectPositionRequest": { - "id": "UpdateEmbeddedObjectPositionRequest", - "description": "Update an embedded object's position (such as a moving or resizing a\nchart or image).", + "DuplicateSheetResponse": { + "description": "The result of duplicating a sheet.", "type": "object", "properties": { - "objectId": { - "description": "The ID of the object to moved.", - "format": "int32", - "type": "integer" - }, - "newPosition": { - "description": "An explicit position to move the embedded object to.\nIf newPosition.sheetId is set,\na new sheet with that ID will be created.\nIf newPosition.newSheet is set to true,\na new sheet will be created with an ID that will be chosen for you.", - "$ref": "EmbeddedObjectPosition" - }, - "fields": { - "description": "The fields of OverlayPosition\nthat should be updated when setting a new position. Used only if\nnewPosition.overlayPosition\nis set, in which case at least one field must\nbe specified. The root `newPosition.overlayPosition` is implied and\nshould not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" + "properties": { + "$ref": "SheetProperties", + "description": "The properties of the duplicate sheet." } - } + }, + "id": "DuplicateSheetResponse" }, - "WaterfallChartColumnStyle": { - "description": "Styles for a waterfall chart column.", + "BatchUpdateSpreadsheetResponse": { + "description": "The reply for batch updating a spreadsheet.", "type": "object", "properties": { - "label": { - "description": "The label of the column's legend.", + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", "type": "string" }, - "color": { - "description": "The color of the column.", - "$ref": "Color" + "replies": { + "description": "The reply of the updates. This maps 1:1 with the updates, although\nreplies to some requests may be empty.", + "type": "array", + "items": { + "$ref": "Response" + } + }, + "updatedSpreadsheet": { + "$ref": "Spreadsheet", + "description": "The spreadsheet after updates were applied. This is only set if\n[BatchUpdateSpreadsheetRequest.include_spreadsheet_in_response] is `true`." } }, - "id": "WaterfallChartColumnStyle" + "id": "BatchUpdateSpreadsheetResponse" }, - "Request": { - "type": "object", - "properties": { - "trimWhitespace": { - "$ref": "TrimWhitespaceRequest", - "description": "Trims cells of whitespace (such as spaces, tabs, or new lines)." - }, - "deleteEmbeddedObject": { - "$ref": "DeleteEmbeddedObjectRequest", - "description": "Deletes an embedded object (e.g, chart, image) in a sheet." - }, - "updateFilterView": { - "description": "Updates the properties of a filter view.", - "$ref": "UpdateFilterViewRequest" - }, - "addBanding": { - "$ref": "AddBandingRequest", - "description": "Adds a new banded range" - }, - "autoResizeDimensions": { - "$ref": "AutoResizeDimensionsRequest", - "description": "Automatically resizes one or more dimensions based on the contents\nof the cells in that dimension." - }, - "appendCells": { - "description": "Appends cells after the last row with data in a sheet.", - "$ref": "AppendCellsRequest" - }, - "cutPaste": { - "$ref": "CutPasteRequest", - "description": "Cuts data from one area and pastes it to another." - }, - "mergeCells": { - "$ref": "MergeCellsRequest", - "description": "Merges cells together." - }, - "updateNamedRange": { - "description": "Updates a named range.", - "$ref": "UpdateNamedRangeRequest" - }, - "updateSheetProperties": { - "$ref": "UpdateSheetPropertiesRequest", - "description": "Updates a sheet's properties." - }, - "deleteDimension": { - "description": "Deletes rows or columns in a sheet.", - "$ref": "DeleteDimensionRequest" - }, - "autoFill": { - "$ref": "AutoFillRequest", - "description": "Automatically fills in more data based on existing data." - }, - "sortRange": { - "$ref": "SortRangeRequest", - "description": "Sorts data in a range." - }, - "addSlicer": { - "$ref": "AddSlicerRequest", - "description": "Adds a slicer." - }, - "deleteProtectedRange": { - "$ref": "DeleteProtectedRangeRequest", - "description": "Deletes a protected range." - }, - "deleteDimensionGroup": { - "$ref": "DeleteDimensionGroupRequest", - "description": "Deletes a group over the specified range." - }, - "duplicateFilterView": { - "description": "Duplicates a filter view.", - "$ref": "DuplicateFilterViewRequest" - }, - "addChart": { - "$ref": "AddChartRequest", - "description": "Adds a chart." - }, - "findReplace": { - "$ref": "FindReplaceRequest", - "description": "Finds and replaces occurrences of some text with other text." - }, - "updateChartSpec": { - "$ref": "UpdateChartSpecRequest", - "description": "Updates a chart's specifications." - }, - "textToColumns": { - "$ref": "TextToColumnsRequest", - "description": "Converts a column of text into many columns of text." - }, - "updateProtectedRange": { - "$ref": "UpdateProtectedRangeRequest", - "description": "Updates a protected range." - }, - "addSheet": { - "$ref": "AddSheetRequest", - "description": "Adds a sheet." - }, - "copyPaste": { - "description": "Copies data from one area and pastes it to another.", - "$ref": "CopyPasteRequest" - }, - "deleteFilterView": { - "$ref": "DeleteFilterViewRequest", - "description": "Deletes a filter view from a sheet." - }, - "insertDimension": { - "description": "Inserts new rows or columns in a sheet.", - "$ref": "InsertDimensionRequest" - }, - "deleteRange": { - "description": "Deletes a range of cells from a sheet, shifting the remaining cells.", - "$ref": "DeleteRangeRequest" - }, - "deleteBanding": { - "description": "Removes a banded range", - "$ref": "DeleteBandingRequest" - }, - "deleteDuplicates": { - "description": "Removes rows containing duplicate values in specified columns of a cell\nrange.", - "$ref": "DeleteDuplicatesRequest" - }, - "addFilterView": { - "$ref": "AddFilterViewRequest", - "description": "Adds a filter view." - }, - "updateBorders": { - "description": "Updates the borders in a range of cells.", - "$ref": "UpdateBordersRequest" - }, - "setDataValidation": { - "$ref": "SetDataValidationRequest", - "description": "Sets data validation for one or more cells." - }, - "deleteConditionalFormatRule": { - "$ref": "DeleteConditionalFormatRuleRequest", - "description": "Deletes an existing conditional format rule." - }, - "clearBasicFilter": { - "description": "Clears the basic filter on a sheet.", - "$ref": "ClearBasicFilterRequest" - }, - "repeatCell": { - "$ref": "RepeatCellRequest", - "description": "Repeats a single cell across a range." - }, - "appendDimension": { - "$ref": "AppendDimensionRequest", - "description": "Appends dimensions to the end of a sheet." - }, - "updateSlicerSpec": { - "$ref": "UpdateSlicerSpecRequest", - "description": "Updates a slicer's specifications." - }, - "createDeveloperMetadata": { - "$ref": "CreateDeveloperMetadataRequest", - "description": "Creates new developer metadata" - }, - "updateConditionalFormatRule": { - "description": "Updates an existing conditional format rule.", - "$ref": "UpdateConditionalFormatRuleRequest" - }, - "insertRange": { - "description": "Inserts new cells in a sheet, shifting the existing cells.", - "$ref": "InsertRangeRequest" - }, - "deleteDeveloperMetadata": { - "$ref": "DeleteDeveloperMetadataRequest", - "description": "Deletes developer metadata" - }, - "moveDimension": { - "$ref": "MoveDimensionRequest", - "description": "Moves rows or columns to another location in a sheet." - }, - "randomizeRange": { - "description": "Randomizes the order of the rows in a range.", - "$ref": "RandomizeRangeRequest" - }, - "updateBanding": { - "description": "Updates a banded range", - "$ref": "UpdateBandingRequest" - }, - "deleteNamedRange": { - "$ref": "DeleteNamedRangeRequest", - "description": "Deletes a named range." - }, - "addProtectedRange": { - "description": "Adds a protected range.", - "$ref": "AddProtectedRangeRequest" - }, - "duplicateSheet": { - "$ref": "DuplicateSheetRequest", - "description": "Duplicates a sheet." + "AddFilterViewRequest": { + "id": "AddFilterViewRequest", + "description": "Adds a filter view.", + "type": "object", + "properties": { + "filter": { + "$ref": "FilterView", + "description": "The filter to add. The filterViewId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a filter that already exists.)" + } + } + }, + "DataFilterValueRange": { + "description": "A range of values whose location is specified by a DataFilter.", + "type": "object", + "properties": { + "majorDimension": { + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The major dimension of the values.", + "type": "string" }, - "unmergeCells": { - "$ref": "UnmergeCellsRequest", - "description": "Unmerges merged cells." + "values": { + "description": "The data to be written. If the provided values exceed any of the ranges\nmatched by the data filter then the request will fail. If the provided\nvalues are less than the matched ranges only the specified values will be\nwritten, existing values in the matched ranges will remain unaffected.", + "type": "array", + "items": { + "type": "array", + "items": { + "type": "any" + } + } }, - "deleteSheet": { - "$ref": "DeleteSheetRequest", - "description": "Deletes a sheet." + "dataFilter": { + "$ref": "DataFilter", + "description": "The data filter describing the location of the values in the spreadsheet." + } + }, + "id": "DataFilterValueRange" + }, + "NumberFormat": { + "description": "The number format of a cell.", + "type": "object", + "properties": { + "type": { + "enum": [ + "NUMBER_FORMAT_TYPE_UNSPECIFIED", + "TEXT", + "NUMBER", + "PERCENT", + "CURRENCY", + "DATE", + "TIME", + "DATE_TIME", + "SCIENTIFIC" + ], + "description": "The type of the number format.\nWhen writing, this field must be set.", + "type": "string", + "enumDescriptions": [ + "The number format is not specified\nand is based on the contents of the cell.\nDo not explicitly use this.", + "Text formatting, e.g `1000.12`", + "Number formatting, e.g, `1,000.12`", + "Percent formatting, e.g `10.12%`", + "Currency formatting, e.g `$1,000.12`", + "Date formatting, e.g `9/26/2008`", + "Time formatting, e.g `3:59:00 PM`", + "Date+Time formatting, e.g `9/26/08 15:59:00`", + "Scientific number formatting, e.g `1.01E+03`" + ] }, - "updateEmbeddedObjectPosition": { - "description": "Updates an embedded object's (e.g. chart, image) position.", - "$ref": "UpdateEmbeddedObjectPositionRequest" + "pattern": { + "type": "string", + "description": "Pattern string used for formatting. If not set, a default pattern based on\nthe user's locale will be used if necessary for the given type.\nSee the [Date and Number Formats guide](/sheets/api/guides/formats) for\nmore information about the supported patterns." + } + }, + "id": "NumberFormat" + }, + "OrgChartSpec": { + "id": "OrgChartSpec", + "description": "An \u003ca href=\"/chart/interactive/docs/gallery/orgchart\"\u003eorg chart\u003c/a\u003e.\nOrg charts require a unique set of labels in labels and may\noptionally include parent_labels and tooltips.\nparent_labels contain, for each node, the label identifying the parent\nnode. tooltips contain, for each node, an optional tooltip.\n\nFor example, to describe an OrgChart with Alice as the CEO, Bob as the\nPresident (reporting to Alice) and Cathy as VP of Sales (also reporting to\nAlice), have labels contain \"Alice\", \"Bob\", \"Cathy\",\nparent_labels contain \"\", \"Alice\", \"Alice\" and tooltips contain\n\"CEO\", \"President\", \"VP Sales\".", + "type": "object", + "properties": { + "selectedNodeColor": { + "$ref": "Color", + "description": "The color of the selected org chart nodes." }, - "addDimensionGroup": { - "$ref": "AddDimensionGroupRequest", - "description": "Creates a group over the specified range." + "parentLabels": { + "description": "The data containing the label of the parent for the corresponding node.\nA blank value indicates that the node has no parent and is a top-level\nnode.\nThis field is optional.", + "$ref": "ChartData" }, - "updateDimensionProperties": { - "description": "Updates dimensions' properties.", - "$ref": "UpdateDimensionPropertiesRequest" + "nodeSize": { + "description": "The size of the org chart nodes.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "The small org chart node size.", + "The medium org chart node size.", + "The large org chart node size." + ], + "enum": [ + "ORG_CHART_LABEL_SIZE_UNSPECIFIED", + "SMALL", + "MEDIUM", + "LARGE" + ] }, - "updateDeveloperMetadata": { - "$ref": "UpdateDeveloperMetadataRequest", - "description": "Updates an existing developer metadata entry" + "labels": { + "description": "The data containing the labels for all the nodes in the chart. Labels\nmust be unique.", + "$ref": "ChartData" }, - "pasteData": { - "$ref": "PasteDataRequest", - "description": "Pastes data (HTML or delimited) into a sheet." + "nodeColor": { + "$ref": "Color", + "description": "The color of the org chart nodes." }, - "updateDimensionGroup": { - "$ref": "UpdateDimensionGroupRequest", - "description": "Updates the state of the specified group." + "tooltips": { + "$ref": "ChartData", + "description": "The data containing the tooltip for the corresponding node. A blank value\nresults in no tooltip being displayed for the node.\nThis field is optional." + } + } + }, + "FilterView": { + "description": "A filter view.", + "type": "object", + "properties": { + "criteria": { + "additionalProperties": { + "$ref": "FilterCriteria" + }, + "description": "The criteria for showing/hiding values per column.\nThe map's key is the column index, and the value is the criteria for\nthat column.", + "type": "object" }, - "setBasicFilter": { - "$ref": "SetBasicFilterRequest", - "description": "Sets the basic filter on a sheet." + "title": { + "description": "The name of the filter view.", + "type": "string" }, - "addConditionalFormatRule": { - "$ref": "AddConditionalFormatRuleRequest", - "description": "Adds a new conditional format rule." + "range": { + "$ref": "GridRange", + "description": "The range this filter view covers.\n\nWhen writing, only one of range or named_range_id\nmay be set." }, - "addNamedRange": { - "$ref": "AddNamedRangeRequest", - "description": "Adds a named range." + "sortSpecs": { + "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications.", + "type": "array", + "items": { + "$ref": "SortSpec" + } }, - "updateCells": { - "$ref": "UpdateCellsRequest", - "description": "Updates many cells at once." + "namedRangeId": { + "description": "The named range this filter view is backed by, if any.\n\nWhen writing, only one of range or named_range_id\nmay be set.", + "type": "string" }, - "updateSpreadsheetProperties": { - "$ref": "UpdateSpreadsheetPropertiesRequest", - "description": "Updates the spreadsheet's properties." + "filterViewId": { + "description": "The ID of the filter view.", + "format": "int32", + "type": "integer" } }, - "id": "Request", - "description": "A single kind of update to apply to a spreadsheet." + "id": "FilterView" }, - "WaterfallChartDomain": { - "description": "The domain of a waterfall chart.", + "Slicer": { + "id": "Slicer", + "description": "A slicer in a sheet.", "type": "object", "properties": { - "reversed": { - "type": "boolean", - "description": "True to reverse the order of the domain values (horizontal axis)." + "position": { + "description": "The position of the slicer. Note that slicer can be positioned only on\nexisting sheet. Also, width and height of slicer can be automatically\nadjusted to keep it within permitted limits.", + "$ref": "EmbeddedObjectPosition" }, - "data": { - "$ref": "ChartData", - "description": "The data of the WaterfallChartDomain." + "spec": { + "$ref": "SlicerSpec", + "description": "The specification of the slicer." + }, + "slicerId": { + "description": "The ID of the slicer.", + "format": "int32", + "type": "integer" + } + } + }, + "SearchDeveloperMetadataRequest": { + "description": "A request to retrieve all developer metadata matching the set of specified\ncriteria.", + "type": "object", + "properties": { + "dataFilters": { + "description": "The data filters describing the criteria used to determine which\nDeveloperMetadata entries to return. DeveloperMetadata matching any of the\nspecified filters will be included in the response.", + "type": "array", + "items": { + "$ref": "DataFilter" + } } }, - "id": "WaterfallChartDomain" + "id": "SearchDeveloperMetadataRequest" }, - "GridRange": { + "BandingProperties": { + "description": "Properties referring a single dimension (either row or column). If both\nBandedRange.row_properties and BandedRange.column_properties are\nset, the fill colors are applied to cells according to the following rules:\n\n* header_color and footer_color take priority over band colors.\n* first_band_color takes priority over second_band_color.\n* row_properties takes priority over column_properties.\n\nFor example, the first row color takes priority over the first column\ncolor, but the first column color takes priority over the second row color.\nSimilarly, the row header takes priority over the column header in the\ntop left cell, but the column header takes priority over the first row\ncolor if the row header is not set.", "type": "object", "properties": { - "sheetId": { - "description": "The sheet this range is on.", - "format": "int32", - "type": "integer" + "firstBandColor": { + "$ref": "Color", + "description": "The first color that is alternating. (Required)" }, - "endRowIndex": { - "type": "integer", - "description": "The end row (exclusive) of the range, or not set if unbounded.", - "format": "int32" + "secondBandColor": { + "description": "The second color that is alternating. (Required)", + "$ref": "Color" }, - "endColumnIndex": { - "description": "The end column (exclusive) of the range, or not set if unbounded.", - "format": "int32", - "type": "integer" + "footerColor": { + "$ref": "Color", + "description": "The color of the last row or column. If this field is not set, the last\nrow or column will be filled with either first_band_color or\nsecond_band_color, depending on the color of the previous row or\ncolumn." }, - "startRowIndex": { - "description": "The start row (inclusive) of the range, or not set if unbounded.", - "format": "int32", - "type": "integer" + "headerColor": { + "$ref": "Color", + "description": "The color of the first row or column. If this field is set, the first\nrow or column will be filled with this color and the colors will\nalternate between first_band_color and second_band_color starting\nfrom the second row or column. Otherwise, the first row or column will be\nfilled with first_band_color and the colors will proceed to alternate\nas they normally would." + } + }, + "id": "BandingProperties" + }, + "BasicFilter": { + "type": "object", + "properties": { + "range": { + "$ref": "GridRange", + "description": "The range the filter covers." }, - "startColumnIndex": { - "type": "integer", - "description": "The start column (inclusive) of the range, or not set if unbounded.", - "format": "int32" + "criteria": { + "additionalProperties": { + "$ref": "FilterCriteria" + }, + "description": "The criteria for showing/hiding values per column.\nThe map's key is the column index, and the value is the criteria for\nthat column.", + "type": "object" + }, + "sortSpecs": { + "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications.", + "type": "array", + "items": { + "$ref": "SortSpec" + } } }, - "id": "GridRange", - "description": "A range on a sheet.\nAll indexes are zero-based.\nIndexes are half open, e.g the start index is inclusive\nand the end index is exclusive -- [start_index, end_index).\nMissing indexes indicate the range is unbounded on that side.\n\nFor example, if `\"Sheet1\"` is sheet ID 0, then:\n\n `Sheet1!A1:A1 == sheet_id: 0,\n start_row_index: 0, end_row_index: 1,\n start_column_index: 0, end_column_index: 1`\n\n `Sheet1!A3:B4 == sheet_id: 0,\n start_row_index: 2, end_row_index: 4,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1!A:B == sheet_id: 0,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1!A5:B == sheet_id: 0,\n start_row_index: 4,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1 == sheet_id:0`\n\nThe start index must always be less than or equal to the end index.\nIf the start index equals the end index, then the range is empty.\nEmpty ranges are typically not meaningful and are usually rendered in the\nUI as `#REF!`." + "id": "BasicFilter", + "description": "The default filter associated with a sheet." }, - "DeleteDimensionGroupRequest": { + "AddProtectedRangeResponse": { + "id": "AddProtectedRangeResponse", + "description": "The result of adding a new protected range.", "type": "object", "properties": { - "range": { - "$ref": "DimensionRange", - "description": "The range of the group to be deleted." + "protectedRange": { + "description": "The newly added protected range.", + "$ref": "ProtectedRange" } - }, - "id": "DeleteDimensionGroupRequest", - "description": "Deletes a group over the specified range by decrementing the depth of the\ndimensions in the range.\n\nFor example, assume the sheet has a depth-1 group over B:E and a depth-2\ngroup over C:D. Deleting a group over D:E leaves the sheet with a\ndepth-1 group over B:D and a depth-2 group over C:C." + } }, - "BubbleChartSpec": { - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/bubblechart\"\u003ebubble chart\u003c/a\u003e.", + "PivotValue": { + "id": "PivotValue", + "description": "The definition of how a value in a pivot table should be calculated.", "type": "object", "properties": { - "bubbleOpacity": { - "description": "The opacity of the bubbles between 0 and 1.0.\n0 is fully transparent and 1 is fully opaque.", - "format": "float", - "type": "number" - }, - "bubbleSizes": { - "description": "The data contianing the bubble sizes. Bubble sizes are used to draw\nthe bubbles at different sizes relative to each other.\nIf specified, group_ids must also be specified. This field is\noptional.", - "$ref": "ChartData" - }, - "domain": { - "$ref": "ChartData", - "description": "The data containing the bubble x-values. These values locate the bubbles\nin the chart horizontally." - }, - "bubbleBorderColor": { - "$ref": "Color", - "description": "The bubble border color." - }, - "bubbleTextStyle": { - "description": "The format of the text inside the bubbles.\nUnderline and Strikethrough are not supported.", - "$ref": "TextFormat" + "name": { + "type": "string", + "description": "A name to use for the value." }, - "groupIds": { - "$ref": "ChartData", - "description": "The data containing the bubble group IDs. All bubbles with the same group\nID are drawn in the same color. If bubble_sizes is specified then\nthis field must also be specified but may contain blank values.\nThis field is optional." + "formula": { + "description": "A custom formula to calculate the value. The formula must start\nwith an `=` character.", + "type": "string" }, - "bubbleLabels": { - "$ref": "ChartData", - "description": "The data containing the bubble labels. These do not need to be unique." + "calculatedDisplayType": { + "enumDescriptions": [ + "Default value, do not use.", + "Shows the pivot values as percentage of the row total values.", + "Shows the pivot values as percentage of the column total values.", + "Shows the pivot values as percentage of the grand total values." + ], + "enum": [ + "PIVOT_VALUE_CALCULATED_DISPLAY_TYPE_UNSPECIFIED", + "PERCENT_OF_ROW_TOTAL", + "PERCENT_OF_COLUMN_TOTAL", + "PERCENT_OF_GRAND_TOTAL" + ], + "description": "If specified, indicates that pivot values should be displayed as\nthe result of a calculation with another pivot value. For example, if\ncalculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the\npivot values are displayed as the percentage of the grand total. In\nthe Sheets UI, this is referred to as \"Show As\" in the value section of a\npivot table.", + "type": "string" }, - "bubbleMinRadiusSize": { - "description": "The minimum radius size of the bubbles, in pixels.\nIf specific, the field must be a positive value.", - "format": "int32", - "type": "integer" + "summarizeFunction": { + "type": "string", + "enumDescriptions": [ + "The default, do not use.", + "Corresponds to the `SUM` function.", + "Corresponds to the `COUNTA` function.", + "Corresponds to the `COUNT` function.", + "Corresponds to the `COUNTUNIQUE` function.", + "Corresponds to the `AVERAGE` function.", + "Corresponds to the `MAX` function.", + "Corresponds to the `MIN` function.", + "Corresponds to the `MEDIAN` function.", + "Corresponds to the `PRODUCT` function.", + "Corresponds to the `STDEV` function.", + "Corresponds to the `STDEVP` function.", + "Corresponds to the `VAR` function.", + "Corresponds to the `VARP` function.", + "Indicates the formula should be used as-is.\nOnly valid if PivotValue.formula was set." + ], + "enum": [ + "PIVOT_STANDARD_VALUE_FUNCTION_UNSPECIFIED", + "SUM", + "COUNTA", + "COUNT", + "COUNTUNIQUE", + "AVERAGE", + "MAX", + "MIN", + "MEDIAN", + "PRODUCT", + "STDEV", + "STDEVP", + "VAR", + "VARP", + "CUSTOM" + ], + "description": "A function to summarize the value.\nIf formula is set, the only supported values are\nSUM and\nCUSTOM.\nIf sourceColumnOffset is set, then `CUSTOM`\nis not supported." }, - "bubbleMaxRadiusSize": { + "sourceColumnOffset": { "type": "integer", - "description": "The max radius size of the bubbles, in pixels.\nIf specified, the field must be a positive value.", + "description": "The column offset of the source range that this value reads from.\n\nFor example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`\nmeans this value refers to column `C`, whereas the offset `1` would\nrefer to column `D`.", "format": "int32" - }, - "series": { - "$ref": "ChartData", - "description": "The data contianing the bubble y-values. These values locate the bubbles\nin the chart vertically." - }, - "legendPosition": { - "description": "Where the legend of the chart should be drawn.", + } + } + }, + "ErrorValue": { + "type": "object", + "properties": { + "type": { + "description": "The type of error.", "type": "string", "enumDescriptions": [ - "Default value, do not use.", - "The legend is rendered on the bottom of the chart.", - "The legend is rendered on the left of the chart.", - "The legend is rendered on the right of the chart.", - "The legend is rendered on the top of the chart.", - "No legend is rendered.", - "The legend is rendered inside the chart area." + "The default error type, do not use this.", + "Corresponds to the `#ERROR!` error.", + "Corresponds to the `#NULL!` error.", + "Corresponds to the `#DIV/0` error.", + "Corresponds to the `#VALUE!` error.", + "Corresponds to the `#REF!` error.", + "Corresponds to the `#NAME?` error.", + "Corresponds to the `#NUM`! error.", + "Corresponds to the `#N/A` error.", + "Corresponds to the `Loading...` state." ], "enum": [ - "BUBBLE_CHART_LEGEND_POSITION_UNSPECIFIED", - "BOTTOM_LEGEND", - "LEFT_LEGEND", - "RIGHT_LEGEND", - "TOP_LEGEND", - "NO_LEGEND", - "INSIDE_LEGEND" + "ERROR_TYPE_UNSPECIFIED", + "ERROR", + "NULL_VALUE", + "DIVIDE_BY_ZERO", + "VALUE", + "REF", + "NAME", + "NUM", + "N_A", + "LOADING" ] + }, + "message": { + "description": "A message with more information about the error\n(in the spreadsheet's locale).", + "type": "string" } }, - "id": "BubbleChartSpec" + "id": "ErrorValue", + "description": "An error in a cell." }, - "SetDataValidationRequest": { - "description": "Sets a data validation rule to every cell in the range.\nTo clear validation in a range, call this with no rule specified.", + "CopySheetToAnotherSpreadsheetRequest": { "type": "object", "properties": { - "range": { - "$ref": "GridRange", - "description": "The range the data validation rule should apply to." - }, - "rule": { - "description": "The data validation rule to set on each cell in the range,\nor empty to clear the data validation in the range.", - "$ref": "DataValidationRule" + "destinationSpreadsheetId": { + "description": "The ID of the spreadsheet to copy the sheet to.", + "type": "string" } }, - "id": "SetDataValidationRequest" + "id": "CopySheetToAnotherSpreadsheetRequest", + "description": "The request to copy a sheet across spreadsheets." }, - "TextPosition": { - "id": "TextPosition", - "description": "Position settings for text.", + "CandlestickChartSpec": { + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/candlestickchart\"\u003ecandlestick\nchart\u003c/a\u003e.", "type": "object", "properties": { - "horizontalAlignment": { - "enum": [ - "HORIZONTAL_ALIGN_UNSPECIFIED", - "LEFT", - "CENTER", - "RIGHT" - ], - "description": "Horizontal alignment setting for the piece of text.", - "type": "string", - "enumDescriptions": [ - "The horizontal alignment is not specified. Do not use this.", - "The text is explicitly aligned to the left of the cell.", - "The text is explicitly aligned to the center of the cell.", - "The text is explicitly aligned to the right of the cell." - ] + "domain": { + "description": "The domain data (horizontal axis) for the candlestick chart. String data\nwill be treated as discrete labels, other data will be treated as\ncontinuous values.", + "$ref": "CandlestickDomain" + }, + "data": { + "type": "array", + "items": { + "$ref": "CandlestickData" + }, + "description": "The Candlestick chart data.\nOnly one CandlestickData is supported." } - } + }, + "id": "CandlestickChartSpec" }, - "BatchUpdateSpreadsheetRequest": { - "description": "The request for updating any aspect of a spreadsheet.", + "BatchClearValuesByDataFilterResponse": { + "id": "BatchClearValuesByDataFilterResponse", + "description": "The response when clearing a range of values selected with\nDataFilters in a spreadsheet.", "type": "object", "properties": { - "includeSpreadsheetInResponse": { - "description": "Determines if the update response should include the spreadsheet\nresource.", - "type": "boolean" - }, - "responseRanges": { + "clearedRanges": { "type": "array", "items": { "type": "string" }, - "description": "Limits the ranges included in the response spreadsheet.\nMeaningful only if include_spreadsheet_response is 'true'." - }, - "responseIncludeGridData": { - "type": "boolean", - "description": "True if grid data should be returned. Meaningful only if\nif include_spreadsheet_in_response is 'true'.\nThis parameter is ignored if a field mask was set in the request." + "description": "The ranges that were cleared, in A1 notation.\n(If the requests were for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual ranges\n that were cleared, bounded to the sheet's limits.)" }, - "requests": { - "description": "A list of updates to apply to the spreadsheet.\nRequests will be applied in the order they are specified.\nIf any request is not valid, no requests will be applied.", - "type": "array", - "items": { - "$ref": "Request" - } + "spreadsheetId": { + "type": "string", + "description": "The spreadsheet the updates were applied to." } - }, - "id": "BatchUpdateSpreadsheetRequest" + } }, - "Padding": { - "description": "The amount of padding around the cell, in pixels.\nWhen updating padding, every field must be specified.", + "TreemapChartColorScale": { "type": "object", "properties": { - "top": { - "description": "The top padding of the cell.", - "format": "int32", - "type": "integer" + "minValueColor": { + "$ref": "Color", + "description": "The background color for cells with a color value less than or equal to\nminValue. Defaults to #dc3912 if not\nspecified." }, - "left": { - "type": "integer", - "description": "The left padding of the cell.", - "format": "int32" + "noDataColor": { + "$ref": "Color", + "description": "The background color for cells that have no color data associated with\nthem. Defaults to #000000 if not specified." }, - "right": { - "type": "integer", - "description": "The right padding of the cell.", - "format": "int32" + "midValueColor": { + "$ref": "Color", + "description": "The background color for cells with a color value at the midpoint between\nminValue and\nmaxValue. Defaults to #efe6dc if not\nspecified." }, - "bottom": { - "description": "The bottom padding of the cell.", + "maxValueColor": { + "$ref": "Color", + "description": "The background color for cells with a color value greater than or equal\nto maxValue. Defaults to #109618 if not\nspecified." + } + }, + "id": "TreemapChartColorScale", + "description": "A color scale for a treemap chart." + }, + "EmbeddedObjectPosition": { + "id": "EmbeddedObjectPosition", + "description": "The position of an embedded object such as a chart.", + "type": "object", + "properties": { + "sheetId": { + "description": "The sheet this is on. Set only if the embedded object\nis on its own sheet. Must be non-negative.", "format": "int32", "type": "integer" + }, + "overlayPosition": { + "$ref": "OverlayPosition", + "description": "The position at which the object is overlaid on top of a grid." + }, + "newSheet": { + "description": "If true, the embedded object is put on a new sheet whose ID\nis chosen for you. Used only when writing.", + "type": "boolean" } - }, - "id": "Padding" + } }, - "BasicChartAxis": { - "description": "An axis of the chart.\nA chart may not have more than one axis per\naxis position.", + "DeveloperMetadataLookup": { + "description": "Selects DeveloperMetadata that matches all of the specified fields. For\nexample, if only a metadata ID is specified this considers the\nDeveloperMetadata with that particular unique ID. If a metadata key is\nspecified, this considers all developer metadata with that key. If a\nkey, visibility, and location type are all specified, this considers all\ndeveloper metadata with that key and visibility that are associated with a\nlocation of that type. In general, this\nselects all DeveloperMetadata that matches the intersection of all the\nspecified fields; any field or combination of fields may be specified.", "type": "object", "properties": { - "position": { + "metadataLocation": { + "$ref": "DeveloperMetadataLocation", + "description": "Limits the selected developer metadata to those entries associated with\nthe specified location. This field either matches exact locations or all\nintersecting locations according the specified\nlocationMatchingStrategy." + }, + "locationMatchingStrategy": { + "type": "string", "enumDescriptions": [ - "Default value, do not use.", - "The axis rendered at the bottom of a chart.\nFor most charts, this is the standard major axis.\nFor bar charts, this is a minor axis.", - "The axis rendered at the left of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is the standard major axis.", - "The axis rendered at the right of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is an unusual major axis." + "Default value. This value must not be used.", + "Indicates that a specified location should be matched exactly. For\nexample, if row three were specified as a location this matching strategy\nwould only match developer metadata also associated on row three. Metadata\nassociated on other locations would not be considered.", + "Indicates that a specified location should match that exact location as\nwell as any intersecting locations. For example, if row three were\nspecified as a location this matching strategy would match developer\nmetadata associated on row three as well as metadata associated on\nlocations that intersect row three. If, for instance, there was developer\nmetadata associated on column B, this matching strategy would also match\nthat location because column B intersects row three." ], "enum": [ - "BASIC_CHART_AXIS_POSITION_UNSPECIFIED", - "BOTTOM_AXIS", - "LEFT_AXIS", - "RIGHT_AXIS" + "DEVELOPER_METADATA_LOCATION_MATCHING_STRATEGY_UNSPECIFIED", + "EXACT_LOCATION", + "INTERSECTING_LOCATION" ], - "description": "The position of this axis.", - "type": "string" + "description": "Determines how this lookup matches the location. If this field is\nspecified as EXACT, only developer metadata associated on the exact\nlocation specified is matched. If this field is specified to INTERSECTING,\ndeveloper metadata associated on intersecting locations is also\nmatched. If left unspecified, this field assumes a default value of\nINTERSECTING.\nIf this field is specified, a metadataLocation\nmust also be specified." }, - "title": { - "description": "The title of this axis. If set, this overrides any title inferred\nfrom headers of the data.", + "locationType": { + "description": "Limits the selected developer metadata to those entries which are\nassociated with locations of the specified type. For example, when this\nfield is specified as ROW this lookup\nonly considers developer metadata associated on rows. If the field is left\nunspecified, all location types are considered. This field cannot be\nspecified as SPREADSHEET when\nthe locationMatchingStrategy\nis specified as INTERSECTING or when the\nmetadataLocation is specified as a\nnon-spreadsheet location: spreadsheet metadata cannot intersect any other\ndeveloper metadata location. This field also must be left unspecified when\nthe locationMatchingStrategy\nis specified as EXACT.", + "type": "string", + "enumDescriptions": [ + "Default value.", + "Developer metadata associated on an entire row dimension.", + "Developer metadata associated on an entire column dimension.", + "Developer metadata associated on an entire sheet.", + "Developer metadata associated on the entire spreadsheet." + ], + "enum": [ + "DEVELOPER_METADATA_LOCATION_TYPE_UNSPECIFIED", + "ROW", + "COLUMN", + "SHEET", + "SPREADSHEET" + ] + }, + "metadataKey": { + "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_key.", "type": "string" }, - "titleTextPosition": { - "$ref": "TextPosition", - "description": "The axis title text position." + "metadataId": { + "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_id.", + "format": "int32", + "type": "integer" }, - "format": { - "$ref": "TextFormat", - "description": "The format of the title.\nOnly valid if the axis is not associated with the domain." + "visibility": { + "type": "string", + "enumDescriptions": [ + "Default value.", + "Document-visible metadata is accessible from any developer project with\naccess to the document.", + "Project-visible metadata is only visible to and accessible by the developer\nproject that created the metadata." + ], + "enum": [ + "DEVELOPER_METADATA_VISIBILITY_UNSPECIFIED", + "DOCUMENT", + "PROJECT" + ], + "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.visibility. If left unspecified, all developer\nmetadata visibile to the requesting project is considered." }, - "viewWindowOptions": { - "description": "The view window options for this axis.", - "$ref": "ChartAxisViewWindowOptions" + "metadataValue": { + "description": "Limits the selected developer metadata to that which has a matching\nDeveloperMetadata.metadata_value.", + "type": "string" } }, - "id": "BasicChartAxis" + "id": "DeveloperMetadataLookup" }, - "DeleteDimensionRequest": { - "description": "Deletes the dimensions from the sheet.", + "AutoFillRequest": { + "id": "AutoFillRequest", + "description": "Fills in more data based on existing data.", "type": "object", "properties": { + "useAlternateSeries": { + "description": "True if we should generate data with the \"alternate\" series.\nThis differs based on the type and amount of source data.", + "type": "boolean" + }, + "sourceAndDestination": { + "$ref": "SourceAndDestination", + "description": "The source and destination areas to autofill.\nThis explicitly lists the source of the autofill and where to\nextend that data." + }, "range": { - "$ref": "DimensionRange", - "description": "The dimensions to delete from the sheet." + "$ref": "GridRange", + "description": "The range to autofill. This will examine the range and detect\nthe location that has data and automatically fill that data\nin to the rest of the range." } - }, - "id": "DeleteDimensionRequest" + } }, - "UpdateChartSpecRequest": { + "GradientRule": { + "id": "GradientRule", + "description": "A rule that applies a gradient color scale format, based on\nthe interpolation points listed. The format of a cell will vary\nbased on its contents as compared to the values of the interpolation\npoints.", "type": "object", "properties": { - "chartId": { - "description": "The ID of the chart to update.", - "format": "int32", - "type": "integer" + "midpoint": { + "$ref": "InterpolationPoint", + "description": "An optional midway interpolation point." }, - "spec": { - "$ref": "ChartSpec", - "description": "The specification to apply to the chart." + "minpoint": { + "description": "The starting interpolation point.", + "$ref": "InterpolationPoint" + }, + "maxpoint": { + "description": "The final interpolation point.", + "$ref": "InterpolationPoint" } - }, - "id": "UpdateChartSpecRequest", - "description": "Updates a chart's specifications.\n(This does not move or resize a chart. To move or resize a chart, use\n UpdateEmbeddedObjectPositionRequest.)" + } }, - "DeleteFilterViewRequest": { + "ClearValuesRequest": { + "id": "ClearValuesRequest", + "description": "The request for clearing a range of values in a spreadsheet.", + "type": "object", + "properties": {} + }, + "SetBasicFilterRequest": { + "id": "SetBasicFilterRequest", + "description": "Sets the basic filter associated with a sheet.", "type": "object", "properties": { - "filterId": { - "description": "The ID of the filter to delete.", - "format": "int32", - "type": "integer" + "filter": { + "$ref": "BasicFilter", + "description": "The filter to set." + } + } + }, + "BatchClearValuesByDataFilterRequest": { + "type": "object", + "properties": { + "dataFilters": { + "description": "The DataFilters used to determine which ranges to clear.", + "type": "array", + "items": { + "$ref": "DataFilter" + } } }, - "id": "DeleteFilterViewRequest", - "description": "Deletes a particular filter view." + "id": "BatchClearValuesByDataFilterRequest", + "description": "The request for clearing more than one range selected by a\nDataFilter in a spreadsheet." }, - "BatchGetValuesByDataFilterRequest": { - "description": "The request for retrieving a range of values in a spreadsheet selected by a\nset of DataFilters.", + "GetSpreadsheetByDataFilterRequest": { "type": "object", "properties": { - "majorDimension": { - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ], - "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen a request that selects that range and sets `majorDimension=ROWS` will\nreturn `[[1,2],[3,4]]`,\nwhereas a request that sets `majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.", - "type": "string" + "includeGridData": { + "description": "True if grid data should be returned.\nThis parameter is ignored if a field mask was set in the request.", + "type": "boolean" }, "dataFilters": { - "description": "The data filters used to match the ranges of values to retrieve. Ranges\nthat match any of the specified data filters will be included in the\nresponse.", + "description": "The DataFilters used to select which ranges to retrieve from\nthe spreadsheet.", "type": "array", "items": { "$ref": "DataFilter" } - }, - "valueRenderOption": { - "enumDescriptions": [ - "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", - "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", - "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." - ], - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ], - "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string" - }, - "dateTimeRenderOption": { - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", - "type": "string", - "enumDescriptions": [ - "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", - "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." - ] } }, - "id": "BatchGetValuesByDataFilterRequest" + "id": "GetSpreadsheetByDataFilterRequest", + "description": "The request for retrieving a Spreadsheet." }, - "BatchUpdateValuesResponse": { - "id": "BatchUpdateValuesResponse", - "description": "The response when updating a range of values in a spreadsheet.", + "DeleteEmbeddedObjectRequest": { "type": "object", "properties": { - "totalUpdatedSheets": { - "description": "The total number of sheets where at least one cell in the sheet was\nupdated.", - "format": "int32", - "type": "integer" - }, - "totalUpdatedCells": { - "description": "The total number of cells updated.", - "format": "int32", - "type": "integer" - }, - "totalUpdatedColumns": { - "description": "The total number of columns where at least one cell in the column was\nupdated.", + "objectId": { + "type": "integer", + "description": "The ID of the embedded object to delete.", + "format": "int32" + } + }, + "id": "DeleteEmbeddedObjectRequest", + "description": "Deletes the embedded object with the given ID." + }, + "UpdateValuesByDataFilterResponse": { + "description": "The response when updating a range of values by a data filter in a\nspreadsheet.", + "type": "object", + "properties": { + "updatedColumns": { + "description": "The number of columns where at least one cell in the column was updated.", "format": "int32", "type": "integer" }, - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", + "updatedRange": { + "description": "The range (in A1 notation) that updates were applied to.", "type": "string" }, - "totalUpdatedRows": { + "updatedCells": { "type": "integer", - "description": "The total number of rows where at least one cell in the row was updated.", + "description": "The number of cells updated.", "format": "int32" }, - "responses": { - "type": "array", - "items": { - "$ref": "UpdateValuesResponse" - }, - "description": "One UpdateValuesResponse per requested range, in the same order as\nthe requests appeared." + "dataFilter": { + "$ref": "DataFilter", + "description": "The data filter that selected the range that was updated." + }, + "updatedData": { + "description": "The values of the cells in the range matched by the dataFilter after all\nupdates were applied. This is only included if the request's\n`includeValuesInResponse` field was `true`.", + "$ref": "ValueRange" + }, + "updatedRows": { + "description": "The number of rows where at least one cell in the row was updated.", + "format": "int32", + "type": "integer" } - } - }, - "KeyValueFormat": { - "description": "Formatting options for key value.", + }, + "id": "UpdateValuesByDataFilterResponse" + }, + "DeleteSheetRequest": { "type": "object", "properties": { - "position": { - "$ref": "TextPosition", - "description": "Specifies the horizontal text positioning of key value.\nThis field is optional. If not specified, default positioning is used." - }, - "textFormat": { - "description": "Text formatting options for key value.", - "$ref": "TextFormat" + "sheetId": { + "type": "integer", + "description": "The ID of the sheet to delete.", + "format": "int32" } }, - "id": "KeyValueFormat" + "id": "DeleteSheetRequest", + "description": "Deletes the requested sheet." }, - "BatchClearValuesRequest": { + "MatchedValueRange": { + "description": "A value range that was matched by one or more data filers.", "type": "object", "properties": { - "ranges": { + "valueRange": { + "$ref": "ValueRange", + "description": "The values matched by the DataFilter." + }, + "dataFilters": { + "description": "The DataFilters from the request that matched the range of\nvalues.", "type": "array", "items": { - "type": "string" - }, - "description": "The ranges to clear, in A1 notation." + "$ref": "DataFilter" + } } }, - "id": "BatchClearValuesRequest", - "description": "The request for clearing more than one range of values in a spreadsheet." + "id": "MatchedValueRange" }, - "DeveloperMetadata": { - "id": "DeveloperMetadata", - "description": "Developer metadata associated with a location or object in a spreadsheet.\nDeveloper metadata may be used to associate arbitrary data with various\nparts of a spreadsheet and will remain associated at those locations as they\nmove around and the spreadsheet is edited. For example, if developer\nmetadata is associated with row 5 and another row is then subsequently\ninserted above row 5, that original metadata will still be associated with\nthe row it was first associated with (what is now row 6). If the associated\nobject is deleted its metadata is deleted too.", + "DeveloperMetadataLocation": { "type": "object", "properties": { - "metadataKey": { - "description": "The metadata key. There may be multiple metadata in a spreadsheet with the\nsame key. Developer metadata must always have a key specified.", - "type": "string" - }, - "metadataId": { - "description": "The spreadsheet-scoped unique ID that identifies the metadata. IDs may be\nspecified when metadata is created, otherwise one will be randomly\ngenerated and assigned. Must be positive.", - "format": "int32", - "type": "integer" - }, - "location": { - "$ref": "DeveloperMetadataLocation", - "description": "The location where the metadata is associated." - }, - "visibility": { - "description": "The metadata visibility. Developer metadata must always have a visibility\nspecified.", + "locationType": { + "description": "The type of location this object represents. This field is read-only.", "type": "string", "enumDescriptions": [ "Default value.", - "Document-visible metadata is accessible from any developer project with\naccess to the document.", - "Project-visible metadata is only visible to and accessible by the developer\nproject that created the metadata." + "Developer metadata associated on an entire row dimension.", + "Developer metadata associated on an entire column dimension.", + "Developer metadata associated on an entire sheet.", + "Developer metadata associated on the entire spreadsheet." ], "enum": [ - "DEVELOPER_METADATA_VISIBILITY_UNSPECIFIED", - "DOCUMENT", - "PROJECT" + "DEVELOPER_METADATA_LOCATION_TYPE_UNSPECIFIED", + "ROW", + "COLUMN", + "SHEET", + "SPREADSHEET" ] }, - "metadataValue": { - "type": "string", - "description": "Data associated with the metadata's key." - } - } - }, - "BaselineValueFormat": { - "type": "object", - "properties": { - "comparisonType": { - "enumDescriptions": [ - "Default value, do not use.", - "Use absolute difference between key and baseline value.", - "Use percentage difference between key and baseline value." - ], - "enum": [ - "COMPARISON_TYPE_UNDEFINED", - "ABSOLUTE_DIFFERENCE", - "PERCENTAGE_DIFFERENCE" - ], - "description": "The comparison type of key value with baseline value.", - "type": "string" - }, - "position": { - "$ref": "TextPosition", - "description": "Specifies the horizontal text positioning of baseline value.\nThis field is optional. If not specified, default positioning is used." - }, - "positiveColor": { - "description": "Color to be used, in case baseline value represents a positive change for\nkey value. This field is optional.", - "$ref": "Color" - }, - "textFormat": { - "$ref": "TextFormat", - "description": "Text formatting options for baseline value." + "dimensionRange": { + "$ref": "DimensionRange", + "description": "Represents the row or column when metadata is associated with\na dimension. The specified DimensionRange must represent a single row\nor column; it cannot be unbounded or span multiple rows or columns." }, - "description": { - "description": "Description which is appended after the baseline value.\nThis field is optional.", - "type": "string" + "spreadsheet": { + "type": "boolean", + "description": "True when metadata is associated with an entire spreadsheet." }, - "negativeColor": { - "$ref": "Color", - "description": "Color to be used, in case baseline value represents a negative change for\nkey value. This field is optional." + "sheetId": { + "description": "The ID of the sheet when metadata is associated with an entire sheet.", + "format": "int32", + "type": "integer" } }, - "id": "BaselineValueFormat", - "description": "Formatting options for baseline value." + "id": "DeveloperMetadataLocation", + "description": "A location where metadata may be associated in a spreadsheet." }, - "DimensionGroup": { + "DuplicateSheetRequest": { "type": "object", "properties": { - "collapsed": { - "description": "This field is true if this group is collapsed. A collapsed group remains\ncollapsed if an overlapping group at a shallower depth is expanded.\n\nA true value does not imply that all dimensions within the group are\nhidden, since a dimension's visibility can change independently from this\ngroup property. However, when this property is updated, all dimensions\nwithin it are set to hidden if this field is true, or set to visible if\nthis field is false.", - "type": "boolean" + "newSheetId": { + "description": "If set, the ID of the new sheet. If not set, an ID is chosen.\nIf set, the ID must not conflict with any existing sheet ID.\nIf set, it must be non-negative.", + "format": "int32", + "type": "integer" }, - "range": { - "description": "The range over which this group exists.", - "$ref": "DimensionRange" + "insertSheetIndex": { + "description": "The zero-based index where the new sheet should be inserted.\nThe index of all sheets after this are incremented.", + "format": "int32", + "type": "integer" }, - "depth": { + "newSheetName": { + "description": "The name of the new sheet. If empty, a new name is chosen for you.", + "type": "string" + }, + "sourceSheetId": { "type": "integer", - "description": "The depth of the group, representing how many groups have a range that\nwholly contains the range of this group.", + "description": "The sheet to duplicate.", "format": "int32" } }, - "id": "DimensionGroup", - "description": "A group over an interval of rows or columns on a sheet, which can contain or\nbe contained within other groups. A group can be collapsed or expanded as a\nunit on the sheet." + "id": "DuplicateSheetRequest", + "description": "Duplicates the contents of a sheet." }, - "ClearBasicFilterRequest": { + "TreemapChartSpec": { + "id": "TreemapChartSpec", + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/treemap\"\u003eTreemap chart\u003c/a\u003e.", "type": "object", "properties": { - "sheetId": { - "description": "The sheet ID on which the basic filter should be cleared.", + "parentLabels": { + "$ref": "ChartData", + "description": "The data the contains the treemap cells' parent labels." + }, + "headerColor": { + "$ref": "Color", + "description": "The background color for header cells." + }, + "labels": { + "$ref": "ChartData", + "description": "The data that contains the treemap cell labels." + }, + "colorData": { + "$ref": "ChartData", + "description": "The data that determines the background color of each treemap data cell.\nThis field is optional. If not specified, size_data is used to\ndetermine background colors. If specified, the data is expected to be\nnumeric. color_scale will determine how the values in this data map to\ndata cell background colors." + }, + "maxValue": { + "description": "The maximum possible data value. Cells with values greater than this will\nhave the same color as cells with this value. If not specified, defaults\nto the actual maximum value from color_data, or the maximum value from\nsize_data if color_data is not specified.", + "format": "double", + "type": "number" + }, + "colorScale": { + "$ref": "TreemapChartColorScale", + "description": "The color scale for data cells in the treemap chart. Data cells are\nassigned colors based on their color values. These color values come from\ncolor_data, or from size_data if color_data is not specified.\nCells with color values less than or equal to min_value will\nhave minValueColor as their\nbackground color. Cells with color values greater than or equal to\nmax_value will have\nmaxValueColor as their background\ncolor. Cells with color values between min_value and max_value will\nhave background colors on a gradient between\nminValueColor and\nmaxValueColor, the midpoint of\nthe gradient being midValueColor.\nCells with missing or non-numeric color values will have\nnoDataColor as their background\ncolor." + }, + "hideTooltips": { + "description": "True to hide tooltips.", + "type": "boolean" + }, + "hintedLevels": { + "description": "The number of additional data levels beyond the labeled levels to be shown\non the treemap chart. These levels are not interactive and are shown\nwithout their labels. Defaults to 0 if not specified.", + "format": "int32", + "type": "integer" + }, + "minValue": { + "description": "The minimum possible data value. Cells with values less than this will\nhave the same color as cells with this value. If not specified, defaults\nto the actual minimum value from color_data, or the minimum value from\nsize_data if color_data is not specified.", + "format": "double", + "type": "number" + }, + "levels": { + "description": "The number of data levels to show on the treemap chart. These levels are\ninteractive and are shown with their labels. Defaults to 2 if not\nspecified.", "format": "int32", "type": "integer" + }, + "sizeData": { + "$ref": "ChartData", + "description": "The data that determines the size of each treemap data cell. This data is\nexpected to be numeric. The cells corresponding to non-numeric or missing\ndata will not be rendered. If color_data is not specified, this data\nis used to determine data cell background colors as well." + }, + "textFormat": { + "$ref": "TextFormat", + "description": "The text format for all labels on the chart." } - }, - "id": "ClearBasicFilterRequest", - "description": "Clears the basic filter, if any exists on the sheet." + } }, - "TextToColumnsRequest": { - "description": "Splits a column of text into multiple columns,\nbased on a delimiter in each cell.", + "ExtendedValue": { + "id": "ExtendedValue", + "description": "The kinds of value that a cell in a spreadsheet can have.", "type": "object", "properties": { - "delimiter": { - "description": "The delimiter to use. Used only if delimiterType is\nCUSTOM.", + "errorValue": { + "$ref": "ErrorValue", + "description": "Represents an error.\nThis field is read-only." + }, + "stringValue": { + "type": "string", + "description": "Represents a string value.\nLeading single quotes are not included. For example, if the user typed\n`'123` into the UI, this would be represented as a `stringValue` of\n`\"123\"`." + }, + "boolValue": { + "type": "boolean", + "description": "Represents a boolean value." + }, + "formulaValue": { + "description": "Represents a formula.", "type": "string" }, - "source": { - "$ref": "GridRange", - "description": "The source data range. This must span exactly one column." + "numberValue": { + "description": "Represents a double value.\nNote: Dates, Times and DateTimes are represented as doubles in\n\"serial number\" format.", + "format": "double", + "type": "number" + } + } + }, + "BatchClearValuesResponse": { + "description": "The response when clearing a range of values in a spreadsheet.", + "type": "object", + "properties": { + "clearedRanges": { + "description": "The ranges that were cleared, in A1 notation.\n(If the requests were for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual ranges\n that were cleared, bounded to the sheet's limits.)", + "type": "array", + "items": { + "type": "string" + } }, - "delimiterType": { - "description": "The delimiter type to use.", - "type": "string", - "enumDescriptions": [ - "Default value. This value must not be used.", - "\",\"", - "\";\"", - "\".\"", - "\" \"", - "A custom value as defined in delimiter.", - "Automatically detect columns." - ], - "enum": [ - "DELIMITER_TYPE_UNSPECIFIED", - "COMMA", - "SEMICOLON", - "PERIOD", - "SPACE", - "CUSTOM", - "AUTODETECT" - ] + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", + "type": "string" } }, - "id": "TextToColumnsRequest" + "id": "BatchClearValuesResponse" }, - "DeleteBandingRequest": { - "id": "DeleteBandingRequest", - "description": "Removes the banded range with the given ID from the spreadsheet.", + "DataFilter": { + "description": "Filter that describes what data should be selected or returned from a\nrequest.", "type": "object", "properties": { - "bandedRangeId": { - "type": "integer", - "description": "The ID of the banded range to delete.", - "format": "int32" + "gridRange": { + "$ref": "GridRange", + "description": "Selects data that matches the range described by the GridRange." + }, + "developerMetadataLookup": { + "$ref": "DeveloperMetadataLookup", + "description": "Selects data associated with the developer metadata matching the criteria\ndescribed by this DeveloperMetadataLookup." + }, + "a1Range": { + "type": "string", + "description": "Selects data that matches the specified A1 range." } - } + }, + "id": "DataFilter" }, - "AppendValuesResponse": { - "description": "The response when updating a range of values in a spreadsheet.", + "TextFormat": { + "description": "The format of a run of text in a cell.\nAbsent values indicate that the field isn't specified.", "type": "object", "properties": { - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", - "type": "string" + "underline": { + "description": "True if the text is underlined.", + "type": "boolean" }, - "updates": { - "description": "Information about the updates that were applied.", - "$ref": "UpdateValuesResponse" + "bold": { + "description": "True if the text is bold.", + "type": "boolean" }, - "tableRange": { + "foregroundColor": { + "$ref": "Color", + "description": "The foreground color of the text." + }, + "fontFamily": { "type": "string", - "description": "The range (in A1 notation) of the table that values are being appended to\n(before the values were appended).\nEmpty if no table was found." + "description": "The font family." + }, + "strikethrough": { + "type": "boolean", + "description": "True if the text has a strikethrough." + }, + "italic": { + "description": "True if the text is italicized.", + "type": "boolean" + }, + "fontSize": { + "description": "The size of the font.", + "format": "int32", + "type": "integer" } }, - "id": "AppendValuesResponse" + "id": "TextFormat" }, - "PivotFilterCriteria": { - "id": "PivotFilterCriteria", - "description": "Criteria for showing/hiding rows in a pivot table.", + "DeleteDuplicatesRequest": { + "id": "DeleteDuplicatesRequest", + "description": "Removes rows within this range that contain values in the specified columns\nthat are duplicates of values in any previous row. Rows with identical values\nbut different letter cases, formatting, or formulas are considered to be\nduplicates.\n\nThis request also removes duplicate rows hidden from view (for example, due\nto a filter). When removing duplicates, the first instance of each duplicate\nrow scanning from the top downwards is kept in the resulting range. Content\noutside of the specified range isn't removed, and rows considered duplicates\ndo not have to be adjacent to each other in the range.", "type": "object", "properties": { - "visibleValues": { - "description": "Values that should be included. Values not listed here are excluded.", + "range": { + "$ref": "GridRange", + "description": "The range to remove duplicates rows from." + }, + "comparisonColumns": { + "description": "The columns in the range to analyze for duplicate values. If no columns are\nselected then all columns are analyzed for duplicates.", "type": "array", "items": { - "type": "string" + "$ref": "DimensionRange" } } } }, - "MoveDimensionRequest": { - "id": "MoveDimensionRequest", - "description": "Moves one or more rows or columns.", + "RepeatCellRequest": { + "description": "Updates all cells in the range to the values in the given Cell object.\nOnly the fields listed in the fields field are updated; others are\nunchanged.\n\nIf writing a cell with a formula, the formula's ranges will automatically\nincrement for each field in the range.\nFor example, if writing a cell with formula `=A1` into range B2:C4,\nB2 would be `=A1`, B3 would be `=A2`, B4 would be `=A3`,\nC2 would be `=B1`, C3 would be `=B2`, C4 would be `=B3`.\n\nTo keep the formula's ranges static, use the `$` indicator.\nFor example, use the formula `=$A$1` to prevent both the row and the\ncolumn from incrementing.", "type": "object", "properties": { - "source": { - "description": "The source dimensions to move.", - "$ref": "DimensionRange" + "cell": { + "$ref": "CellData", + "description": "The data to write." }, - "destinationIndex": { - "type": "integer", - "description": "The zero-based start index of where to move the source data to,\nbased on the coordinates *before* the source data is removed\nfrom the grid. Existing data will be shifted down or right\n(depending on the dimension) to make room for the moved dimensions.\nThe source dimensions are removed from the grid, so the\nthe data may end up in a different index than specified.\n\nFor example, given `A1..A5` of `0, 1, 2, 3, 4` and wanting to move\n`\"1\"` and `\"2\"` to between `\"3\"` and `\"4\"`, the source would be\n`ROWS [1..3)`,and the destination index would be `\"4\"`\n(the zero-based index of row 5).\nThe end result would be `A1..A5` of `0, 3, 1, 2, 4`.", - "format": "int32" + "range": { + "description": "The range to repeat the cell in.", + "$ref": "GridRange" + }, + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root `cell` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" } - } + }, + "id": "RepeatCellRequest" }, - "AddConditionalFormatRuleRequest": { - "id": "AddConditionalFormatRuleRequest", - "description": "Adds a new conditional format rule at the given index.\nAll subsequent rules' indexes are incremented.", + "UpdateSpreadsheetPropertiesRequest": { + "id": "UpdateSpreadsheetPropertiesRequest", + "description": "Updates properties of a spreadsheet.", "type": "object", "properties": { - "index": { - "description": "The zero-based index where the rule should be inserted.", - "format": "int32", - "type": "integer" + "properties": { + "$ref": "SpreadsheetProperties", + "description": "The properties to update." }, - "rule": { - "$ref": "ConditionalFormatRule", - "description": "The rule to add." + "fields": { + "description": "The fields that should be updated. At least one field must be specified.\nThe root 'properties' is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" } } }, - "CreateDeveloperMetadataRequest": { - "description": "A request to create developer metadata.", - "type": "object", - "properties": { - "developerMetadata": { - "$ref": "DeveloperMetadata", - "description": "The developer metadata to create." - } - }, - "id": "CreateDeveloperMetadataRequest" - }, - "ChartSpec": { - "description": "The specifications of a chart.", + "ProtectedRange": { "type": "object", "properties": { - "scorecardChart": { - "$ref": "ScorecardChartSpec", - "description": "A scorecard chart specification." - }, - "pieChart": { - "$ref": "PieChartSpec", - "description": "A pie chart specification." - }, - "titleTextFormat": { - "$ref": "TextFormat", - "description": "The title text format.\nStrikethrough and underline are not supported." + "range": { + "description": "The range that is being protected.\nThe range may be fully unbounded, in which case this is considered\na protected sheet.\n\nWhen writing, only one of range or named_range_id\nmay be set.", + "$ref": "GridRange" }, - "title": { - "description": "The title of the chart.", - "type": "string" + "editors": { + "description": "The users and groups with edit access to the protected range.\nThis field is only visible to users with edit access to the protected\nrange and the document.\nEditors are not supported with warning_only protection.", + "$ref": "Editors" }, - "altText": { - "description": "The alternative text that describes the chart. This is often used\nfor accessibility.", + "description": { + "description": "The description of this protected range.", "type": "string" }, - "titleTextPosition": { - "description": "The title text position.\nThis field is optional.", - "$ref": "TextPosition" + "unprotectedRanges": { + "type": "array", + "items": { + "$ref": "GridRange" + }, + "description": "The list of unprotected ranges within a protected sheet.\nUnprotected ranges are only supported on protected sheets." }, - "histogramChart": { - "$ref": "HistogramChartSpec", - "description": "A histogram chart specification." + "namedRangeId": { + "description": "The named range this protected range is backed by, if any.\n\nWhen writing, only one of range or named_range_id\nmay be set.", + "type": "string" }, - "candlestickChart": { - "description": "A candlestick chart specification.", - "$ref": "CandlestickChartSpec" + "protectedRangeId": { + "description": "The ID of the protected range.\nThis field is read-only.", + "format": "int32", + "type": "integer" }, - "bubbleChart": { - "$ref": "BubbleChartSpec", - "description": "A bubble chart specification." + "warningOnly": { + "description": "True if this protected range will show a warning when editing.\nWarning-based protection means that every user can edit data in the\nprotected range, except editing will prompt a warning asking the user\nto confirm the edit.\n\nWhen writing: if this field is true, then editors is ignored.\nAdditionally, if this field is changed from true to false and the\n`editors` field is not set (nor included in the field mask), then\nthe editors will be set to all the editors in the document.", + "type": "boolean" }, - "waterfallChart": { - "$ref": "WaterfallChartSpec", - "description": "A waterfall chart specification." + "requestingUserCanEdit": { + "description": "True if the user who requested this protected range can edit the\nprotected area.\nThis field is read-only.", + "type": "boolean" + } + }, + "id": "ProtectedRange", + "description": "A protected range." + }, + "DimensionProperties": { + "description": "Properties about a dimension.", + "type": "object", + "properties": { + "developerMetadata": { + "type": "array", + "items": { + "$ref": "DeveloperMetadata" + }, + "description": "The developer metadata associated with a single row or column." }, - "fontName": { - "description": "The name of the font to use by default for all chart text (e.g. title,\naxis labels, legend). If a font is specified for a specific part of the\nchart it will override this font name.", - "type": "string" + "pixelSize": { + "description": "The height (if a row) or width (if a column) of the dimension in pixels.", + "format": "int32", + "type": "integer" }, - "maximized": { - "description": "True to make a chart fill the entire space in which it's rendered with\nminimum padding. False to use the default padding.\n(Not applicable to Geo and Org charts.)", + "hiddenByFilter": { + "description": "True if this dimension is being filtered.\nThis field is read-only.", "type": "boolean" }, - "treemapChart": { - "$ref": "TreemapChartSpec", - "description": "A treemap chart specification." + "hiddenByUser": { + "type": "boolean", + "description": "True if this dimension is explicitly hidden." + } + }, + "id": "DimensionProperties" + }, + "DimensionRange": { + "description": "A range along a single dimension on a sheet.\nAll indexes are zero-based.\nIndexes are half open: the start index is inclusive\nand the end index is exclusive.\nMissing indexes indicate the range is unbounded on that side.", + "type": "object", + "properties": { + "sheetId": { + "type": "integer", + "description": "The sheet this span is on.", + "format": "int32" }, - "hiddenDimensionStrategy": { - "enum": [ - "CHART_HIDDEN_DIMENSION_STRATEGY_UNSPECIFIED", - "SKIP_HIDDEN_ROWS_AND_COLUMNS", - "SKIP_HIDDEN_ROWS", - "SKIP_HIDDEN_COLUMNS", - "SHOW_ALL" - ], - "description": "Determines how the charts will use hidden rows or columns.", + "dimension": { + "description": "The dimension of the span.", "type": "string", "enumDescriptions": [ - "Default value, do not use.", - "Charts will skip hidden rows and columns.", - "Charts will skip hidden rows only.", - "Charts will skip hidden columns only.", - "Charts will not skip any hidden rows or columns." + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" ] }, - "subtitleTextFormat": { - "description": "The subtitle text format.\nStrikethrough and underline are not supported.", - "$ref": "TextFormat" + "startIndex": { + "type": "integer", + "description": "The start (inclusive) of the span, or not set if unbounded.", + "format": "int32" }, - "subtitle": { + "endIndex": { + "description": "The end (exclusive) of the span, or not set if unbounded.", + "format": "int32", + "type": "integer" + } + }, + "id": "DimensionRange" + }, + "NamedRange": { + "description": "A named range.", + "type": "object", + "properties": { + "range": { + "$ref": "GridRange", + "description": "The range this represents." + }, + "name": { + "description": "The name of the named range.", + "type": "string" + }, + "namedRangeId": { "type": "string", - "description": "The subtitle of the chart." + "description": "The ID of the named range." + } + }, + "id": "NamedRange" + }, + "ChartCustomNumberFormatOptions": { + "description": "Custom number formatting options for chart attributes.", + "type": "object", + "properties": { + "prefix": { + "description": "Custom prefix to be prepended to the chart attribute.\nThis field is optional.", + "type": "string" }, - "backgroundColor": { - "$ref": "Color", - "description": "The background color of the entire chart.\nNot applicable to Org charts." + "suffix": { + "description": "Custom suffix to be appended to the chart attribute.\nThis field is optional.", + "type": "string" + } + }, + "id": "ChartCustomNumberFormatOptions" + }, + "Borders": { + "type": "object", + "properties": { + "left": { + "$ref": "Border", + "description": "The left border of the cell." }, - "subtitleTextPosition": { - "$ref": "TextPosition", - "description": "The subtitle text position.\nThis field is optional." + "right": { + "$ref": "Border", + "description": "The right border of the cell." }, - "basicChart": { - "description": "A basic chart specification, can be one of many kinds of charts.\nSee BasicChartType for the list of all\ncharts this supports.", - "$ref": "BasicChartSpec" + "bottom": { + "$ref": "Border", + "description": "The bottom border of the cell." }, - "orgChart": { - "description": "An org chart specification.", - "$ref": "OrgChartSpec" + "top": { + "$ref": "Border", + "description": "The top border of the cell." } }, - "id": "ChartSpec" + "id": "Borders", + "description": "The borders of the cell." }, - "BatchGetValuesByDataFilterResponse": { - "description": "The response when retrieving more than one range of values in a spreadsheet\nselected by DataFilters.", + "ManualRule": { "type": "object", "properties": { - "valueRanges": { - "description": "The requested values with the list of data filters that matched them.", + "groups": { + "description": "The list of group names and the corresponding items from the source data\nthat map to each group name.", "type": "array", "items": { - "$ref": "MatchedValueRange" + "$ref": "ManualRuleGroup" } - }, - "spreadsheetId": { - "description": "The ID of the spreadsheet the data was retrieved from.", - "type": "string" } }, - "id": "BatchGetValuesByDataFilterResponse" + "id": "ManualRule", + "description": "Allows you to manually organize the values in a source data column into\nbuckets with names of your choosing. For example, a pivot table that\naggregates population by state:\n\n +-------+-------------------+\n | State | SUM of Population |\n +-------+-------------------+\n | AK | 0.7 |\n | AL | 4.8 |\n | AR | 2.9 |\n ...\n +-------+-------------------+\ncould be turned into a pivot table that aggregates population by time zone\nby providing a list of groups (for example, groupName = 'Central',\nitems = ['AL', 'AR', 'IA', ...]) to a manual group rule.\nNote that a similar effect could be achieved by adding a time zone column\nto the source data and adjusting the pivot table.\n\n +-----------+-------------------+\n | Time Zone | SUM of Population |\n +-----------+-------------------+\n | Central | 106.3 |\n | Eastern | 151.9 |\n | Mountain | 17.4 |\n ...\n +-----------+-------------------+" }, - "LineStyle": { - "description": "Properties that describe the style of a line.", + "DeleteConditionalFormatRuleRequest": { "type": "object", "properties": { - "type": { - "enumDescriptions": [ - "Default value, do not use.", - "No dash type, which is equivalent to a non-visible line.", - "A custom dash for a line. Modifying the exact custom dash style is\ncurrently unsupported.", - "A solid line.", - "A dotted line.", - "A dashed line where the dashes have \"medium\" length.", - "A line that alternates between a \"medium\" dash and a dot.", - "A dashed line where the dashes have \"long\" length.", - "A line that alternates between a \"long\" dash and a dot." - ], - "enum": [ - "LINE_DASH_TYPE_UNSPECIFIED", - "INVISIBLE", - "CUSTOM", - "SOLID", - "DOTTED", - "MEDIUM_DASHED", - "MEDIUM_DASHED_DOTTED", - "LONG_DASHED", - "LONG_DASHED_DOTTED" - ], - "description": "The dash type of the line.", - "type": "string" + "index": { + "description": "The zero-based index of the rule to be deleted.", + "format": "int32", + "type": "integer" }, - "width": { - "type": "integer", - "description": "The thickness of the line, in px.", - "format": "int32" + "sheetId": { + "description": "The sheet the rule is being deleted from.", + "format": "int32", + "type": "integer" } }, - "id": "LineStyle" + "id": "DeleteConditionalFormatRuleRequest", + "description": "Deletes a conditional format rule at the given index.\nAll subsequent rules' indexes are decremented." }, - "CandlestickDomain": { - "id": "CandlestickDomain", - "description": "The domain of a CandlestickChart.", + "DeleteNamedRangeRequest": { "type": "object", "properties": { - "reversed": { - "type": "boolean", - "description": "True to reverse the order of the domain values (horizontal axis)." + "namedRangeId": { + "type": "string", + "description": "The ID of the named range to delete." + } + }, + "id": "DeleteNamedRangeRequest", + "description": "Removes the named range with the given ID from the spreadsheet." + }, + "AddBandingResponse": { + "description": "The result of adding a banded range.", + "type": "object", + "properties": { + "bandedRange": { + "description": "The banded range that was added.", + "$ref": "BandedRange" + } + }, + "id": "AddBandingResponse" + }, + "AddDimensionGroupResponse": { + "description": "The result of adding a group.", + "type": "object", + "properties": { + "dimensionGroups": { + "description": "All groups of a dimension after adding a group to that dimension.", + "type": "array", + "items": { + "$ref": "DimensionGroup" + } + } + }, + "id": "AddDimensionGroupResponse" + }, + "ManualRuleGroup": { + "description": "A group name and a list of items from the source data that should be placed\nin the group with this name.", + "type": "object", + "properties": { + "groupName": { + "description": "The group name, which must be a string. Each group in a given\nManualRule must have a unique group name.", + "$ref": "ExtendedValue" }, - "data": { - "$ref": "ChartData", - "description": "The data of the CandlestickDomain." + "items": { + "description": "The items in the source data that should be placed into this group. Each\nitem may be a string, number, or boolean. Items may appear in at most one\ngroup within a given ManualRule. Items that do not appear in any\ngroup will appear on their own.", + "type": "array", + "items": { + "$ref": "ExtendedValue" + } } - } + }, + "id": "ManualRuleGroup" }, - "SheetProperties": { - "id": "SheetProperties", - "description": "Properties of a sheet.", + "PivotGroup": { + "id": "PivotGroup", + "description": "A single grouping (either row or column) in a pivot table.", "type": "object", "properties": { - "title": { - "description": "The name of the sheet.", + "label": { + "description": "The labels to use for the row/column groups which can be customized. For\nexample, in the following pivot table, the row label is `Region` (which\ncould be renamed to `State`) and the column label is `Product` (which\ncould be renamed `Item`). Pivot tables created before December 2017 do\nnot have header labels. If you'd like to add header labels to an existing\npivot table, please delete the existing pivot table and then create a new\npivot table with same parameters.\n\n +--------------+---------+-------+\n | SUM of Units | Product | |\n | Region | Pen | Paper |\n +--------------+---------+-------+\n | New York | 345 | 98 |\n | Oregon | 234 | 123 |\n | Tennessee | 531 | 415 |\n +--------------+---------+-------+\n | Grand Total | 1110 | 636 |\n +--------------+---------+-------+", "type": "string" }, - "index": { - "description": "The index of the sheet within the spreadsheet.\nWhen adding or updating sheet properties, if this field\nis excluded then the sheet is added or moved to the end\nof the sheet list. When updating sheet indices or inserting\nsheets, movement is considered in \"before the move\" indexes.\nFor example, if there were 3 sheets (S1, S2, S3) in order to\nmove S1 ahead of S2 the index would have to be set to 2. A sheet\nindex update request is ignored if the requested index is\nidentical to the sheets current index or if the requested new\nindex is equal to the current sheet index + 1.", + "repeatHeadings": { + "type": "boolean", + "description": "True if the headings in this pivot group should be repeated.\nThis is only valid for row groupings and is ignored by columns.\n\nBy default, we minimize repitition of headings by not showing higher\nlevel headings where they are the same. For example, even though the\nthird row below corresponds to \"Q1 Mar\", \"Q1\" is not shown because\nit is redundant with previous rows. Setting repeat_headings to true\nwould cause \"Q1\" to be repeated for \"Feb\" and \"Mar\".\n\n +--------------+\n | Q1 | Jan |\n | | Feb |\n | | Mar |\n +--------+-----+\n | Q1 Total |\n +--------------+" + }, + "sourceColumnOffset": { + "description": "The column offset of the source range that this grouping is based on.\n\nFor example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`\nmeans this group refers to column `C`, whereas the offset `1` would refer\nto column `D`.", "format": "int32", "type": "integer" }, - "tabColor": { - "$ref": "Color", - "description": "The color of the tab in the UI." + "sortOrder": { + "type": "string", + "enumDescriptions": [ + "Default value, do not use this.", + "Sort ascending.", + "Sort descending." + ], + "enum": [ + "SORT_ORDER_UNSPECIFIED", + "ASCENDING", + "DESCENDING" + ], + "description": "The order the values in this group should be sorted." }, - "sheetId": { - "description": "The ID of the sheet. Must be non-negative.\nThis field cannot be changed once set.", - "format": "int32", - "type": "integer" + "valueBucket": { + "description": "The bucket of the opposite pivot group to sort by.\nIf not specified, sorting is alphabetical by this group's values.", + "$ref": "PivotGroupSortValueBucket" }, - "rightToLeft": { - "description": "True if the sheet is an RTL sheet instead of an LTR sheet.", + "showTotals": { + "description": "True if the pivot table should include the totals for this grouping.", "type": "boolean" }, - "hidden": { - "description": "True if the sheet is hidden in the UI, false if it's visible.", - "type": "boolean" + "valueMetadata": { + "type": "array", + "items": { + "$ref": "PivotGroupValueMetadata" + }, + "description": "Metadata about values in the grouping." }, - "sheetType": { - "description": "The type of sheet. Defaults to GRID.\nThis field cannot be changed once set.", + "groupRule": { + "$ref": "PivotGroupRule", + "description": "The group rule to apply to this row/column group." + } + } + }, + "TrimWhitespaceResponse": { + "description": "The result of trimming whitespace in cells.", + "type": "object", + "properties": { + "cellsChangedCount": { + "type": "integer", + "description": "The number of cells that were trimmed of whitespace.", + "format": "int32" + } + }, + "id": "TrimWhitespaceResponse" + }, + "PivotTable": { + "description": "A pivot table.", + "type": "object", + "properties": { + "criteria": { + "additionalProperties": { + "$ref": "PivotFilterCriteria" + }, + "description": "An optional mapping of filters per source column offset.\n\nThe filters are applied before aggregating data into the pivot table.\nThe map's key is the column offset of the source range that you want to\nfilter, and the value is the criteria for that column.\n\nFor example, if the source was `C10:E15`, a key of `0` will have the filter\nfor column `C`, whereas the key `1` is for column `D`.", + "type": "object" + }, + "rows": { + "description": "Each row grouping in the pivot table.", + "type": "array", + "items": { + "$ref": "PivotGroup" + } + }, + "valueLayout": { + "description": "Whether values should be listed horizontally (as columns)\nor vertically (as rows).", "type": "string", "enumDescriptions": [ - "Default value, do not use.", - "The sheet is a grid.", - "The sheet has no grid and instead has an object like a chart or image." + "Values are laid out horizontally (as columns).", + "Values are laid out vertically (as rows)." ], "enum": [ - "SHEET_TYPE_UNSPECIFIED", - "GRID", - "OBJECT" + "HORIZONTAL", + "VERTICAL" ] }, - "gridProperties": { - "$ref": "GridProperties", - "description": "Additional properties of the sheet if this sheet is a grid.\n(If the sheet is an object sheet, containing a chart or image, then\nthis field will be absent.)\nWhen writing it is an error to set any grid properties on non-grid sheets." + "source": { + "description": "The range the pivot table is reading data from.", + "$ref": "GridRange" + }, + "columns": { + "description": "Each column grouping in the pivot table.", + "type": "array", + "items": { + "$ref": "PivotGroup" + } + }, + "values": { + "type": "array", + "items": { + "$ref": "PivotValue" + }, + "description": "A list of values to include in the pivot table." + } + }, + "id": "PivotTable" + }, + "SearchDeveloperMetadataResponse": { + "id": "SearchDeveloperMetadataResponse", + "description": "A reply to a developer metadata search request.", + "type": "object", + "properties": { + "matchedDeveloperMetadata": { + "description": "The metadata matching the criteria of the search request.", + "type": "array", + "items": { + "$ref": "MatchedDeveloperMetadata" + } } } }, - "UpdateDimensionPropertiesRequest": { - "description": "Updates properties of dimensions within the specified range.", + "AppendCellsRequest": { + "description": "Adds new cells after the last row with data in a sheet,\ninserting new rows into the sheet if necessary.", "type": "object", "properties": { - "range": { - "description": "The rows or columns to update.", - "$ref": "DimensionRange" + "sheetId": { + "description": "The sheet ID to append the data to.", + "format": "int32", + "type": "integer" + }, + "rows": { + "description": "The data to append.", + "type": "array", + "items": { + "$ref": "RowData" + } }, "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `properties` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "description": "The fields of CellData that should be updated.\nAt least one field must be specified.\nThe root is the CellData; 'row.values.' should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", "format": "google-fieldmask", "type": "string" - }, - "properties": { - "description": "Properties to update.", - "$ref": "DimensionProperties" } }, - "id": "UpdateDimensionPropertiesRequest" + "id": "AppendCellsRequest" }, - "SourceAndDestination": { - "id": "SourceAndDestination", - "description": "A combination of a source range and how to extend that source.", + "TextFormatRun": { + "description": "A run of a text format. The format of this run continues until the start\nindex of the next run.\nWhen updating, all fields must be set.", "type": "object", "properties": { - "fillLength": { - "description": "The number of rows or columns that data should be filled into.\nPositive numbers expand beyond the last row or last column\nof the source. Negative numbers expand before the first row\nor first column of the source.", + "startIndex": { + "description": "The character index where this run starts.", "format": "int32", "type": "integer" }, - "source": { - "$ref": "GridRange", - "description": "The location of the data to use as the source of the autofill." - }, - "dimension": { - "description": "The dimension that data should be filled into.", - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], - "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" - ] + "format": { + "description": "The format of this run. Absent values inherit the cell's format.", + "$ref": "TextFormat" } - } + }, + "id": "TextFormatRun" }, - "SlicerSpec": { - "id": "SlicerSpec", - "description": "The specifications of a slicer.", + "BatchUpdateValuesByDataFilterResponse": { "type": "object", "properties": { - "backgroundColor": { - "$ref": "Color", - "description": "The background color of the slicer." - }, - "filterCriteria": { - "$ref": "FilterCriteria", - "description": "The filtering criteria of the slicer." + "spreadsheetId": { + "description": "The spreadsheet the updates were applied to.", + "type": "string" }, - "dataRange": { - "$ref": "GridRange", - "description": "The data range of the slicer." + "totalUpdatedRows": { + "description": "The total number of rows where at least one cell in the row was updated.", + "format": "int32", + "type": "integer" }, - "applyToPivotTables": { - "description": "True if the filter should apply to pivot tables.\nIf not set, default to `True`.", - "type": "boolean" + "responses": { + "type": "array", + "items": { + "$ref": "UpdateValuesByDataFilterResponse" + }, + "description": "The response for each range updated." }, - "columnIndex": { - "description": "The column index in the data table on which the filter is applied to.", + "totalUpdatedSheets": { + "description": "The total number of sheets where at least one cell in the sheet was\nupdated.", "format": "int32", "type": "integer" }, - "title": { - "type": "string", - "description": "The title of the slicer." - }, - "horizontalAlignment": { - "description": "The horizontal alignment of title in the slicer.\nIf unspecified, defaults to `LEFT`", - "type": "string", - "enumDescriptions": [ - "The horizontal alignment is not specified. Do not use this.", - "The text is explicitly aligned to the left of the cell.", - "The text is explicitly aligned to the center of the cell.", - "The text is explicitly aligned to the right of the cell." - ], - "enum": [ - "HORIZONTAL_ALIGN_UNSPECIFIED", - "LEFT", - "CENTER", - "RIGHT" - ] + "totalUpdatedCells": { + "type": "integer", + "description": "The total number of cells updated.", + "format": "int32" }, - "textFormat": { - "$ref": "TextFormat", - "description": "The text format of title in the slicer." + "totalUpdatedColumns": { + "description": "The total number of columns where at least one cell in the column was\nupdated.", + "format": "int32", + "type": "integer" } - } + }, + "id": "BatchUpdateValuesByDataFilterResponse", + "description": "The response when updating a range of values in a spreadsheet." }, - "CandlestickSeries": { - "description": "The series of a CandlestickData.", + "RowData": { "type": "object", "properties": { - "data": { - "$ref": "ChartData", - "description": "The data of the CandlestickSeries." + "values": { + "type": "array", + "items": { + "$ref": "CellData" + }, + "description": "The values in the row, one per column." } }, - "id": "CandlestickSeries" + "id": "RowData", + "description": "Data about each cell in a row." }, - "HistogramChartSpec": { + "Border": { "type": "object", "properties": { - "series": { - "type": "array", - "items": { - "$ref": "HistogramSeries" - }, - "description": "The series for a histogram may be either a single series of values to be\nbucketed or multiple series, each of the same length, containing the name\nof the series followed by the values to be bucketed for that series." - }, - "legendPosition": { + "style": { + "type": "string", "enumDescriptions": [ - "Default value, do not use.", - "The legend is rendered on the bottom of the chart.", - "The legend is rendered on the left of the chart.", - "The legend is rendered on the right of the chart.", - "The legend is rendered on the top of the chart.", - "No legend is rendered.", - "The legend is rendered inside the chart area." + "The style is not specified. Do not use this.", + "The border is dotted.", + "The border is dashed.", + "The border is a thin solid line.", + "The border is a medium solid line.", + "The border is a thick solid line.", + "No border.\nUsed only when updating a border in order to erase it.", + "The border is two solid lines." ], "enum": [ - "HISTOGRAM_CHART_LEGEND_POSITION_UNSPECIFIED", - "BOTTOM_LEGEND", - "LEFT_LEGEND", - "RIGHT_LEGEND", - "TOP_LEGEND", - "NO_LEGEND", - "INSIDE_LEGEND" + "STYLE_UNSPECIFIED", + "DOTTED", + "DASHED", + "SOLID", + "SOLID_MEDIUM", + "SOLID_THICK", + "NONE", + "DOUBLE" ], - "description": "The position of the chart legend.", - "type": "string" - }, - "bucketSize": { - "type": "number", - "description": "By default the bucket size (the range of values stacked in a single\ncolumn) is chosen automatically, but it may be overridden here.\nE.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc.\nCannot be negative.\nThis field is optional.", - "format": "double" + "description": "The style of the border." }, - "outlierPercentile": { - "description": "The outlier percentile is used to ensure that outliers do not adversely\naffect the calculation of bucket sizes. For example, setting an outlier\npercentile of 0.05 indicates that the top and bottom 5% of values when\ncalculating buckets. The values are still included in the chart, they will\nbe added to the first or last buckets instead of their own buckets.\nMust be between 0.0 and 0.5.", - "format": "double", - "type": "number" + "color": { + "$ref": "Color", + "description": "The color of the border." }, - "showItemDividers": { - "description": "Whether horizontal divider lines should be displayed between items in each\ncolumn.", - "type": "boolean" + "width": { + "description": "The width of the border, in pixels.\nDeprecated; the width is determined by the \"style\" field.", + "format": "int32", + "type": "integer" } }, - "id": "HistogramChartSpec", - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/histogram\"\u003ehistogram chart\u003c/a\u003e.\nA histogram chart groups data items into bins, displaying each bin as a\ncolumn of stacked items. Histograms are used to display the distribution\nof a dataset. Each column of items represents a range into which those\nitems fall. The number of bins can be chosen automatically or specified\nexplicitly." + "id": "Border", + "description": "A border along a cell." }, - "UpdateValuesResponse": { + "GridData": { "type": "object", "properties": { - "updatedColumns": { - "description": "The number of columns where at least one cell in the column was updated.", + "rowData": { + "type": "array", + "items": { + "$ref": "RowData" + }, + "description": "The data in the grid, one entry per row,\nstarting with the row in startRow.\nThe values in RowData will correspond to columns starting\nat start_column." + }, + "startRow": { + "description": "The first row this GridData refers to, zero-based.", + "format": "int32", + "type": "integer" + }, + "columnMetadata": { + "description": "Metadata about the requested columns in the grid, starting with the column\nin start_column.", + "type": "array", + "items": { + "$ref": "DimensionProperties" + } + }, + "startColumn": { + "description": "The first column this GridData refers to, zero-based.", "format": "int32", "type": "integer" }, - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", - "type": "string" + "rowMetadata": { + "description": "Metadata about the requested rows in the grid, starting with the row\nin start_row.", + "type": "array", + "items": { + "$ref": "DimensionProperties" + } + } + }, + "id": "GridData", + "description": "Data in the grid, as well as metadata about the dimensions." + }, + "UpdateNamedRangeRequest": { + "description": "Updates properties of the named range with the specified\nnamedRangeId.", + "type": "object", + "properties": { + "namedRange": { + "$ref": "NamedRange", + "description": "The named range to update with the new properties." + }, + "fields": { + "type": "string", + "description": "The fields that should be updated. At least one field must be specified.\nThe root `namedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask" + } + }, + "id": "UpdateNamedRangeRequest" + }, + "FindReplaceRequest": { + "description": "Finds and replaces data in cells over a range, sheet, or all sheets.", + "type": "object", + "properties": { + "includeFormulas": { + "description": "True if the search should include cells with formulas.\nFalse to skip cells with formulas.", + "type": "boolean" + }, + "matchEntireCell": { + "description": "True if the find value should match the entire cell.", + "type": "boolean" }, - "updatedRange": { - "description": "The range (in A1 notation) that updates were applied to.", + "find": { + "description": "The value to search.", "type": "string" }, - "updatedCells": { - "description": "The number of cells updated.", - "format": "int32", - "type": "integer" + "searchByRegex": { + "description": "True if the find value is a regex.\nThe regular expression and replacement should follow Java regex rules\nat https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html.\nThe replacement string is allowed to refer to capturing groups.\nFor example, if one cell has the contents `\"Google Sheets\"` and another\nhas `\"Google Docs\"`, then searching for `\"o.* (.*)\"` with a replacement of\n`\"$1 Rocks\"` would change the contents of the cells to\n`\"GSheets Rocks\"` and `\"GDocs Rocks\"` respectively.", + "type": "boolean" }, - "updatedData": { - "$ref": "ValueRange", - "description": "The values of the cells after updates were applied.\nThis is only included if the request's `includeValuesInResponse` field\nwas `true`." + "replacement": { + "type": "string", + "description": "The value to use as the replacement." }, - "updatedRows": { - "description": "The number of rows where at least one cell in the row was updated.", + "range": { + "description": "The range to find/replace over.", + "$ref": "GridRange" + }, + "sheetId": { + "description": "The sheet to find/replace over.", "format": "int32", "type": "integer" - } - }, - "id": "UpdateValuesResponse", - "description": "The response when updating a range of values in a spreadsheet." - }, - "PivotGroupSortValueBucket": { - "type": "object", - "properties": { - "buckets": { - "description": "Determines the bucket from which values are chosen to sort.\n\nFor example, in a pivot table with one row group & two column groups,\nthe row group can list up to two values. The first value corresponds\nto a value within the first column group, and the second value\ncorresponds to a value in the second column group. If no values\nare listed, this would indicate that the row should be sorted according\nto the \"Grand Total\" over the column groups. If a single value is listed,\nthis would correspond to using the \"Total\" of that bucket.", - "type": "array", - "items": { - "$ref": "ExtendedValue" - } }, - "valuesIndex": { - "type": "integer", - "description": "The offset in the PivotTable.values list which the values in this\ngrouping should be sorted by.", - "format": "int32" + "matchCase": { + "description": "True if the search is case sensitive.", + "type": "boolean" + }, + "allSheets": { + "type": "boolean", + "description": "True to find/replace over all sheets." } }, - "id": "PivotGroupSortValueBucket", - "description": "Information about which values in a pivot group should be used for sorting." + "id": "FindReplaceRequest" }, - "WaterfallChartSeries": { - "description": "A single series of data for a waterfall chart.", + "UpdateCellsRequest": { + "description": "Updates all cells in a range with new data.", "type": "object", "properties": { - "customSubtotals": { - "description": "Custom subtotal columns appearing in this series. The order in which\nsubtotals are defined is not significant. Only one subtotal may be\ndefined for each data point.", + "range": { + "$ref": "GridRange", + "description": "The range to write data to.\n\nIf the data in rows does not cover the entire requested range,\nthe fields matching those set in fields will be cleared." + }, + "rows": { "type": "array", "items": { - "$ref": "WaterfallChartCustomSubtotal" - } - }, - "subtotalColumnsStyle": { - "$ref": "WaterfallChartColumnStyle", - "description": "Styles for all subtotal columns in this series." - }, - "positiveColumnsStyle": { - "$ref": "WaterfallChartColumnStyle", - "description": "Styles for all columns in this series with positive values." - }, - "data": { - "$ref": "ChartData", - "description": "The data being visualized in this series." + "$ref": "RowData" + }, + "description": "The data to write." }, - "negativeColumnsStyle": { - "$ref": "WaterfallChartColumnStyle", - "description": "Styles for all columns in this series with negative values." + "fields": { + "description": "The fields of CellData that should be updated.\nAt least one field must be specified.\nThe root is the CellData; 'row.values.' should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" }, - "hideTrailingSubtotal": { - "description": "True to hide the subtotal column from the end of the series. By default,\na subtotal column will appear at the end of each series. Setting this\nfield to true will hide that subtotal column for this series.", - "type": "boolean" + "start": { + "$ref": "GridCoordinate", + "description": "The coordinate to start writing data at.\nAny number of rows and columns (including a different number of\ncolumns per row) may be written." } }, - "id": "WaterfallChartSeries" + "id": "UpdateCellsRequest" }, - "DeleteDeveloperMetadataRequest": { + "RandomizeRangeRequest": { "type": "object", "properties": { - "dataFilter": { - "description": "The data filter describing the criteria used to select which developer\nmetadata entry to delete.", - "$ref": "DataFilter" + "range": { + "$ref": "GridRange", + "description": "The range to randomize." } }, - "id": "DeleteDeveloperMetadataRequest", - "description": "A request to delete developer metadata." + "id": "RandomizeRangeRequest", + "description": "Randomizes the order of the rows in a range." }, - "CandlestickData": { + "DeleteRangeRequest": { + "description": "Deletes a range of cells, shifting other cells into the deleted area.", "type": "object", "properties": { - "highSeries": { - "$ref": "CandlestickSeries", - "description": "The range data (vertical axis) for the high/maximum value for each\ncandle. This is the top of the candle's center line." - }, - "lowSeries": { - "$ref": "CandlestickSeries", - "description": "The range data (vertical axis) for the low/minimum value for each candle.\nThis is the bottom of the candle's center line." - }, - "closeSeries": { - "$ref": "CandlestickSeries", - "description": "The range data (vertical axis) for the close/final value for each candle.\nThis is the top of the candle body. If greater than the open value the\ncandle will be filled. Otherwise the candle will be hollow." + "shiftDimension": { + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The dimension from which deleted cells will be replaced with.\nIf ROWS, existing cells will be shifted upward to\nreplace the deleted cells. If COLUMNS, existing cells\nwill be shifted left to replace the deleted cells." }, - "openSeries": { - "$ref": "CandlestickSeries", - "description": "The range data (vertical axis) for the open/initial value for each\ncandle. This is the bottom of the candle body. If less than the close\nvalue the candle will be filled. Otherwise the candle will be hollow." + "range": { + "$ref": "GridRange", + "description": "The range of cells to delete." } }, - "id": "CandlestickData", - "description": "The Candlestick chart data, each containing the low, open, close, and high\nvalues for a series." + "id": "DeleteRangeRequest" }, - "DeleteProtectedRangeRequest": { + "DeleteDuplicatesResponse": { "type": "object", "properties": { - "protectedRangeId": { - "description": "The ID of the protected range to delete.", + "duplicatesRemovedCount": { + "description": "The number of duplicate rows removed.", "format": "int32", "type": "integer" } }, - "id": "DeleteProtectedRangeRequest", - "description": "Deletes the protected range with the given ID." + "id": "DeleteDuplicatesResponse", + "description": "The result of removing duplicates in a range." }, - "InterpolationPoint": { - "description": "A single interpolation point on a gradient conditional format.\nThese pin the gradient color scale according to the color,\ntype and value chosen.", + "UnmergeCellsRequest": { "type": "object", "properties": { - "value": { - "type": "string", - "description": "The value this interpolation point uses. May be a formula.\nUnused if type is MIN or\nMAX." + "range": { + "$ref": "GridRange", + "description": "The range within which all cells should be unmerged.\nIf the range spans multiple merges, all will be unmerged.\nThe range must not partially span any merge." + } + }, + "id": "UnmergeCellsRequest", + "description": "Unmerges cells in the given range." + }, + "SortSpec": { + "description": "A sort order associated with a specific column or row.", + "type": "object", + "properties": { + "dimensionIndex": { + "description": "The dimension the sort should be applied to.", + "format": "int32", + "type": "integer" }, - "color": { + "backgroundColor": { "$ref": "Color", - "description": "The color this interpolation point should use." + "description": "The background fill color to sort by. Mutually exclusive with sorting by\ntext color. Requests to set this field will fail with a 400 error if\nforeground color is also set." }, - "type": { - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "The interpolation point uses the minimum value in the\ncells over the range of the conditional format.", - "The interpolation point uses the maximum value in the\ncells over the range of the conditional format.", - "The interpolation point uses exactly the value in\nInterpolationPoint.value.", - "The interpolation point is the given percentage over\nall the cells in the range of the conditional format.\nThis is equivalent to NUMBER if the value was:\n`=(MAX(FLATTEN(range)) * (value / 100))\n + (MIN(FLATTEN(range)) * (1 - (value / 100)))`\n(where errors in the range are ignored when flattening).", - "The interpolation point is the given percentile\nover all the cells in the range of the conditional format.\nThis is equivalent to NUMBER if the value was:\n`=PERCENTILE(FLATTEN(range), value / 100)`\n(where errors in the range are ignored when flattening)." - ], + "sortOrder": { "enum": [ - "INTERPOLATION_POINT_TYPE_UNSPECIFIED", - "MIN", - "MAX", - "NUMBER", - "PERCENT", - "PERCENTILE" + "SORT_ORDER_UNSPECIFIED", + "ASCENDING", + "DESCENDING" ], - "description": "How the value should be interpreted." + "description": "The order data should be sorted.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use this.", + "Sort ascending.", + "Sort descending." + ] + }, + "foregroundColor": { + "description": "The text color to sort by. Mutually exclusive with sorting by background\nfill color. Requests to set this field will fail with a 400 error if\nbackground color is also set.", + "$ref": "Color" } }, - "id": "InterpolationPoint" + "id": "SortSpec" }, - "FindReplaceResponse": { - "id": "FindReplaceResponse", - "description": "The result of the find/replace.", + "UpdateEmbeddedObjectPositionResponse": { + "description": "The result of updating an embedded object's position.", "type": "object", "properties": { - "rowsChanged": { - "description": "The number of rows changed.", - "format": "int32", - "type": "integer" + "position": { + "description": "The new position of the embedded object.", + "$ref": "EmbeddedObjectPosition" + } + }, + "id": "UpdateEmbeddedObjectPositionResponse" + }, + "BooleanRule": { + "id": "BooleanRule", + "description": "A rule that may or may not match, depending on the condition.", + "type": "object", + "properties": { + "format": { + "$ref": "CellFormat", + "description": "The format to apply.\nConditional formatting can only apply a subset of formatting:\nbold, italic,\nstrikethrough,\nforeground color &\nbackground color." }, - "sheetsChanged": { - "description": "The number of sheets changed.", - "format": "int32", - "type": "integer" + "condition": { + "$ref": "BooleanCondition", + "description": "The condition of the rule. If the condition evaluates to true,\nthe format is applied." + } + } + }, + "WaterfallChartSpec": { + "id": "WaterfallChartSpec", + "description": "A waterfall chart.", + "type": "object", + "properties": { + "hideConnectorLines": { + "description": "True to hide connector lines between columns.", + "type": "boolean" + }, + "stackedType": { + "enum": [ + "WATERFALL_STACKED_TYPE_UNSPECIFIED", + "STACKED", + "SEQUENTIAL" + ], + "description": "The stacked type.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "Values corresponding to the same domain (horizontal axis) value will be\nstacked vertically.", + "Series will spread out along the horizontal axis." + ] + }, + "series": { + "type": "array", + "items": { + "$ref": "WaterfallChartSeries" + }, + "description": "The data this waterfall chart is visualizing." }, - "formulasChanged": { - "description": "The number of formula cells changed.", - "format": "int32", - "type": "integer" + "connectorLineStyle": { + "$ref": "LineStyle", + "description": "The line style for the connector lines." }, - "valuesChanged": { - "description": "The number of non-formula cells changed.", - "format": "int32", - "type": "integer" + "domain": { + "$ref": "WaterfallChartDomain", + "description": "The domain data (horizontal axis) for the waterfall chart." }, - "occurrencesChanged": { - "description": "The number of occurrences (possibly multiple within a cell) changed.\nFor example, if replacing `\"e\"` with `\"o\"` in `\"Google Sheets\"`, this would\nbe `\"3\"` because `\"Google Sheets\"` -\u003e `\"Googlo Shoots\"`.", - "format": "int32", - "type": "integer" + "firstValueIsTotal": { + "description": "True to interpret the first value as a total.", + "type": "boolean" } } }, - "DuplicateFilterViewRequest": { + "UpdateConditionalFormatRuleRequest": { + "description": "Updates a conditional format rule at the given index,\nor moves a conditional format rule to another index.", "type": "object", "properties": { - "filterId": { - "description": "The ID of the filter being duplicated.", + "rule": { + "$ref": "ConditionalFormatRule", + "description": "The rule that should replace the rule at the given index." + }, + "index": { + "description": "The zero-based index of the rule that should be replaced or moved.", "format": "int32", "type": "integer" - } - }, - "id": "DuplicateFilterViewRequest", - "description": "Duplicates a particular filter view." - }, - "UpdateConditionalFormatRuleResponse": { - "type": "object", - "properties": { - "newIndex": { + }, + "sheetId": { "type": "integer", - "description": "The index of the new rule.", + "description": "The sheet of the rule to move. Required if new_index is set,\nunused otherwise.", "format": "int32" }, - "oldIndex": { - "description": "The old index of the rule. Not set if a rule was replaced\n(because it is the same as new_index).", + "newIndex": { + "description": "The zero-based new index the rule should end up at.", "format": "int32", "type": "integer" - }, - "newRule": { - "$ref": "ConditionalFormatRule", - "description": "The new rule that replaced the old rule (if replacing),\nor the rule that was moved (if moved)" - }, - "oldRule": { - "$ref": "ConditionalFormatRule", - "description": "The old (deleted) rule. Not set if a rule was moved\n(because it is the same as new_rule)." } }, - "id": "UpdateConditionalFormatRuleResponse", - "description": "The result of updating a conditional format rule." + "id": "UpdateConditionalFormatRuleRequest" }, - "ConditionValue": { - "description": "The value of the condition.", + "BasicChartDomain": { "type": "object", "properties": { - "relativeDate": { - "description": "A relative date (based on the current date).\nValid only if the type is\nDATE_BEFORE,\nDATE_AFTER,\nDATE_ON_OR_BEFORE or\nDATE_ON_OR_AFTER.\n\nRelative dates are not supported in data validation.\nThey are supported only in conditional formatting and\nconditional filters.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "The value is one year before today.", - "The value is one month before today.", - "The value is one week before today.", - "The value is yesterday.", - "The value is today.", - "The value is tomorrow." - ], - "enum": [ - "RELATIVE_DATE_UNSPECIFIED", - "PAST_YEAR", - "PAST_MONTH", - "PAST_WEEK", - "YESTERDAY", - "TODAY", - "TOMORROW" - ] + "reversed": { + "description": "True to reverse the order of the domain values (horizontal axis).", + "type": "boolean" }, - "userEnteredValue": { - "description": "A value the condition is based on.\nThe value is parsed as if the user typed into a cell.\nFormulas are supported (and must begin with an `=` or a '+').", - "type": "string" + "domain": { + "$ref": "ChartData", + "description": "The data of the domain. For example, if charting stock prices over time,\nthis is the data representing the dates." } }, - "id": "ConditionValue" + "id": "BasicChartDomain", + "description": "The domain of a chart.\nFor example, if charting stock prices over time, this would be the date." }, - "DateTimeRule": { - "description": "Allows you to organize the date-time values in a source data column into\nbuckets based on selected parts of their date or time values. For example,\nconsider a pivot table showing sales transactions by date:\n\n +----------+--------------+\n | Date | SUM of Sales |\n +----------+--------------+\n | 1/1/2017 | $621.14 |\n | 2/3/2017 | $708.84 |\n | 5/8/2017 | $326.84 |\n ...\n +----------+--------------+\nApplying a date-time group rule with a DateTimeRuleType of YEAR_MONTH\nresults in the following pivot table.\n\n +--------------+--------------+\n | Grouped Date | SUM of Sales |\n +--------------+--------------+\n | 2017-Jan | $53,731.78 |\n | 2017-Feb | $83,475.32 |\n | 2017-Mar | $94,385.05 |\n ...\n +--------------+--------------+", + "PasteDataRequest": { + "description": "Inserts data into the spreadsheet starting at the specified coordinate.", "type": "object", "properties": { + "coordinate": { + "$ref": "GridCoordinate", + "description": "The coordinate at which the data should start being inserted." + }, + "data": { + "type": "string", + "description": "The data to insert." + }, + "delimiter": { + "description": "The delimiter in the data.", + "type": "string" + }, "type": { - "enumDescriptions": [ - "The default type, do not use.", - "Group dates by second, from 0 to 59.", - "Group dates by minute, from 0 to 59.", - "Group dates by hour using a 24-hour system, from 0 to 23.", - "Group dates by hour and minute using a 24-hour system, for example 19:45.", - "Group dates by hour and minute using a 12-hour system, for example 7:45\nPM. The AM/PM designation is translated based on the spreadsheet\nlocale.", - "Group dates by day of week, for example Sunday. The days of the week will\nbe translated based on the spreadsheet locale.", - "Group dates by day of year, from 1 to 366. Note that dates after Feb. 29\nfall in different buckets in leap years than in non-leap years.", - "Group dates by day of month, from 1 to 31.", - "Group dates by day and month, for example 22-Nov. The month is\ntranslated based on the spreadsheet locale.", - "Group dates by month, for example Nov. The month is translated based\non the spreadsheet locale.", - "Group dates by quarter, for example Q1 (which represents Jan-Mar).", - "Group dates by year, for example 2008.", - "Group dates by year and month, for example 2008-Nov. The month is\ntranslated based on the spreadsheet locale.", - "Group dates by year and quarter, for example 2008 Q4.", - "Group dates by year, month, and day, for example 2008-11-22." - ], "enum": [ - "DATE_TIME_RULE_TYPE_UNSPECIFIED", - "SECOND", - "MINUTE", - "HOUR", - "HOUR_MINUTE", - "HOUR_MINUTE_AMPM", - "DAY_OF_WEEK", - "DAY_OF_YEAR", - "DAY_OF_MONTH", - "DAY_MONTH", - "MONTH", - "QUARTER", - "YEAR", - "YEAR_MONTH", - "YEAR_QUARTER", - "YEAR_MONTH_DAY" + "PASTE_NORMAL", + "PASTE_VALUES", + "PASTE_FORMAT", + "PASTE_NO_BORDERS", + "PASTE_FORMULA", + "PASTE_DATA_VALIDATION", + "PASTE_CONDITIONAL_FORMATTING" ], - "description": "The type of date-time grouping to apply.", - "type": "string" - } - }, - "id": "DateTimeRule" - }, - "HistogramSeries": { - "type": "object", - "properties": { - "barColor": { - "$ref": "Color", - "description": "The color of the column representing this series in each bucket.\nThis field is optional." + "description": "How the data should be pasted.", + "type": "string", + "enumDescriptions": [ + "Paste values, formulas, formats, and merges.", + "Paste the values ONLY without formats, formulas, or merges.", + "Paste the format and data validation only.", + "Like PASTE_NORMAL but without borders.", + "Paste the formulas only.", + "Paste the data validation only.", + "Paste the conditional formatting rules only." + ] }, - "data": { - "$ref": "ChartData", - "description": "The data for this histogram series." + "html": { + "description": "True if the data is HTML.", + "type": "boolean" } }, - "id": "HistogramSeries", - "description": "A histogram series containing the series color and data." + "id": "PasteDataRequest" }, - "Spreadsheet": { - "description": "Resource that represents a spreadsheet.", + "UpdateDeveloperMetadataResponse": { "type": "object", "properties": { - "sheets": { - "type": "array", - "items": { - "$ref": "Sheet" - }, - "description": "The sheets that are part of a spreadsheet." - }, - "spreadsheetUrl": { - "type": "string", - "description": "The url of the spreadsheet.\nThis field is read-only." - }, - "properties": { - "description": "Overall properties of a spreadsheet.", - "$ref": "SpreadsheetProperties" - }, - "spreadsheetId": { - "description": "The ID of the spreadsheet.\nThis field is read-only.", - "type": "string" - }, - "namedRanges": { - "description": "The named ranges defined in a spreadsheet.", - "type": "array", - "items": { - "$ref": "NamedRange" - } - }, "developerMetadata": { "type": "array", "items": { "$ref": "DeveloperMetadata" }, - "description": "The developer metadata associated with a spreadsheet." + "description": "The updated developer metadata." } }, - "id": "Spreadsheet" + "id": "UpdateDeveloperMetadataResponse", + "description": "The response from updating developer metadata." }, - "BandedRange": { - "id": "BandedRange", - "description": "A banded (alternating colors) range in a sheet.", + "AppendDimensionRequest": { "type": "object", "properties": { - "rowProperties": { - "$ref": "BandingProperties", - "description": "Properties for row bands. These properties are applied on a row-by-row\nbasis throughout all the rows in the range. At least one of\nrow_properties or column_properties must be specified." - }, - "columnProperties": { - "description": "Properties for column bands. These properties are applied on a column-\nby-column basis throughout all the columns in the range. At least one of\nrow_properties or column_properties must be specified.", - "$ref": "BandingProperties" - }, - "range": { - "$ref": "GridRange", - "description": "The range over which these properties are applied." + "dimension": { + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "Whether rows or columns should be appended.", + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ] }, - "bandedRangeId": { + "length": { "type": "integer", - "description": "The id of the banded range.", + "description": "The number of rows or columns to append.", + "format": "int32" + }, + "sheetId": { + "type": "integer", + "description": "The sheet to append rows or columns to.", "format": "int32" } - } - }, - "AddChartRequest": { - "description": "Adds a chart to a sheet in the spreadsheet.", - "type": "object", - "properties": { - "chart": { - "description": "The chart that should be added to the spreadsheet, including the position\nwhere it should be placed. The chartId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of an embedded object that already exists.)", - "$ref": "EmbeddedChart" - } - }, - "id": "AddChartRequest" - }, - "HistogramRule": { - "id": "HistogramRule", - "description": "Allows you to organize the numeric values in a source data column into\nbuckets of a constant size. All values from HistogramRule.start to\nHistogramRule.end are placed into groups of size\nHistogramRule.interval. In addition, all values below\nHistogramRule.start are placed in one group, and all values above\nHistogramRule.end are placed in another. Only\nHistogramRule.interval is required, though if HistogramRule.start\nand HistogramRule.end are both provided, HistogramRule.start must\nbe less than HistogramRule.end. For example, a pivot table showing\naverage purchase amount by age that has 50+ rows:\n\n +-----+-------------------+\n | Age | AVERAGE of Amount |\n +-----+-------------------+\n | 16 | $27.13 |\n | 17 | $5.24 |\n | 18 | $20.15 |\n ...\n +-----+-------------------+\ncould be turned into a pivot table that looks like the one below by\napplying a histogram group rule with a HistogramRule.start of 25,\nan HistogramRule.interval of 20, and an HistogramRule.end\nof 65.\n\n +-------------+-------------------+\n | Grouped Age | AVERAGE of Amount |\n +-------------+-------------------+\n | \u003c 25 | $19.34 |\n | 25-45 | $31.43 |\n | 45-65 | $35.87 |\n | \u003e 65 | $27.55 |\n +-------------+-------------------+\n | Grand Total | $29.12 |\n +-------------+-------------------+", - "type": "object", - "properties": { - "end": { - "type": "number", - "description": "The maximum value at which items are placed into buckets\nof constant size. Values above end are lumped into a single bucket.\nThis field is optional.", - "format": "double" - }, - "interval": { - "description": "The size of the buckets that are created. Must be positive.", - "format": "double", - "type": "number" - }, - "start": { - "description": "The minimum value at which items are placed into buckets\nof constant size. Values below start are lumped into a single bucket.\nThis field is optional.", - "format": "double", - "type": "number" - } - } + }, + "id": "AppendDimensionRequest", + "description": "Appends rows or columns to the end of a sheet." }, - "UpdateProtectedRangeRequest": { - "description": "Updates an existing protected range with the specified\nprotectedRangeId.", + "AddNamedRangeRequest": { + "id": "AddNamedRangeRequest", + "description": "Adds a named range to the spreadsheet.", "type": "object", "properties": { - "protectedRange": { - "$ref": "ProtectedRange", - "description": "The protected range to update with the new properties." - }, - "fields": { - "type": "string", - "description": "The fields that should be updated. At least one field must be specified.\nThe root `protectedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask" + "namedRange": { + "$ref": "NamedRange", + "description": "The named range to add. The namedRangeId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a range that already exists.)" } - }, - "id": "UpdateProtectedRangeRequest" + } }, - "AddSheetResponse": { + "CreateDeveloperMetadataResponse": { + "description": "The response from creating developer metadata.", "type": "object", "properties": { - "properties": { - "description": "The properties of the newly added sheet.", - "$ref": "SheetProperties" + "developerMetadata": { + "$ref": "DeveloperMetadata", + "description": "The developer metadata that was created." } }, - "id": "AddSheetResponse", - "description": "The result of adding a sheet." + "id": "CreateDeveloperMetadataResponse" }, - "PivotGroupRule": { - "id": "PivotGroupRule", - "description": "An optional setting on a PivotGroup that defines buckets for the values\nin the source data column rather than breaking out each individual value.\nOnly one PivotGroup with a group rule may be added for each column in\nthe source data, though on any given column you may add both a\nPivotGroup that has a rule and a PivotGroup that does not.", + "UpdateEmbeddedObjectPositionRequest": { "type": "object", "properties": { - "manualRule": { - "$ref": "ManualRule", - "description": "A ManualRule." + "objectId": { + "description": "The ID of the object to moved.", + "format": "int32", + "type": "integer" }, - "histogramRule": { - "$ref": "HistogramRule", - "description": "A HistogramRule." + "newPosition": { + "$ref": "EmbeddedObjectPosition", + "description": "An explicit position to move the embedded object to.\nIf newPosition.sheetId is set,\na new sheet with that ID will be created.\nIf newPosition.newSheet is set to true,\na new sheet will be created with an ID that will be chosen for you." }, - "dateTimeRule": { - "$ref": "DateTimeRule", - "description": "A DateTimeRule." + "fields": { + "description": "The fields of OverlayPosition\nthat should be updated when setting a new position. Used only if\nnewPosition.overlayPosition\nis set, in which case at least one field must\nbe specified. The root `newPosition.overlayPosition` is implied and\nshould not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask", + "type": "string" } - } + }, + "id": "UpdateEmbeddedObjectPositionRequest", + "description": "Update an embedded object's position (such as a moving or resizing a\nchart or image)." }, - "AddFilterViewResponse": { - "id": "AddFilterViewResponse", - "description": "The result of adding a filter view.", + "WaterfallChartColumnStyle": { + "id": "WaterfallChartColumnStyle", + "description": "Styles for a waterfall chart column.", "type": "object", "properties": { - "filter": { - "$ref": "FilterView", - "description": "The newly added filter view." + "color": { + "description": "The color of the column.", + "$ref": "Color" + }, + "label": { + "description": "The label of the column's legend.", + "type": "string" } } }, - "IterativeCalculationSettings": { + "Request": { "type": "object", "properties": { - "convergenceThreshold": { - "description": "When iterative calculation is enabled and successive results differ by\nless than this threshold value, the calculation rounds stop.", - "format": "double", - "type": "number" + "autoResizeDimensions": { + "$ref": "AutoResizeDimensionsRequest", + "description": "Automatically resizes one or more dimensions based on the contents\nof the cells in that dimension." }, - "maxIterations": { - "type": "integer", - "description": "When iterative calculation is enabled, the maximum number of calculation\nrounds to perform.", - "format": "int32" - } - }, - "id": "IterativeCalculationSettings", - "description": "Settings to control how circular dependencies are resolved with iterative\ncalculation." - }, - "ScorecardChartSpec": { - "type": "object", - "properties": { - "keyValueFormat": { - "$ref": "KeyValueFormat", - "description": "Formatting options for key value." + "appendCells": { + "$ref": "AppendCellsRequest", + "description": "Appends cells after the last row with data in a sheet." }, - "numberFormatSource": { - "enum": [ - "CHART_NUMBER_FORMAT_SOURCE_UNDEFINED", - "FROM_DATA", - "CUSTOM" - ], - "description": "The number format source used in the scorecard chart.\nThis field is optional.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "Inherit number formatting from data.", - "Apply custom formatting as specified by ChartCustomNumberFormatOptions." - ] + "cutPaste": { + "$ref": "CutPasteRequest", + "description": "Cuts data from one area and pastes it to another." }, - "customFormatOptions": { - "$ref": "ChartCustomNumberFormatOptions", - "description": "Custom formatting options for numeric key/baseline values in scorecard\nchart. This field is used only when number_format_source is set to\nCUSTOM. This field is optional." + "mergeCells": { + "$ref": "MergeCellsRequest", + "description": "Merges cells together." }, - "scaleFactor": { - "description": "Value to scale scorecard key and baseline value. For example, a factor of\n10 can be used to divide all values in the chart by 10.\nThis field is optional.", - "format": "double", - "type": "number" + "updateNamedRange": { + "$ref": "UpdateNamedRangeRequest", + "description": "Updates a named range." }, - "baselineValueFormat": { - "$ref": "BaselineValueFormat", - "description": "Formatting options for baseline value.\nThis field is needed only if baseline_value_data is specified." + "updateSheetProperties": { + "$ref": "UpdateSheetPropertiesRequest", + "description": "Updates a sheet's properties." }, - "baselineValueData": { - "$ref": "ChartData", - "description": "The data for scorecard baseline value.\nThis field is optional." + "autoFill": { + "$ref": "AutoFillRequest", + "description": "Automatically fills in more data based on existing data." }, - "keyValueData": { - "$ref": "ChartData", - "description": "The data for scorecard key value." + "deleteDimension": { + "description": "Deletes rows or columns in a sheet.", + "$ref": "DeleteDimensionRequest" }, - "aggregateType": { - "enum": [ - "CHART_AGGREGATE_TYPE_UNSPECIFIED", - "AVERAGE", - "COUNT", - "MAX", - "MEDIAN", - "MIN", - "SUM" - ], - "description": "The aggregation type for key and baseline chart data in scorecard chart.\nThis field is optional.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "Average aggregate function.", - "Count aggregate function.", - "Maximum aggregate function.", - "Median aggregate function.", - "Minimum aggregate function.", - "Sum aggregate function." - ] - } - }, - "id": "ScorecardChartSpec", - "description": "A scorecard chart. Scorecard charts are used to highlight key performance\nindicators, known as KPIs, on the spreadsheet. A scorecard chart can\nrepresent things like total sales, average cost, or a top selling item. You\ncan specify a single data value, or aggregate over a range of data.\nPercentage or absolute difference from a baseline value can be highlighted,\nlike changes over time." - }, - "OverlayPosition": { - "type": "object", - "properties": { - "offsetYPixels": { - "type": "integer", - "description": "The vertical offset, in pixels, that the object is offset\nfrom the anchor cell.", - "format": "int32" + "sortRange": { + "$ref": "SortRangeRequest", + "description": "Sorts data in a range." + }, + "addSlicer": { + "$ref": "AddSlicerRequest", + "description": "Adds a slicer." + }, + "deleteProtectedRange": { + "$ref": "DeleteProtectedRangeRequest", + "description": "Deletes a protected range." + }, + "deleteDimensionGroup": { + "$ref": "DeleteDimensionGroupRequest", + "description": "Deletes a group over the specified range." + }, + "duplicateFilterView": { + "$ref": "DuplicateFilterViewRequest", + "description": "Duplicates a filter view." + }, + "addChart": { + "description": "Adds a chart.", + "$ref": "AddChartRequest" + }, + "findReplace": { + "description": "Finds and replaces occurrences of some text with other text.", + "$ref": "FindReplaceRequest" + }, + "textToColumns": { + "$ref": "TextToColumnsRequest", + "description": "Converts a column of text into many columns of text." + }, + "updateChartSpec": { + "$ref": "UpdateChartSpecRequest", + "description": "Updates a chart's specifications." + }, + "addSheet": { + "$ref": "AddSheetRequest", + "description": "Adds a sheet." + }, + "updateProtectedRange": { + "$ref": "UpdateProtectedRangeRequest", + "description": "Updates a protected range." + }, + "copyPaste": { + "$ref": "CopyPasteRequest", + "description": "Copies data from one area and pastes it to another." + }, + "deleteFilterView": { + "$ref": "DeleteFilterViewRequest", + "description": "Deletes a filter view from a sheet." + }, + "insertDimension": { + "$ref": "InsertDimensionRequest", + "description": "Inserts new rows or columns in a sheet." + }, + "deleteRange": { + "$ref": "DeleteRangeRequest", + "description": "Deletes a range of cells from a sheet, shifting the remaining cells." + }, + "deleteBanding": { + "$ref": "DeleteBandingRequest", + "description": "Removes a banded range" + }, + "addFilterView": { + "$ref": "AddFilterViewRequest", + "description": "Adds a filter view." + }, + "deleteDuplicates": { + "$ref": "DeleteDuplicatesRequest", + "description": "Removes rows containing duplicate values in specified columns of a cell\nrange." + }, + "setDataValidation": { + "$ref": "SetDataValidationRequest", + "description": "Sets data validation for one or more cells." + }, + "updateBorders": { + "$ref": "UpdateBordersRequest", + "description": "Updates the borders in a range of cells." + }, + "deleteConditionalFormatRule": { + "$ref": "DeleteConditionalFormatRuleRequest", + "description": "Deletes an existing conditional format rule." + }, + "repeatCell": { + "$ref": "RepeatCellRequest", + "description": "Repeats a single cell across a range." + }, + "clearBasicFilter": { + "$ref": "ClearBasicFilterRequest", + "description": "Clears the basic filter on a sheet." + }, + "appendDimension": { + "$ref": "AppendDimensionRequest", + "description": "Appends dimensions to the end of a sheet." + }, + "updateSlicerSpec": { + "$ref": "UpdateSlicerSpecRequest", + "description": "Updates a slicer's specifications." + }, + "createDeveloperMetadata": { + "description": "Creates new developer metadata", + "$ref": "CreateDeveloperMetadataRequest" + }, + "updateConditionalFormatRule": { + "description": "Updates an existing conditional format rule.", + "$ref": "UpdateConditionalFormatRuleRequest" + }, + "insertRange": { + "$ref": "InsertRangeRequest", + "description": "Inserts new cells in a sheet, shifting the existing cells." }, - "heightPixels": { - "description": "The height of the object, in pixels. Defaults to 371.", - "format": "int32", - "type": "integer" + "deleteDeveloperMetadata": { + "$ref": "DeleteDeveloperMetadataRequest", + "description": "Deletes developer metadata" }, - "widthPixels": { - "description": "The width of the object, in pixels. Defaults to 600.", - "format": "int32", - "type": "integer" + "moveDimension": { + "$ref": "MoveDimensionRequest", + "description": "Moves rows or columns to another location in a sheet." }, - "offsetXPixels": { - "description": "The horizontal offset, in pixels, that the object is offset\nfrom the anchor cell.", - "format": "int32", - "type": "integer" + "randomizeRange": { + "$ref": "RandomizeRangeRequest", + "description": "Randomizes the order of the rows in a range." }, - "anchorCell": { - "description": "The cell the object is anchored to.", - "$ref": "GridCoordinate" - } - }, - "id": "OverlayPosition", - "description": "The location an object is overlaid on top of a grid." - }, - "SpreadsheetProperties": { - "description": "Properties of a spreadsheet.", - "type": "object", - "properties": { - "title": { - "description": "The title of the spreadsheet.", - "type": "string" + "updateBanding": { + "$ref": "UpdateBandingRequest", + "description": "Updates a banded range" }, - "timeZone": { - "description": "The time zone of the spreadsheet, in CLDR format such as\n`America/New_York`. If the time zone isn't recognized, this may\nbe a custom time zone such as `GMT-07:00`.", - "type": "string" + "deleteNamedRange": { + "$ref": "DeleteNamedRangeRequest", + "description": "Deletes a named range." }, - "locale": { - "description": "The locale of the spreadsheet in one of the following formats:\n\n* an ISO 639-1 language code such as `en`\n\n* an ISO 639-2 language code such as `fil`, if no 639-1 code exists\n\n* a combination of the ISO language code and country code, such as `en_US`\n\nNote: when updating this field, not all locales/languages are supported.", - "type": "string" + "addProtectedRange": { + "$ref": "AddProtectedRangeRequest", + "description": "Adds a protected range." }, - "iterativeCalculationSettings": { - "description": "Determines whether and how circular references are resolved with iterative\ncalculation. Absence of this field means that circular references will\nresult in calculation errors.", - "$ref": "IterativeCalculationSettings" + "duplicateSheet": { + "description": "Duplicates a sheet.", + "$ref": "DuplicateSheetRequest" }, - "autoRecalc": { - "enum": [ - "RECALCULATION_INTERVAL_UNSPECIFIED", - "ON_CHANGE", - "MINUTE", - "HOUR" - ], - "description": "The amount of time to wait before volatile functions are recalculated.", - "type": "string", - "enumDescriptions": [ - "Default value. This value must not be used.", - "Volatile functions are updated on every change.", - "Volatile functions are updated on every change and every minute.", - "Volatile functions are updated on every change and hourly." - ] + "unmergeCells": { + "$ref": "UnmergeCellsRequest", + "description": "Unmerges merged cells." }, - "defaultFormat": { - "$ref": "CellFormat", - "description": "The default format of all cells in the spreadsheet.\nCellData.effectiveFormat will not be set if\nthe cell's format is equal to this default format. This field is read-only." - } - }, - "id": "SpreadsheetProperties" - }, - "AddChartResponse": { - "description": "The result of adding a chart to a spreadsheet.", - "type": "object", - "properties": { - "chart": { - "$ref": "EmbeddedChart", - "description": "The newly added chart." - } - }, - "id": "AddChartResponse" - }, - "InsertDimensionRequest": { - "type": "object", - "properties": { - "range": { - "description": "The dimensions to insert. Both the start and end indexes must be bounded.", - "$ref": "DimensionRange" + "deleteSheet": { + "$ref": "DeleteSheetRequest", + "description": "Deletes a sheet." }, - "inheritFromBefore": { - "description": "Whether dimension properties should be extended from the dimensions\nbefore or after the newly inserted dimensions.\nTrue to inherit from the dimensions before (in which case the start\nindex must be greater than 0), and false to inherit from the dimensions\nafter.\n\nFor example, if row index 0 has red background and row index 1\nhas a green background, then inserting 2 rows at index 1 can inherit\neither the green or red background. If `inheritFromBefore` is true,\nthe two new rows will be red (because the row before the insertion point\nwas red), whereas if `inheritFromBefore` is false, the two new rows will\nbe green (because the row after the insertion point was green).", - "type": "boolean" - } - }, - "id": "InsertDimensionRequest", - "description": "Inserts rows or columns in a sheet at a particular index." - }, - "BatchUpdateValuesRequest": { - "description": "The request for updating more than one range of values in a spreadsheet.", - "type": "object", - "properties": { - "includeValuesInResponse": { - "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values. The `updatedData` field within\neach of the BatchUpdateValuesResponse.responses will contain\nthe updated values. If the range to write was larger than than the range\nactually written, the response will include all values in the requested\nrange (excluding trailing empty rows and columns).", - "type": "boolean" + "updateEmbeddedObjectPosition": { + "description": "Updates an embedded object's (e.g. chart, image) position.", + "$ref": "UpdateEmbeddedObjectPositionRequest" }, - "valueInputOption": { - "description": "How the input data should be interpreted.", - "type": "string", - "enumDescriptions": [ - "Default input value. This value must not be used.", - "The values the user has entered will not be parsed and will be stored\nas-is.", - "The values will be parsed as if the user typed them into the UI.\nNumbers will stay as numbers, but strings may be converted to numbers,\ndates, etc. following the same rules that are applied when entering\ntext into a cell via the Google Sheets UI." - ], - "enum": [ - "INPUT_VALUE_OPTION_UNSPECIFIED", - "RAW", - "USER_ENTERED" - ] + "addDimensionGroup": { + "$ref": "AddDimensionGroupRequest", + "description": "Creates a group over the specified range." }, - "data": { - "type": "array", - "items": { - "$ref": "ValueRange" - }, - "description": "The new values to apply to the spreadsheet." + "updateDeveloperMetadata": { + "$ref": "UpdateDeveloperMetadataRequest", + "description": "Updates an existing developer metadata entry" }, - "responseDateTimeRenderOption": { - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER.", - "type": "string", - "enumDescriptions": [ - "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", - "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." - ] + "updateDimensionProperties": { + "$ref": "UpdateDimensionPropertiesRequest", + "description": "Updates dimensions' properties." }, - "responseValueRenderOption": { - "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string", - "enumDescriptions": [ - "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", - "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", - "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." - ], - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ] - } - }, - "id": "BatchUpdateValuesRequest" - }, - "CutPasteRequest": { - "description": "Moves data from the source to the destination.", - "type": "object", - "properties": { - "source": { - "description": "The source data to cut.", - "$ref": "GridRange" + "updateDimensionGroup": { + "$ref": "UpdateDimensionGroupRequest", + "description": "Updates the state of the specified group." }, - "pasteType": { - "enumDescriptions": [ - "Paste values, formulas, formats, and merges.", - "Paste the values ONLY without formats, formulas, or merges.", - "Paste the format and data validation only.", - "Like PASTE_NORMAL but without borders.", - "Paste the formulas only.", - "Paste the data validation only.", - "Paste the conditional formatting rules only." - ], - "enum": [ - "PASTE_NORMAL", - "PASTE_VALUES", - "PASTE_FORMAT", - "PASTE_NO_BORDERS", - "PASTE_FORMULA", - "PASTE_DATA_VALIDATION", - "PASTE_CONDITIONAL_FORMATTING" - ], - "description": "What kind of data to paste. All the source data will be cut, regardless\nof what is pasted.", - "type": "string" + "pasteData": { + "$ref": "PasteDataRequest", + "description": "Pastes data (HTML or delimited) into a sheet." }, - "destination": { - "description": "The top-left coordinate where the data should be pasted.", - "$ref": "GridCoordinate" - } - }, - "id": "CutPasteRequest" - }, - "ChartAxisViewWindowOptions": { - "id": "ChartAxisViewWindowOptions", - "description": "The options that define a \"view window\" for a chart (such as the visible\nvalues in an axis).", - "type": "object", - "properties": { - "viewWindowMin": { - "description": "The minimum numeric value to be shown in this view window. If unset, will\nautomatically determine a minimum value that looks good for the data.", - "format": "double", - "type": "number" + "setBasicFilter": { + "description": "Sets the basic filter on a sheet.", + "$ref": "SetBasicFilterRequest" }, - "viewWindowMax": { - "type": "number", - "description": "The maximum numeric value to be shown in this view window. If unset, will\nautomatically determine a maximum value that looks good for the data.", - "format": "double" + "addConditionalFormatRule": { + "description": "Adds a new conditional format rule.", + "$ref": "AddConditionalFormatRuleRequest" }, - "viewWindowMode": { - "description": "The view window's mode.", - "type": "string", - "enumDescriptions": [ - "The default view window mode used in the Sheets editor for this chart\ntype. In most cases, if set, the default mode is equivalent to\n`PRETTY`.", - "Do not use. Represents that the currently set mode is not supported by\nthe API.", - "Follows the min and max exactly if specified. If a value is unspecified,\nit will fall back to the `PRETTY` value.", - "Chooses a min and max that make the chart look good. Both min and max are\nignored in this mode." - ], - "enum": [ - "DEFAULT_VIEW_WINDOW_MODE", - "VIEW_WINDOW_MODE_UNSUPPORTED", - "EXPLICIT", - "PRETTY" - ] - } - } - }, - "BasicChartSeries": { - "id": "BasicChartSeries", - "description": "A single series of data in a chart.\nFor example, if charting stock prices over time, multiple series may exist,\none for the \"Open Price\", \"High Price\", \"Low Price\" and \"Close Price\".", - "type": "object", - "properties": { - "targetAxis": { - "enum": [ - "BASIC_CHART_AXIS_POSITION_UNSPECIFIED", - "BOTTOM_AXIS", - "LEFT_AXIS", - "RIGHT_AXIS" - ], - "description": "The minor axis that will specify the range of values for this series.\nFor example, if charting stocks over time, the \"Volume\" series\nmay want to be pinned to the right with the prices pinned to the left,\nbecause the scale of trading volume is different than the scale of\nprices.\nIt is an error to specify an axis that isn't a valid minor axis\nfor the chart's type.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "The axis rendered at the bottom of a chart.\nFor most charts, this is the standard major axis.\nFor bar charts, this is a minor axis.", - "The axis rendered at the left of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is the standard major axis.", - "The axis rendered at the right of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is an unusual major axis." - ] + "updateCells": { + "$ref": "UpdateCellsRequest", + "description": "Updates many cells at once." + }, + "addNamedRange": { + "$ref": "AddNamedRangeRequest", + "description": "Adds a named range." }, - "color": { - "description": "The color for elements (i.e. bars, lines, points) associated with this\nseries. If empty, a default color is used.", - "$ref": "Color" + "updateSpreadsheetProperties": { + "$ref": "UpdateSpreadsheetPropertiesRequest", + "description": "Updates the spreadsheet's properties." }, - "lineStyle": { - "description": "The line style of this series. Valid only if the\nchartType is AREA,\nLINE, or SCATTER.\nCOMBO charts are also supported if the\nseries chart type is\nAREA or LINE.", - "$ref": "LineStyle" + "trimWhitespace": { + "$ref": "TrimWhitespaceRequest", + "description": "Trims cells of whitespace (such as spaces, tabs, or new lines)." }, - "series": { - "$ref": "ChartData", - "description": "The data being visualized in this chart series." + "deleteEmbeddedObject": { + "$ref": "DeleteEmbeddedObjectRequest", + "description": "Deletes an embedded object (e.g, chart, image) in a sheet." }, - "type": { - "enum": [ - "BASIC_CHART_TYPE_UNSPECIFIED", - "BAR", - "LINE", - "AREA", - "COLUMN", - "SCATTER", - "COMBO", - "STEPPED_AREA" - ], - "description": "The type of this series. Valid only if the\nchartType is\nCOMBO.\nDifferent types will change the way the series is visualized.\nOnly LINE, AREA,\nand COLUMN are supported.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "A \u003ca href=\"/chart/interactive/docs/gallery/barchart\"\u003ebar chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/linechart\"\u003eline chart\u003c/a\u003e.", - "An \u003ca href=\"/chart/interactive/docs/gallery/areachart\"\u003earea chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/columnchart\"\u003ecolumn chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/scatterchart\"\u003escatter\nchart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/combochart\"\u003ecombo chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/steppedareachart\"\u003estepped area\nchart\u003c/a\u003e." - ] + "updateFilterView": { + "description": "Updates the properties of a filter view.", + "$ref": "UpdateFilterViewRequest" + }, + "addBanding": { + "$ref": "AddBandingRequest", + "description": "Adds a new banded range" } - } + }, + "id": "Request", + "description": "A single kind of update to apply to a spreadsheet." }, - "AutoResizeDimensionsRequest": { - "description": "Automatically resizes one or more dimensions based on the contents\nof the cells in that dimension.", + "WaterfallChartDomain": { + "description": "The domain of a waterfall chart.", "type": "object", "properties": { - "dimensions": { - "description": "The dimensions to automatically resize.", - "$ref": "DimensionRange" + "data": { + "description": "The data of the WaterfallChartDomain.", + "$ref": "ChartData" + }, + "reversed": { + "type": "boolean", + "description": "True to reverse the order of the domain values (horizontal axis)." } }, - "id": "AutoResizeDimensionsRequest" + "id": "WaterfallChartDomain" }, - "UpdateBordersRequest": { - "description": "Updates the borders of a range.\nIf a field is not set in the request, that means the border remains as-is.\nFor example, with two subsequent UpdateBordersRequest:\n\n 1. range: A1:A5 `{ top: RED, bottom: WHITE }`\n 2. range: A1:A5 `{ left: BLUE }`\n\nThat would result in A1:A5 having a borders of\n`{ top: RED, bottom: WHITE, left: BLUE }`.\nIf you want to clear a border, explicitly set the style to\nNONE.", + "GridRange": { + "id": "GridRange", + "description": "A range on a sheet.\nAll indexes are zero-based.\nIndexes are half open, e.g the start index is inclusive\nand the end index is exclusive -- [start_index, end_index).\nMissing indexes indicate the range is unbounded on that side.\n\nFor example, if `\"Sheet1\"` is sheet ID 0, then:\n\n `Sheet1!A1:A1 == sheet_id: 0,\n start_row_index: 0, end_row_index: 1,\n start_column_index: 0, end_column_index: 1`\n\n `Sheet1!A3:B4 == sheet_id: 0,\n start_row_index: 2, end_row_index: 4,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1!A:B == sheet_id: 0,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1!A5:B == sheet_id: 0,\n start_row_index: 4,\n start_column_index: 0, end_column_index: 2`\n\n `Sheet1 == sheet_id:0`\n\nThe start index must always be less than or equal to the end index.\nIf the start index equals the end index, then the range is empty.\nEmpty ranges are typically not meaningful and are usually rendered in the\nUI as `#REF!`.", "type": "object", "properties": { - "left": { - "$ref": "Border", - "description": "The border to put at the left of the range." + "startRowIndex": { + "type": "integer", + "description": "The start row (inclusive) of the range, or not set if unbounded.", + "format": "int32" }, - "bottom": { - "$ref": "Border", - "description": "The border to put at the bottom of the range." + "startColumnIndex": { + "description": "The start column (inclusive) of the range, or not set if unbounded.", + "format": "int32", + "type": "integer" }, - "innerVertical": { - "$ref": "Border", - "description": "The vertical border to put within the range." + "sheetId": { + "description": "The sheet this range is on.", + "format": "int32", + "type": "integer" }, - "right": { - "description": "The border to put at the right of the range.", - "$ref": "Border" + "endRowIndex": { + "description": "The end row (exclusive) of the range, or not set if unbounded.", + "format": "int32", + "type": "integer" }, + "endColumnIndex": { + "type": "integer", + "description": "The end column (exclusive) of the range, or not set if unbounded.", + "format": "int32" + } + } + }, + "DeleteDimensionGroupRequest": { + "type": "object", + "properties": { "range": { - "$ref": "GridRange", - "description": "The range whose borders should be updated." - }, - "innerHorizontal": { - "$ref": "Border", - "description": "The horizontal border to put within the range." - }, - "top": { - "$ref": "Border", - "description": "The border to put at the top of the range." + "$ref": "DimensionRange", + "description": "The range of the group to be deleted." } }, - "id": "UpdateBordersRequest" + "id": "DeleteDimensionGroupRequest", + "description": "Deletes a group over the specified range by decrementing the depth of the\ndimensions in the range.\n\nFor example, assume the sheet has a depth-1 group over B:E and a depth-2\ngroup over C:D. Deleting a group over D:E leaves the sheet with a\ndepth-1 group over B:D and a depth-2 group over C:C." }, - "CellFormat": { + "BubbleChartSpec": { + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/bubblechart\"\u003ebubble chart\u003c/a\u003e.", "type": "object", "properties": { - "numberFormat": { - "description": "A format describing how number values should be represented to the user.", - "$ref": "NumberFormat" + "series": { + "$ref": "ChartData", + "description": "The data contianing the bubble y-values. These values locate the bubbles\nin the chart vertically." }, - "hyperlinkDisplayType": { - "type": "string", + "legendPosition": { "enumDescriptions": [ - "The default value: the hyperlink is rendered. Do not use this.", - "A hyperlink should be explicitly rendered.", - "A hyperlink should not be rendered." + "Default value, do not use.", + "The legend is rendered on the bottom of the chart.", + "The legend is rendered on the left of the chart.", + "The legend is rendered on the right of the chart.", + "The legend is rendered on the top of the chart.", + "No legend is rendered.", + "The legend is rendered inside the chart area." ], "enum": [ - "HYPERLINK_DISPLAY_TYPE_UNSPECIFIED", - "LINKED", - "PLAIN_TEXT" - ], - "description": "How a hyperlink, if it exists, should be displayed in the cell." - }, - "horizontalAlignment": { - "description": "The horizontal alignment of the value in the cell.", - "type": "string", - "enumDescriptions": [ - "The horizontal alignment is not specified. Do not use this.", - "The text is explicitly aligned to the left of the cell.", - "The text is explicitly aligned to the center of the cell.", - "The text is explicitly aligned to the right of the cell." + "BUBBLE_CHART_LEGEND_POSITION_UNSPECIFIED", + "BOTTOM_LEGEND", + "LEFT_LEGEND", + "RIGHT_LEGEND", + "TOP_LEGEND", + "NO_LEGEND", + "INSIDE_LEGEND" ], - "enum": [ - "HORIZONTAL_ALIGN_UNSPECIFIED", - "LEFT", - "CENTER", - "RIGHT" - ] + "description": "Where the legend of the chart should be drawn.", + "type": "string" }, - "textFormat": { - "$ref": "TextFormat", - "description": "The format of the text in the cell (unless overridden by a format run)." + "domain": { + "$ref": "ChartData", + "description": "The data containing the bubble x-values. These values locate the bubbles\nin the chart horizontally." }, - "backgroundColor": { - "description": "The background color of the cell.", - "$ref": "Color" + "bubbleSizes": { + "$ref": "ChartData", + "description": "The data contianing the bubble sizes. Bubble sizes are used to draw\nthe bubbles at different sizes relative to each other.\nIf specified, group_ids must also be specified. This field is\noptional." }, - "padding": { - "$ref": "Padding", - "description": "The padding of the cell." + "bubbleOpacity": { + "description": "The opacity of the bubbles between 0 and 1.0.\n0 is fully transparent and 1 is fully opaque.", + "format": "float", + "type": "number" }, - "verticalAlignment": { - "type": "string", - "enumDescriptions": [ - "The vertical alignment is not specified. Do not use this.", - "The text is explicitly aligned to the top of the cell.", - "The text is explicitly aligned to the middle of the cell.", - "The text is explicitly aligned to the bottom of the cell." - ], - "enum": [ - "VERTICAL_ALIGN_UNSPECIFIED", - "TOP", - "MIDDLE", - "BOTTOM" - ], - "description": "The vertical alignment of the value in the cell." + "bubbleBorderColor": { + "$ref": "Color", + "description": "The bubble border color." }, - "borders": { - "$ref": "Borders", - "description": "The borders of the cell." + "bubbleTextStyle": { + "$ref": "TextFormat", + "description": "The format of the text inside the bubbles.\nUnderline and Strikethrough are not supported." }, - "textDirection": { - "description": "The direction of the text in the cell.", - "type": "string", - "enumDescriptions": [ - "The text direction is not specified. Do not use this.", - "The text direction of left-to-right was set by the user.", - "The text direction of right-to-left was set by the user." - ], - "enum": [ - "TEXT_DIRECTION_UNSPECIFIED", - "LEFT_TO_RIGHT", - "RIGHT_TO_LEFT" - ] + "groupIds": { + "$ref": "ChartData", + "description": "The data containing the bubble group IDs. All bubbles with the same group\nID are drawn in the same color. If bubble_sizes is specified then\nthis field must also be specified but may contain blank values.\nThis field is optional." }, - "wrapStrategy": { - "description": "The wrap strategy for the value in the cell.", - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "Lines that are longer than the cell width will be written in the next\ncell over, so long as that cell is empty. If the next cell over is\nnon-empty, this behaves the same as CLIP. The text will never wrap\nto the next line unless the user manually inserts a new line.\nExample:\n\n | First sentence. |\n | Manual newline that is very long. \u003c- Text continues into next cell\n | Next newline. |", - "This wrap strategy represents the old Google Sheets wrap strategy where\nwords that are longer than a line are clipped rather than broken. This\nstrategy is not supported on all platforms and is being phased out.\nExample:\n\n | Cell has a |\n | loooooooooo| \u003c- Word is clipped.\n | word. |", - "Lines that are longer than the cell width will be clipped.\nThe text will never wrap to the next line unless the user manually\ninserts a new line.\nExample:\n\n | First sentence. |\n | Manual newline t| \u003c- Text is clipped\n | Next newline. |", - "Words that are longer than a line are wrapped at the character level\nrather than clipped.\nExample:\n\n | Cell has a |\n | loooooooooo| \u003c- Word is broken.\n | ong word. |" - ], - "enum": [ - "WRAP_STRATEGY_UNSPECIFIED", - "OVERFLOW_CELL", - "LEGACY_WRAP", - "CLIP", - "WRAP" - ] + "bubbleLabels": { + "$ref": "ChartData", + "description": "The data containing the bubble labels. These do not need to be unique." }, - "textRotation": { - "$ref": "TextRotation", - "description": "The rotation applied to text in a cell" - } - }, - "id": "CellFormat", - "description": "The format of a cell." - }, - "ClearValuesResponse": { - "type": "object", - "properties": { - "clearedRange": { - "description": "The range (in A1 notation) that was cleared.\n(If the request was for an unbounded range or a ranger larger\n than the bounds of the sheet, this will be the actual range\n that was cleared, bounded to the sheet's limits.)", - "type": "string" + "bubbleMinRadiusSize": { + "description": "The minimum radius size of the bubbles, in pixels.\nIf specific, the field must be a positive value.", + "format": "int32", + "type": "integer" }, - "spreadsheetId": { - "description": "The spreadsheet the updates were applied to.", - "type": "string" + "bubbleMaxRadiusSize": { + "description": "The max radius size of the bubbles, in pixels.\nIf specified, the field must be a positive value.", + "format": "int32", + "type": "integer" } }, - "id": "ClearValuesResponse", - "description": "The response when clearing a range of values in a spreadsheet." + "id": "BubbleChartSpec" }, - "WaterfallChartCustomSubtotal": { - "description": "A custom subtotal column for a waterfall chart series.", + "SetDataValidationRequest": { "type": "object", "properties": { - "subtotalIndex": { - "description": "The 0-based index of a data point within the series. If\ndata_is_subtotal is true, the data point at this index is the\nsubtotal. Otherwise, the subtotal appears after the data point with\nthis index. A series can have multiple subtotals at arbitrary indices,\nbut subtotals do not affect the indices of the data points. For\nexample, if a series has three data points, their indices will always\nbe 0, 1, and 2, regardless of how many subtotals exist on the series or\nwhat data points they are associated with.", - "format": "int32", - "type": "integer" - }, - "dataIsSubtotal": { - "type": "boolean", - "description": "True if the data point at subtotal_index is the subtotal. If false,\nthe subtotal will be computed and appear after the data point." + "rule": { + "$ref": "DataValidationRule", + "description": "The data validation rule to set on each cell in the range,\nor empty to clear the data validation in the range." }, - "label": { - "description": "A label for the subtotal column.", - "type": "string" + "range": { + "description": "The range the data validation rule should apply to.", + "$ref": "GridRange" } }, - "id": "WaterfallChartCustomSubtotal" + "id": "SetDataValidationRequest", + "description": "Sets a data validation rule to every cell in the range.\nTo clear validation in a range, call this with no rule specified." }, - "ChartData": { - "description": "The data included in a domain or series.", + "TextPosition": { + "description": "Position settings for text.", "type": "object", "properties": { - "sourceRange": { - "description": "The source ranges of the data.", - "$ref": "ChartSourceRange" + "horizontalAlignment": { + "description": "Horizontal alignment setting for the piece of text.", + "type": "string", + "enumDescriptions": [ + "The horizontal alignment is not specified. Do not use this.", + "The text is explicitly aligned to the left of the cell.", + "The text is explicitly aligned to the center of the cell.", + "The text is explicitly aligned to the right of the cell." + ], + "enum": [ + "HORIZONTAL_ALIGN_UNSPECIFIED", + "LEFT", + "CENTER", + "RIGHT" + ] } }, - "id": "ChartData" + "id": "TextPosition" }, - "BatchGetValuesResponse": { - "description": "The response when retrieving more than one range of values in a spreadsheet.", + "BatchUpdateSpreadsheetRequest": { "type": "object", "properties": { - "spreadsheetId": { - "description": "The ID of the spreadsheet the data was retrieved from.", - "type": "string" + "includeSpreadsheetInResponse": { + "description": "Determines if the update response should include the spreadsheet\nresource.", + "type": "boolean" }, - "valueRanges": { + "responseRanges": { + "description": "Limits the ranges included in the response spreadsheet.\nMeaningful only if include_spreadsheet_response is 'true'.", "type": "array", "items": { - "$ref": "ValueRange" + "type": "string" + } + }, + "responseIncludeGridData": { + "description": "True if grid data should be returned. Meaningful only if\nif include_spreadsheet_in_response is 'true'.\nThis parameter is ignored if a field mask was set in the request.", + "type": "boolean" + }, + "requests": { + "type": "array", + "items": { + "$ref": "Request" }, - "description": "The requested values. The order of the ValueRanges is the same as the\norder of the requested ranges." + "description": "A list of updates to apply to the spreadsheet.\nRequests will be applied in the order they are specified.\nIf any request is not valid, no requests will be applied." } }, - "id": "BatchGetValuesResponse" + "id": "BatchUpdateSpreadsheetRequest", + "description": "The request for updating any aspect of a spreadsheet." }, - "UpdateBandingRequest": { + "BasicChartAxis": { + "description": "An axis of the chart.\nA chart may not have more than one axis per\naxis position.", "type": "object", "properties": { - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `bandedRange` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", + "position": { + "enumDescriptions": [ + "Default value, do not use.", + "The axis rendered at the bottom of a chart.\nFor most charts, this is the standard major axis.\nFor bar charts, this is a minor axis.", + "The axis rendered at the left of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is the standard major axis.", + "The axis rendered at the right of a chart.\nFor most charts, this is a minor axis.\nFor bar charts, this is an unusual major axis." + ], + "enum": [ + "BASIC_CHART_AXIS_POSITION_UNSPECIFIED", + "BOTTOM_AXIS", + "LEFT_AXIS", + "RIGHT_AXIS" + ], + "description": "The position of this axis.", "type": "string" }, - "bandedRange": { - "$ref": "BandedRange", - "description": "The banded range to update with the new properties." + "title": { + "type": "string", + "description": "The title of this axis. If set, this overrides any title inferred\nfrom headers of the data." + }, + "titleTextPosition": { + "description": "The axis title text position.", + "$ref": "TextPosition" + }, + "format": { + "$ref": "TextFormat", + "description": "The format of the title.\nOnly valid if the axis is not associated with the domain." + }, + "viewWindowOptions": { + "$ref": "ChartAxisViewWindowOptions", + "description": "The view window options for this axis." } }, - "id": "UpdateBandingRequest", - "description": "Updates properties of the supplied banded range." + "id": "BasicChartAxis" }, - "Color": { - "description": "Represents a color in the RGBA color space. This representation is designed\nfor simplicity of conversion to/from color representations in various\nlanguages over compactness; for example, the fields of this representation\ncan be trivially provided to the constructor of \"java.awt.Color\" in Java; it\ncan also be trivially provided to UIColor's \"+colorWithRed:green:blue:alpha\"\nmethod in iOS; and, with just a little work, it can be easily formatted into\na CSS \"rgba()\" string in JavaScript, as well.\n\nNote: this proto does not carry information about the absolute color space\nthat should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,\nDCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color\nspace.\n\nExample (Java):\n\n import com.google.type.Color;\n\n // ...\n public static java.awt.Color fromProto(Color protocolor) {\n float alpha = protocolor.hasAlpha()\n ? protocolor.getAlpha().getValue()\n : 1.0;\n\n return new java.awt.Color(\n protocolor.getRed(),\n protocolor.getGreen(),\n protocolor.getBlue(),\n alpha);\n }\n\n public static Color toProto(java.awt.Color color) {\n float red = (float) color.getRed();\n float green = (float) color.getGreen();\n float blue = (float) color.getBlue();\n float denominator = 255.0;\n Color.Builder resultBuilder =\n Color\n .newBuilder()\n .setRed(red / denominator)\n .setGreen(green / denominator)\n .setBlue(blue / denominator);\n int alpha = color.getAlpha();\n if (alpha != 255) {\n result.setAlpha(\n FloatValue\n .newBuilder()\n .setValue(((float) alpha) / denominator)\n .build());\n }\n return resultBuilder.build();\n }\n // ...\n\nExample (iOS / Obj-C):\n\n // ...\n static UIColor* fromProto(Color* protocolor) {\n float red = [protocolor red];\n float green = [protocolor green];\n float blue = [protocolor blue];\n FloatValue* alpha_wrapper = [protocolor alpha];\n float alpha = 1.0;\n if (alpha_wrapper != nil) {\n alpha = [alpha_wrapper value];\n }\n return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];\n }\n\n static Color* toProto(UIColor* color) {\n CGFloat red, green, blue, alpha;\n if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {\n return nil;\n }\n Color* result = [[Color alloc] init];\n [result setRed:red];\n [result setGreen:green];\n [result setBlue:blue];\n if (alpha \u003c= 0.9999) {\n [result setAlpha:floatWrapperWithValue(alpha)];\n }\n [result autorelease];\n return result;\n }\n // ...\n\n Example (JavaScript):\n\n // ...\n\n var protoToCssColor = function(rgb_color) {\n var redFrac = rgb_color.red || 0.0;\n var greenFrac = rgb_color.green || 0.0;\n var blueFrac = rgb_color.blue || 0.0;\n var red = Math.floor(redFrac * 255);\n var green = Math.floor(greenFrac * 255);\n var blue = Math.floor(blueFrac * 255);\n\n if (!('alpha' in rgb_color)) {\n return rgbToCssColor_(red, green, blue);\n }\n\n var alphaFrac = rgb_color.alpha.value || 0.0;\n var rgbParams = [red, green, blue].join(',');\n return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');\n };\n\n var rgbToCssColor_ = function(red, green, blue) {\n var rgbNumber = new Number((red \u003c\u003c 16) | (green \u003c\u003c 8) | blue);\n var hexString = rgbNumber.toString(16);\n var missingZeros = 6 - hexString.length;\n var resultBuilder = ['#'];\n for (var i = 0; i \u003c missingZeros; i++) {\n resultBuilder.push('0');\n }\n resultBuilder.push(hexString);\n return resultBuilder.join('');\n };\n\n // ...", + "Padding": { + "description": "The amount of padding around the cell, in pixels.\nWhen updating padding, every field must be specified.", "type": "object", "properties": { - "red": { - "description": "The amount of red in the color as a value in the interval [0, 1].", - "format": "float", - "type": "number" + "top": { + "description": "The top padding of the cell.", + "format": "int32", + "type": "integer" }, - "green": { - "description": "The amount of green in the color as a value in the interval [0, 1].", - "format": "float", - "type": "number" + "left": { + "description": "The left padding of the cell.", + "format": "int32", + "type": "integer" }, - "blue": { - "type": "number", - "description": "The amount of blue in the color as a value in the interval [0, 1].", - "format": "float" + "right": { + "description": "The right padding of the cell.", + "format": "int32", + "type": "integer" }, - "alpha": { - "description": "The fraction of this color that should be applied to the pixel. That is,\nthe final pixel color is defined by the equation:\n\n pixel color = alpha * (this color) + (1.0 - alpha) * (background color)\n\nThis means that a value of 1.0 corresponds to a solid color, whereas\na value of 0.0 corresponds to a completely transparent color. This\nuses a wrapper message rather than a simple float scalar so that it is\npossible to distinguish between a default value and the value being unset.\nIf omitted, this color object is to be rendered as a solid color\n(as if the alpha value had been explicitly given with a value of 1.0).", - "format": "float", - "type": "number" + "bottom": { + "description": "The bottom padding of the cell.", + "format": "int32", + "type": "integer" } }, - "id": "Color" + "id": "Padding" }, - "TrimWhitespaceRequest": { - "description": "Trims the whitespace (such as spaces, tabs, or new lines) in every cell in\nthe specified range. This request removes all whitespace from the start and\nend of each cell's text, and reduces any subsequence of remaining whitespace\ncharacters to a single space. If the resulting trimmed text starts with a '+'\nor '=' character, the text remains as a string value and isn't interpreted\nas a formula.", + "DeleteDimensionRequest": { + "id": "DeleteDimensionRequest", + "description": "Deletes the dimensions from the sheet.", "type": "object", "properties": { "range": { - "$ref": "GridRange", - "description": "The range whose cells to trim." + "$ref": "DimensionRange", + "description": "The dimensions to delete from the sheet." + } + } + }, + "UpdateChartSpecRequest": { + "description": "Updates a chart's specifications.\n(This does not move or resize a chart. To move or resize a chart, use\n UpdateEmbeddedObjectPositionRequest.)", + "type": "object", + "properties": { + "chartId": { + "description": "The ID of the chart to update.", + "format": "int32", + "type": "integer" + }, + "spec": { + "$ref": "ChartSpec", + "description": "The specification to apply to the chart." } }, - "id": "TrimWhitespaceRequest" + "id": "UpdateChartSpecRequest" }, - "ChartSourceRange": { - "description": "Source ranges for a chart.", + "DeleteFilterViewRequest": { "type": "object", "properties": { - "sources": { - "description": "The ranges of data for a series or domain.\nExactly one dimension must have a length of 1,\nand all sources in the list must have the same dimension\nwith length 1.\nThe domain (if it exists) & all series must have the same number\nof source ranges. If using more than one source range, then the source\nrange at a given offset must be in order and contiguous across the domain\nand series.\n\nFor example, these are valid configurations:\n\n domain sources: A1:A5\n series1 sources: B1:B5\n series2 sources: D6:D10\n\n domain sources: A1:A5, C10:C12\n series1 sources: B1:B5, D10:D12\n series2 sources: C1:C5, E10:E12", - "type": "array", - "items": { - "$ref": "GridRange" - } + "filterId": { + "description": "The ID of the filter to delete.", + "format": "int32", + "type": "integer" } }, - "id": "ChartSourceRange" + "id": "DeleteFilterViewRequest", + "description": "Deletes a particular filter view." }, - "ValueRange": { - "description": "Data within a range of the spreadsheet.", + "BatchGetValuesByDataFilterRequest": { "type": "object", "properties": { - "range": { - "description": "The range the values cover, in A1 notation.\nFor output, this range indicates the entire requested range,\neven though the values will exclude trailing rows and columns.\nWhen appending values, this field represents the range to search for a\ntable, after which values will be appended.", - "type": "string" - }, "majorDimension": { + "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen a request that selects that range and sets `majorDimension=ROWS` will\nreturn `[[1,2],[3,4]]`,\nwhereas a request that sets `majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.", + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], "enum": [ "DIMENSION_UNSPECIFIED", "ROWS", "COLUMNS" + ] + }, + "dataFilters": { + "description": "The data filters used to match the ranges of values to retrieve. Ranges\nthat match any of the specified data filters will be included in the\nresponse.", + "type": "array", + "items": { + "$ref": "DataFilter" + } + }, + "valueRenderOption": { + "type": "string", + "enumDescriptions": [ + "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", + "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", + "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." + ], + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" ], - "description": "The major dimension of the values.\n\nFor output, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.\n\nFor input, with `range=A1:B2,majorDimension=ROWS` then `[[1,2],[3,4]]`\nwill set `A1=1,B1=2,A2=3,B2=4`. With `range=A1:B2,majorDimension=COLUMNS`\nthen `[[1,2],[3,4]]` will set `A1=1,B1=3,A2=2,B2=4`.\n\nWhen writing, if this field is not set, it defaults to ROWS.", + "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE." + }, + "dateTimeRenderOption": { "type": "string", "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ] + "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", + "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." + ], + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ], + "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER]." + } + }, + "id": "BatchGetValuesByDataFilterRequest", + "description": "The request for retrieving a range of values in a spreadsheet selected by a\nset of DataFilters." + }, + "BatchUpdateValuesResponse": { + "description": "The response when updating a range of values in a spreadsheet.", + "type": "object", + "properties": { + "totalUpdatedRows": { + "type": "integer", + "description": "The total number of rows where at least one cell in the row was updated.", + "format": "int32" }, - "values": { + "responses": { "type": "array", "items": { - "type": "array", - "items": { - "type": "any" - } + "$ref": "UpdateValuesResponse" }, - "description": "The data that was read or to be written. This is an array of arrays,\nthe outer array representing all the data and each inner array\nrepresenting a major dimension. Each item in the inner array\ncorresponds with one cell.\n\nFor output, empty trailing rows and columns will not be included.\n\nFor input, supported value types are: bool, string, and double.\nNull values will be skipped.\nTo set a cell to an empty value, set the string value to an empty string." + "description": "One UpdateValuesResponse per requested range, in the same order as\nthe requests appeared." + }, + "totalUpdatedSheets": { + "description": "The total number of sheets where at least one cell in the sheet was\nupdated.", + "format": "int32", + "type": "integer" + }, + "totalUpdatedCells": { + "type": "integer", + "description": "The total number of cells updated.", + "format": "int32" + }, + "totalUpdatedColumns": { + "description": "The total number of columns where at least one cell in the column was\nupdated.", + "format": "int32", + "type": "integer" + }, + "spreadsheetId": { + "type": "string", + "description": "The spreadsheet the updates were applied to." } }, - "id": "ValueRange" + "id": "BatchUpdateValuesResponse" }, - "AddBandingRequest": { - "description": "Adds a new banded range to the spreadsheet.", + "BatchClearValuesRequest": { + "id": "BatchClearValuesRequest", + "description": "The request for clearing more than one range of values in a spreadsheet.", "type": "object", "properties": { - "bandedRange": { - "$ref": "BandedRange", - "description": "The banded range to add. The bandedRangeId\nfield is optional; if one is not set, an id will be randomly generated. (It\nis an error to specify the ID of a range that already exists.)" + "ranges": { + "description": "The ranges to clear, in A1 notation.", + "type": "array", + "items": { + "type": "string" + } } - }, - "id": "AddBandingRequest" + } }, - "Response": { + "KeyValueFormat": { + "id": "KeyValueFormat", + "description": "Formatting options for key value.", "type": "object", "properties": { - "trimWhitespace": { - "description": "A reply from trimming whitespace.", - "$ref": "TrimWhitespaceResponse" - }, - "addFilterView": { - "description": "A reply from adding a filter view.", - "$ref": "AddFilterViewResponse" - }, - "deleteDuplicates": { - "$ref": "DeleteDuplicatesResponse", - "description": "A reply from removing rows containing duplicate values." - }, - "addBanding": { - "$ref": "AddBandingResponse", - "description": "A reply from adding a banded range." - }, - "addProtectedRange": { - "description": "A reply from adding a protected range.", - "$ref": "AddProtectedRangeResponse" - }, - "duplicateSheet": { - "$ref": "DuplicateSheetResponse", - "description": "A reply from duplicating a sheet." - }, - "addSlicer": { - "$ref": "AddSlicerResponse", - "description": "A reply from adding a slicer." - }, - "updateEmbeddedObjectPosition": { - "description": "A reply from updating an embedded object's position.", - "$ref": "UpdateEmbeddedObjectPositionResponse" - }, - "deleteConditionalFormatRule": { - "$ref": "DeleteConditionalFormatRuleResponse", - "description": "A reply from deleting a conditional format rule." - }, - "deleteDimensionGroup": { - "$ref": "DeleteDimensionGroupResponse", - "description": "A reply from deleting a dimension group." + "position": { + "$ref": "TextPosition", + "description": "Specifies the horizontal text positioning of key value.\nThis field is optional. If not specified, default positioning is used." }, - "duplicateFilterView": { - "$ref": "DuplicateFilterViewResponse", - "description": "A reply from duplicating a filter view." + "textFormat": { + "$ref": "TextFormat", + "description": "Text formatting options for key value." + } + } + }, + "DeveloperMetadata": { + "description": "Developer metadata associated with a location or object in a spreadsheet.\nDeveloper metadata may be used to associate arbitrary data with various\nparts of a spreadsheet and will remain associated at those locations as they\nmove around and the spreadsheet is edited. For example, if developer\nmetadata is associated with row 5 and another row is then subsequently\ninserted above row 5, that original metadata will still be associated with\nthe row it was first associated with (what is now row 6). If the associated\nobject is deleted its metadata is deleted too.", + "type": "object", + "properties": { + "metadataValue": { + "description": "Data associated with the metadata's key.", + "type": "string" }, - "addDimensionGroup": { - "$ref": "AddDimensionGroupResponse", - "description": "A reply from adding a dimension group." + "metadataKey": { + "description": "The metadata key. There may be multiple metadata in a spreadsheet with the\nsame key. Developer metadata must always have a key specified.", + "type": "string" }, - "addChart": { - "$ref": "AddChartResponse", - "description": "A reply from adding a chart." + "metadataId": { + "description": "The spreadsheet-scoped unique ID that identifies the metadata. IDs may be\nspecified when metadata is created, otherwise one will be randomly\ngenerated and assigned. Must be positive.", + "format": "int32", + "type": "integer" }, - "updateDeveloperMetadata": { - "$ref": "UpdateDeveloperMetadataResponse", - "description": "A reply from updating a developer metadata entry." + "location": { + "$ref": "DeveloperMetadataLocation", + "description": "The location where the metadata is associated." }, - "findReplace": { - "$ref": "FindReplaceResponse", - "description": "A reply from doing a find/replace." + "visibility": { + "type": "string", + "enumDescriptions": [ + "Default value.", + "Document-visible metadata is accessible from any developer project with\naccess to the document.", + "Project-visible metadata is only visible to and accessible by the developer\nproject that created the metadata." + ], + "enum": [ + "DEVELOPER_METADATA_VISIBILITY_UNSPECIFIED", + "DOCUMENT", + "PROJECT" + ], + "description": "The metadata visibility. Developer metadata must always have a visibility\nspecified." + } + }, + "id": "DeveloperMetadata" + }, + "BaselineValueFormat": { + "description": "Formatting options for baseline value.", + "type": "object", + "properties": { + "negativeColor": { + "description": "Color to be used, in case baseline value represents a negative change for\nkey value. This field is optional.", + "$ref": "Color" }, - "addSheet": { - "$ref": "AddSheetResponse", - "description": "A reply from adding a sheet." + "comparisonType": { + "enum": [ + "COMPARISON_TYPE_UNDEFINED", + "ABSOLUTE_DIFFERENCE", + "PERCENTAGE_DIFFERENCE" + ], + "description": "The comparison type of key value with baseline value.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "Use absolute difference between key and baseline value.", + "Use percentage difference between key and baseline value." + ] }, - "updateConditionalFormatRule": { - "$ref": "UpdateConditionalFormatRuleResponse", - "description": "A reply from updating a conditional format rule." + "position": { + "description": "Specifies the horizontal text positioning of baseline value.\nThis field is optional. If not specified, default positioning is used.", + "$ref": "TextPosition" }, - "createDeveloperMetadata": { - "$ref": "CreateDeveloperMetadataResponse", - "description": "A reply from creating a developer metadata entry." + "positiveColor": { + "$ref": "Color", + "description": "Color to be used, in case baseline value represents a positive change for\nkey value. This field is optional." }, - "addNamedRange": { - "description": "A reply from adding a named range.", - "$ref": "AddNamedRangeResponse" + "textFormat": { + "$ref": "TextFormat", + "description": "Text formatting options for baseline value." }, - "deleteDeveloperMetadata": { - "$ref": "DeleteDeveloperMetadataResponse", - "description": "A reply from deleting a developer metadata entry." + "description": { + "description": "Description which is appended after the baseline value.\nThis field is optional.", + "type": "string" } }, - "id": "Response", - "description": "A single response from an update." + "id": "BaselineValueFormat" }, - "InsertRangeRequest": { - "description": "Inserts cells into a range, shifting the existing cells over or down.", + "TextToColumnsRequest": { + "description": "Splits a column of text into multiple columns,\nbased on a delimiter in each cell.", "type": "object", "properties": { - "shiftDimension": { - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "Operates on the rows of a sheet.", - "Operates on the columns of a sheet." - ], + "source": { + "description": "The source data range. This must span exactly one column.", + "$ref": "GridRange" + }, + "delimiterType": { "enum": [ - "DIMENSION_UNSPECIFIED", - "ROWS", - "COLUMNS" + "DELIMITER_TYPE_UNSPECIFIED", + "COMMA", + "SEMICOLON", + "PERIOD", + "SPACE", + "CUSTOM", + "AUTODETECT" ], - "description": "The dimension which will be shifted when inserting cells.\nIf ROWS, existing cells will be shifted down.\nIf COLUMNS, existing cells will be shifted right." + "description": "The delimiter type to use.", + "type": "string", + "enumDescriptions": [ + "Default value. This value must not be used.", + "\",\"", + "\";\"", + "\".\"", + "\" \"", + "A custom value as defined in delimiter.", + "Automatically detect columns." + ] }, - "range": { - "$ref": "GridRange", - "description": "The range to insert new cells into." + "delimiter": { + "description": "The delimiter to use. Used only if delimiterType is\nCUSTOM.", + "type": "string" } }, - "id": "InsertRangeRequest" + "id": "TextToColumnsRequest" }, - "EmbeddedChart": { - "id": "EmbeddedChart", - "description": "A chart embedded in a sheet.", + "ClearBasicFilterRequest": { "type": "object", "properties": { - "position": { - "description": "The position of the chart.", - "$ref": "EmbeddedObjectPosition" - }, - "spec": { - "$ref": "ChartSpec", - "description": "The specification of the chart." - }, - "chartId": { - "description": "The ID of the chart.", + "sheetId": { + "description": "The sheet ID on which the basic filter should be cleared.", "format": "int32", "type": "integer" } - } - }, - "AddNamedRangeResponse": { - "type": "object", - "properties": { - "namedRange": { - "$ref": "NamedRange", - "description": "The named range to add." - } }, - "id": "AddNamedRangeResponse", - "description": "The result of adding a named range." + "id": "ClearBasicFilterRequest", + "description": "Clears the basic filter, if any exists on the sheet." }, - "AddSheetRequest": { + "DimensionGroup": { + "description": "A group over an interval of rows or columns on a sheet, which can contain or\nbe contained within other groups. A group can be collapsed or expanded as a\nunit on the sheet.", "type": "object", "properties": { - "properties": { - "$ref": "SheetProperties", - "description": "The properties the new sheet should have.\nAll properties are optional.\nThe sheetId field is optional; if one is not\nset, an id will be randomly generated. (It is an error to specify the ID\nof a sheet that already exists.)" + "collapsed": { + "description": "This field is true if this group is collapsed. A collapsed group remains\ncollapsed if an overlapping group at a shallower depth is expanded.\n\nA true value does not imply that all dimensions within the group are\nhidden, since a dimension's visibility can change independently from this\ngroup property. However, when this property is updated, all dimensions\nwithin it are set to hidden if this field is true, or set to visible if\nthis field is false.", + "type": "boolean" + }, + "range": { + "$ref": "DimensionRange", + "description": "The range over which this group exists." + }, + "depth": { + "type": "integer", + "description": "The depth of the group, representing how many groups have a range that\nwholly contains the range of this group.", + "format": "int32" } }, - "id": "AddSheetRequest", - "description": "Adds a new sheet.\nWhen a sheet is added at a given index,\nall subsequent sheets' indexes are incremented.\nTo add an object sheet, use AddChartRequest instead and specify\nEmbeddedObjectPosition.sheetId or\nEmbeddedObjectPosition.newSheet." + "id": "DimensionGroup" }, - "DeleteConditionalFormatRuleResponse": { - "description": "The result of deleting a conditional format rule.", + "DeleteBandingRequest": { + "description": "Removes the banded range with the given ID from the spreadsheet.", "type": "object", "properties": { - "rule": { - "$ref": "ConditionalFormatRule", - "description": "The rule that was deleted." + "bandedRangeId": { + "description": "The ID of the banded range to delete.", + "format": "int32", + "type": "integer" } }, - "id": "DeleteConditionalFormatRuleResponse" + "id": "DeleteBandingRequest" }, - "AddSlicerRequest": { - "description": "Adds a slicer to a sheet in the spreadsheet.", + "AppendValuesResponse": { "type": "object", "properties": { - "slicer": { - "$ref": "Slicer", - "description": "The slicer that should be added to the spreadsheet, including\nthe position where it should be placed. The slicerId field is optional; if one is not set, an id\nwill be randomly generated. (It is an error to specify the ID\nof a slicer that already exists.)" + "spreadsheetId": { + "type": "string", + "description": "The spreadsheet the updates were applied to." + }, + "updates": { + "description": "Information about the updates that were applied.", + "$ref": "UpdateValuesResponse" + }, + "tableRange": { + "description": "The range (in A1 notation) of the table that values are being appended to\n(before the values were appended).\nEmpty if no table was found.", + "type": "string" } }, - "id": "AddSlicerRequest" + "id": "AppendValuesResponse", + "description": "The response when updating a range of values in a spreadsheet." }, - "GridCoordinate": { + "MoveDimensionRequest": { + "id": "MoveDimensionRequest", + "description": "Moves one or more rows or columns.", "type": "object", "properties": { - "sheetId": { - "description": "The sheet this coordinate is on.", - "format": "int32", - "type": "integer" - }, - "rowIndex": { - "description": "The row index of the coordinate.", - "format": "int32", - "type": "integer" + "source": { + "$ref": "DimensionRange", + "description": "The source dimensions to move." }, - "columnIndex": { - "description": "The column index of the coordinate.", + "destinationIndex": { + "description": "The zero-based start index of where to move the source data to,\nbased on the coordinates *before* the source data is removed\nfrom the grid. Existing data will be shifted down or right\n(depending on the dimension) to make room for the moved dimensions.\nThe source dimensions are removed from the grid, so the\nthe data may end up in a different index than specified.\n\nFor example, given `A1..A5` of `0, 1, 2, 3, 4` and wanting to move\n`\"1\"` and `\"2\"` to between `\"3\"` and `\"4\"`, the source would be\n`ROWS [1..3)`,and the destination index would be `\"4\"`\n(the zero-based index of row 5).\nThe end result would be `A1..A5` of `0, 3, 1, 2, 4`.", "format": "int32", "type": "integer" } - }, - "id": "GridCoordinate", - "description": "A coordinate in a sheet.\nAll indexes are zero-based." + } }, - "UpdateSheetPropertiesRequest": { - "description": "Updates properties of the sheet with the specified\nsheetId.", + "PivotFilterCriteria": { + "description": "Criteria for showing/hiding rows in a pivot table.", "type": "object", "properties": { - "properties": { - "description": "The properties to update.", - "$ref": "SheetProperties" - }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `properties` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" + "visibleValues": { + "description": "Values that should be included. Values not listed here are excluded.", + "type": "array", + "items": { + "type": "string" + } } }, - "id": "UpdateSheetPropertiesRequest" + "id": "PivotFilterCriteria" }, - "GridProperties": { - "description": "Properties of a grid.", + "AddConditionalFormatRuleRequest": { "type": "object", "properties": { - "frozenRowCount": { - "description": "The number of rows that are frozen in the grid.", - "format": "int32", - "type": "integer" - }, - "frozenColumnCount": { - "description": "The number of columns that are frozen in the grid.", - "format": "int32", - "type": "integer" + "rule": { + "$ref": "ConditionalFormatRule", + "description": "The rule to add." }, - "columnCount": { - "description": "The number of columns in the grid.", + "index": { + "description": "The zero-based index where the rule should be inserted.", "format": "int32", "type": "integer" - }, - "columnGroupControlAfter": { - "description": "True if the column grouping control toggle is shown after the group.", - "type": "boolean" - }, - "rowGroupControlAfter": { - "description": "True if the row grouping control toggle is shown after the group.", - "type": "boolean" - }, - "rowCount": { - "type": "integer", - "description": "The number of rows in the grid.", - "format": "int32" - }, - "hideGridlines": { - "description": "True if the grid isn't showing gridlines in the UI.", - "type": "boolean" } }, - "id": "GridProperties" + "id": "AddConditionalFormatRuleRequest", + "description": "Adds a new conditional format rule at the given index.\nAll subsequent rules' indexes are incremented." }, - "AddSlicerResponse": { - "description": "The result of adding a slicer to a spreadsheet.", + "CreateDeveloperMetadataRequest": { "type": "object", "properties": { - "slicer": { - "$ref": "Slicer", - "description": "The newly added slicer." + "developerMetadata": { + "$ref": "DeveloperMetadata", + "description": "The developer metadata to create." } }, - "id": "AddSlicerResponse" + "id": "CreateDeveloperMetadataRequest", + "description": "A request to create developer metadata." }, - "Sheet": { - "id": "Sheet", - "description": "A sheet in a spreadsheet.", + "ChartSpec": { + "description": "The specifications of a chart.", "type": "object", "properties": { - "developerMetadata": { - "description": "The developer metadata associated with a sheet.", - "type": "array", - "items": { - "$ref": "DeveloperMetadata" - } + "subtitleTextFormat": { + "$ref": "TextFormat", + "description": "The subtitle text format.\nStrikethrough and underline are not supported." }, - "protectedRanges": { - "description": "The protected ranges in this sheet.", - "type": "array", - "items": { - "$ref": "ProtectedRange" - } + "subtitle": { + "description": "The subtitle of the chart.", + "type": "string" }, - "conditionalFormats": { - "description": "The conditional format rules in this sheet.", - "type": "array", - "items": { - "$ref": "ConditionalFormatRule" - } + "backgroundColor": { + "$ref": "Color", + "description": "The background color of the entire chart.\nNot applicable to Org charts." }, - "columnGroups": { - "type": "array", - "items": { - "$ref": "DimensionGroup" - }, - "description": "All column groups on this sheet, ordered by increasing range start index,\nthen by group depth." + "subtitleTextPosition": { + "$ref": "TextPosition", + "description": "The subtitle text position.\nThis field is optional." }, - "basicFilter": { - "$ref": "BasicFilter", - "description": "The filter on this sheet, if any." + "basicChart": { + "$ref": "BasicChartSpec", + "description": "A basic chart specification, can be one of many kinds of charts.\nSee BasicChartType for the list of all\ncharts this supports." }, - "merges": { - "description": "The ranges that are merged together.", - "type": "array", - "items": { - "$ref": "GridRange" - } + "orgChart": { + "$ref": "OrgChartSpec", + "description": "An org chart specification." }, - "bandedRanges": { - "description": "The banded (alternating colors) ranges on this sheet.", - "type": "array", - "items": { - "$ref": "BandedRange" - } + "scorecardChart": { + "$ref": "ScorecardChartSpec", + "description": "A scorecard chart specification." }, - "charts": { - "description": "The specifications of every chart on this sheet.", - "type": "array", - "items": { - "$ref": "EmbeddedChart" - } + "pieChart": { + "$ref": "PieChartSpec", + "description": "A pie chart specification." }, - "filterViews": { - "description": "The filter views in this sheet.", - "type": "array", - "items": { - "$ref": "FilterView" - } + "titleTextFormat": { + "$ref": "TextFormat", + "description": "The title text format.\nStrikethrough and underline are not supported." }, - "slicers": { - "description": "The slicers on this sheet.", - "type": "array", - "items": { - "$ref": "Slicer" - } + "title": { + "description": "The title of the chart.", + "type": "string" }, - "rowGroups": { - "description": "All row groups on this sheet, ordered by increasing range start index, then\nby group depth.", - "type": "array", - "items": { - "$ref": "DimensionGroup" - } + "altText": { + "description": "The alternative text that describes the chart. This is often used\nfor accessibility.", + "type": "string" }, - "data": { - "description": "Data in the grid, if this is a grid sheet.\nThe number of GridData objects returned is dependent on the number of\nranges requested on this sheet. For example, if this is representing\n`Sheet1`, and the spreadsheet was requested with ranges\n`Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a\nstartRow/startColumn of `0`,\nwhile the second one will have `startRow 14` (zero-based row 15),\nand `startColumn 3` (zero-based column D).", + "titleTextPosition": { + "$ref": "TextPosition", + "description": "The title text position.\nThis field is optional." + }, + "histogramChart": { + "$ref": "HistogramChartSpec", + "description": "A histogram chart specification." + }, + "candlestickChart": { + "description": "A candlestick chart specification.", + "$ref": "CandlestickChartSpec" + }, + "bubbleChart": { + "$ref": "BubbleChartSpec", + "description": "A bubble chart specification." + }, + "waterfallChart": { + "$ref": "WaterfallChartSpec", + "description": "A waterfall chart specification." + }, + "fontName": { + "description": "The name of the font to use by default for all chart text (e.g. title,\naxis labels, legend). If a font is specified for a specific part of the\nchart it will override this font name.", + "type": "string" + }, + "treemapChart": { + "$ref": "TreemapChartSpec", + "description": "A treemap chart specification." + }, + "maximized": { + "description": "True to make a chart fill the entire space in which it's rendered with\nminimum padding. False to use the default padding.\n(Not applicable to Geo and Org charts.)", + "type": "boolean" + }, + "hiddenDimensionStrategy": { + "description": "Determines how the charts will use hidden rows or columns.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "Charts will skip hidden rows and columns.", + "Charts will skip hidden rows only.", + "Charts will skip hidden columns only.", + "Charts will not skip any hidden rows or columns." + ], + "enum": [ + "CHART_HIDDEN_DIMENSION_STRATEGY_UNSPECIFIED", + "SKIP_HIDDEN_ROWS_AND_COLUMNS", + "SKIP_HIDDEN_ROWS", + "SKIP_HIDDEN_COLUMNS", + "SHOW_ALL" + ] + } + }, + "id": "ChartSpec" + }, + "BatchGetValuesByDataFilterResponse": { + "description": "The response when retrieving more than one range of values in a spreadsheet\nselected by DataFilters.", + "type": "object", + "properties": { + "spreadsheetId": { + "description": "The ID of the spreadsheet the data was retrieved from.", + "type": "string" + }, + "valueRanges": { + "description": "The requested values with the list of data filters that matched them.", "type": "array", "items": { - "$ref": "GridData" + "$ref": "MatchedValueRange" } + } + }, + "id": "BatchGetValuesByDataFilterResponse" + }, + "LineStyle": { + "id": "LineStyle", + "description": "Properties that describe the style of a line.", + "type": "object", + "properties": { + "type": { + "enum": [ + "LINE_DASH_TYPE_UNSPECIFIED", + "INVISIBLE", + "CUSTOM", + "SOLID", + "DOTTED", + "MEDIUM_DASHED", + "MEDIUM_DASHED_DOTTED", + "LONG_DASHED", + "LONG_DASHED_DOTTED" + ], + "description": "The dash type of the line.", + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "No dash type, which is equivalent to a non-visible line.", + "A custom dash for a line. Modifying the exact custom dash style is\ncurrently unsupported.", + "A solid line.", + "A dotted line.", + "A dashed line where the dashes have \"medium\" length.", + "A line that alternates between a \"medium\" dash and a dot.", + "A dashed line where the dashes have \"long\" length.", + "A line that alternates between a \"long\" dash and a dot." + ] }, - "properties": { - "description": "The properties of the sheet.", - "$ref": "SheetProperties" + "width": { + "description": "The thickness of the line, in px.", + "format": "int32", + "type": "integer" } } }, - "PivotGroupValueMetadata": { + "CandlestickDomain": { "type": "object", "properties": { - "value": { - "description": "The calculated value the metadata corresponds to.\n(Note that formulaValue is not valid,\n because the values will be calculated.)", - "$ref": "ExtendedValue" - }, - "collapsed": { - "description": "True if the data corresponding to the value is collapsed.", + "reversed": { + "description": "True to reverse the order of the domain values (horizontal axis).", "type": "boolean" + }, + "data": { + "$ref": "ChartData", + "description": "The data of the CandlestickDomain." } }, - "id": "PivotGroupValueMetadata", - "description": "Metadata about a value in a pivot grouping." + "id": "CandlestickDomain", + "description": "The domain of a CandlestickChart." }, - "FilterCriteria": { - "description": "Criteria for showing/hiding rows in a filter or filter view.", + "SheetProperties": { + "description": "Properties of a sheet.", "type": "object", "properties": { - "visibleForegroundColor": { - "description": "The text color to filter by; only cells with this text color are shown.\nMutually exclusive with all other filter criteria. Requests to set this\nfield will fail with a 400 error if any other filter criteria field is set.", + "title": { + "description": "The name of the sheet.", + "type": "string" + }, + "index": { + "description": "The index of the sheet within the spreadsheet.\nWhen adding or updating sheet properties, if this field\nis excluded then the sheet is added or moved to the end\nof the sheet list. When updating sheet indices or inserting\nsheets, movement is considered in \"before the move\" indexes.\nFor example, if there were 3 sheets (S1, S2, S3) in order to\nmove S1 ahead of S2 the index would have to be set to 2. A sheet\nindex update request is ignored if the requested index is\nidentical to the sheets current index or if the requested new\nindex is equal to the current sheet index + 1.", + "format": "int32", + "type": "integer" + }, + "tabColor": { + "description": "The color of the tab in the UI.", "$ref": "Color" }, - "hiddenValues": { - "description": "Values that should be hidden.", - "type": "array", - "items": { - "type": "string" - } + "sheetId": { + "type": "integer", + "description": "The ID of the sheet. Must be non-negative.\nThis field cannot be changed once set.", + "format": "int32" }, - "condition": { - "$ref": "BooleanCondition", - "description": "A condition that must be true for values to be shown.\n(This does not override hidden_values -- if a value is listed there,\n it will still be hidden.)" + "rightToLeft": { + "type": "boolean", + "description": "True if the sheet is an RTL sheet instead of an LTR sheet." }, - "visibleBackgroundColor": { - "$ref": "Color", - "description": "The background fill color to filter by; only cells with this fill color are\nshown. Mutually exclusive with all other filter criteria. Requests to set\nthis field will fail with a 400 error if any other filter criteria field is\nset." - } - }, - "id": "FilterCriteria" - }, - "Editors": { - "type": "object", - "properties": { - "groups": { - "description": "The email addresses of groups with edit access to the protected range.", - "type": "array", - "items": { - "type": "string" - } + "hidden": { + "type": "boolean", + "description": "True if the sheet is hidden in the UI, false if it's visible." }, - "domainUsersCanEdit": { - "description": "True if anyone in the document's domain has edit access to the protected\nrange. Domain protection is only supported on documents within a domain.", - "type": "boolean" + "sheetType": { + "type": "string", + "enumDescriptions": [ + "Default value, do not use.", + "The sheet is a grid.", + "The sheet has no grid and instead has an object like a chart or image." + ], + "enum": [ + "SHEET_TYPE_UNSPECIFIED", + "GRID", + "OBJECT" + ], + "description": "The type of sheet. Defaults to GRID.\nThis field cannot be changed once set." }, - "users": { - "description": "The email addresses of users with edit access to the protected range.", - "type": "array", - "items": { - "type": "string" - } + "gridProperties": { + "description": "Additional properties of the sheet if this sheet is a grid.\n(If the sheet is an object sheet, containing a chart or image, then\nthis field will be absent.)\nWhen writing it is an error to set any grid properties on non-grid sheets.", + "$ref": "GridProperties" } }, - "id": "Editors", - "description": "The editors of a protected range." + "id": "SheetProperties" }, - "DataValidationRule": { - "description": "A data validation rule.", + "UpdateDimensionPropertiesRequest": { "type": "object", "properties": { - "showCustomUi": { - "description": "True if the UI should be customized based on the kind of condition.\nIf true, \"List\" conditions will show a dropdown.", - "type": "boolean" - }, - "strict": { - "description": "True if invalid data should be rejected.", - "type": "boolean" + "range": { + "description": "The rows or columns to update.", + "$ref": "DimensionRange" }, - "inputMessage": { + "fields": { "type": "string", - "description": "A message to show the user when adding data to the cell." + "description": "The fields that should be updated. At least one field must be specified.\nThe root `properties` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", + "format": "google-fieldmask" }, - "condition": { - "$ref": "BooleanCondition", - "description": "The condition that data in the cell must match." + "properties": { + "$ref": "DimensionProperties", + "description": "Properties to update." } }, - "id": "DataValidationRule" + "id": "UpdateDimensionPropertiesRequest", + "description": "Updates properties of dimensions within the specified range." }, - "TextRotation": { - "description": "The rotation applied to text in a cell.", + "SourceAndDestination": { + "description": "A combination of a source range and how to extend that source.", "type": "object", "properties": { - "angle": { - "description": "The angle between the standard orientation and the desired orientation.\nMeasured in degrees. Valid values are between -90 and 90. Positive\nangles are angled upwards, negative are angled downwards.\n\nNote: For LTR text direction positive angles are in the\ncounterclockwise direction, whereas for RTL they are in the clockwise\ndirection", + "dimension": { + "description": "The dimension that data should be filled into.", + "type": "string", + "enumDescriptions": [ + "The default value, do not use.", + "Operates on the rows of a sheet.", + "Operates on the columns of a sheet." + ], + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ] + }, + "fillLength": { + "description": "The number of rows or columns that data should be filled into.\nPositive numbers expand beyond the last row or last column\nof the source. Negative numbers expand before the first row\nor first column of the source.", "format": "int32", "type": "integer" }, - "vertical": { - "description": "If true, text reads top to bottom, but the orientation of individual\ncharacters is unchanged.\nFor example:\n\n | V |\n | e |\n | r |\n | t |\n | i |\n | c |\n | a |\n | l |", - "type": "boolean" + "source": { + "$ref": "GridRange", + "description": "The location of the data to use as the source of the autofill." } }, - "id": "TextRotation" + "id": "SourceAndDestination" }, - "DeleteDimensionGroupResponse": { - "description": "The result of deleting a group.", + "SlicerSpec": { + "id": "SlicerSpec", + "description": "The specifications of a slicer.", "type": "object", "properties": { - "dimensionGroups": { - "type": "array", - "items": { - "$ref": "DimensionGroup" - }, - "description": "All groups of a dimension after deleting a group from that dimension." + "backgroundColor": { + "$ref": "Color", + "description": "The background color of the slicer." + }, + "filterCriteria": { + "$ref": "FilterCriteria", + "description": "The filtering criteria of the slicer." + }, + "dataRange": { + "$ref": "GridRange", + "description": "The data range of the slicer." + }, + "applyToPivotTables": { + "description": "True if the filter should apply to pivot tables.\nIf not set, default to `True`.", + "type": "boolean" + }, + "columnIndex": { + "description": "The column index in the data table on which the filter is applied to.", + "format": "int32", + "type": "integer" + }, + "title": { + "description": "The title of the slicer.", + "type": "string" + }, + "horizontalAlignment": { + "enum": [ + "HORIZONTAL_ALIGN_UNSPECIFIED", + "LEFT", + "CENTER", + "RIGHT" + ], + "description": "The horizontal alignment of title in the slicer.\nIf unspecified, defaults to `LEFT`", + "type": "string", + "enumDescriptions": [ + "The horizontal alignment is not specified. Do not use this.", + "The text is explicitly aligned to the left of the cell.", + "The text is explicitly aligned to the center of the cell.", + "The text is explicitly aligned to the right of the cell." + ] + }, + "textFormat": { + "$ref": "TextFormat", + "description": "The text format of title in the slicer." } - }, - "id": "DeleteDimensionGroupResponse" + } }, - "UpdateDeveloperMetadataRequest": { + "CandlestickSeries": { "type": "object", "properties": { - "dataFilters": { - "type": "array", - "items": { - "$ref": "DataFilter" - }, - "description": "The filters matching the developer metadata entries to update." - }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `developerMetadata` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" - }, - "developerMetadata": { - "description": "The value that all metadata matched by the data filters will be updated to.", - "$ref": "DeveloperMetadata" + "data": { + "$ref": "ChartData", + "description": "The data of the CandlestickSeries." } }, - "id": "UpdateDeveloperMetadataRequest", - "description": "A request to update properties of developer metadata.\nUpdates the properties of the developer metadata selected by the filters to\nthe values provided in the DeveloperMetadata resource. Callers must\nspecify the properties they wish to update in the fields parameter, as well\nas specify at least one DataFilter matching the metadata they wish to\nupdate." + "id": "CandlestickSeries", + "description": "The series of a CandlestickData." }, - "PieChartSpec": { - "description": "A \u003ca href=\"/chart/interactive/docs/gallery/piechart\"\u003epie chart\u003c/a\u003e.", + "HistogramChartSpec": { "type": "object", "properties": { - "domain": { - "$ref": "ChartData", - "description": "The data that covers the domain of the pie chart." + "bucketSize": { + "type": "number", + "description": "By default the bucket size (the range of values stacked in a single\ncolumn) is chosen automatically, but it may be overridden here.\nE.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc.\nCannot be negative.\nThis field is optional.", + "format": "double" }, - "threeDimensional": { - "type": "boolean", - "description": "True if the pie is three dimensional." + "outlierPercentile": { + "description": "The outlier percentile is used to ensure that outliers do not adversely\naffect the calculation of bucket sizes. For example, setting an outlier\npercentile of 0.05 indicates that the top and bottom 5% of values when\ncalculating buckets. The values are still included in the chart, they will\nbe added to the first or last buckets instead of their own buckets.\nMust be between 0.0 and 0.5.", + "format": "double", + "type": "number" + }, + "showItemDividers": { + "description": "Whether horizontal divider lines should be displayed between items in each\ncolumn.", + "type": "boolean" }, "series": { - "$ref": "ChartData", - "description": "The data that covers the one and only series of the pie chart." + "type": "array", + "items": { + "$ref": "HistogramSeries" + }, + "description": "The series for a histogram may be either a single series of values to be\nbucketed or multiple series, each of the same length, containing the name\nof the series followed by the values to be bucketed for that series." }, "legendPosition": { - "description": "Where the legend of the pie chart should be drawn.", "type": "string", "enumDescriptions": [ "Default value, do not use.", @@ -5846,535 +5415,966 @@ "The legend is rendered on the right of the chart.", "The legend is rendered on the top of the chart.", "No legend is rendered.", - "Each pie slice has a label attached to it." + "The legend is rendered inside the chart area." ], "enum": [ - "PIE_CHART_LEGEND_POSITION_UNSPECIFIED", + "HISTOGRAM_CHART_LEGEND_POSITION_UNSPECIFIED", "BOTTOM_LEGEND", "LEFT_LEGEND", "RIGHT_LEGEND", "TOP_LEGEND", "NO_LEGEND", - "LABELED_LEGEND" - ] - }, - "pieHole": { - "description": "The size of the hole in the pie chart.", - "format": "double", - "type": "number" + "INSIDE_LEGEND" + ], + "description": "The position of the chart legend." } }, - "id": "PieChartSpec" + "id": "HistogramChartSpec", + "description": "A \u003ca href=\"/chart/interactive/docs/gallery/histogram\"\u003ehistogram chart\u003c/a\u003e.\nA histogram chart groups data items into bins, displaying each bin as a\ncolumn of stacked items. Histograms are used to display the distribution\nof a dataset. Each column of items represents a range into which those\nitems fall. The number of bins can be chosen automatically or specified\nexplicitly." }, - "UpdateSlicerSpecRequest": { - "id": "UpdateSlicerSpecRequest", - "description": "Updates a slicer’s specifications.\n(This does not move or resize a slicer. To move or resize a slicer use\nUpdateEmbeddedObjectPositionRequest.", + "UpdateValuesResponse": { "type": "object", "properties": { - "spec": { - "$ref": "SlicerSpec", - "description": "The specification to apply to the slicer." + "updatedColumns": { + "type": "integer", + "description": "The number of columns where at least one cell in the column was updated.", + "format": "int32" }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `SlicerSpec` is implied and should not be specified. A single \"*\"`\ncan be used as short-hand for listing every field.", - "format": "google-fieldmask", + "spreadsheetId": { + "type": "string", + "description": "The spreadsheet the updates were applied to." + }, + "updatedRange": { + "description": "The range (in A1 notation) that updates were applied to.", "type": "string" }, - "slicerId": { - "description": "The id of the slicer to update.", + "updatedCells": { + "type": "integer", + "description": "The number of cells updated.", + "format": "int32" + }, + "updatedRows": { + "description": "The number of rows where at least one cell in the row was updated.", "format": "int32", "type": "integer" + }, + "updatedData": { + "description": "The values of the cells after updates were applied.\nThis is only included if the request's `includeValuesInResponse` field\nwas `true`.", + "$ref": "ValueRange" } - } + }, + "id": "UpdateValuesResponse", + "description": "The response when updating a range of values in a spreadsheet." }, - "UpdateFilterViewRequest": { + "WaterfallChartSeries": { + "description": "A single series of data for a waterfall chart.", "type": "object", "properties": { - "filter": { - "$ref": "FilterView", - "description": "The new properties of the filter view." + "subtotalColumnsStyle": { + "$ref": "WaterfallChartColumnStyle", + "description": "Styles for all subtotal columns in this series." }, - "fields": { - "description": "The fields that should be updated. At least one field must be specified.\nThe root `filter` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask", - "type": "string" + "positiveColumnsStyle": { + "$ref": "WaterfallChartColumnStyle", + "description": "Styles for all columns in this series with positive values." + }, + "data": { + "$ref": "ChartData", + "description": "The data being visualized in this series." + }, + "negativeColumnsStyle": { + "$ref": "WaterfallChartColumnStyle", + "description": "Styles for all columns in this series with negative values." + }, + "hideTrailingSubtotal": { + "description": "True to hide the subtotal column from the end of the series. By default,\na subtotal column will appear at the end of each series. Setting this\nfield to true will hide that subtotal column for this series.", + "type": "boolean" + }, + "customSubtotals": { + "description": "Custom subtotal columns appearing in this series. The order in which\nsubtotals are defined is not significant. Only one subtotal may be\ndefined for each data point.", + "type": "array", + "items": { + "$ref": "WaterfallChartCustomSubtotal" + } } }, - "id": "UpdateFilterViewRequest", - "description": "Updates properties of the filter view." + "id": "WaterfallChartSeries" }, - "ConditionalFormatRule": { - "description": "A rule describing a conditional format.", + "PivotGroupSortValueBucket": { + "id": "PivotGroupSortValueBucket", + "description": "Information about which values in a pivot group should be used for sorting.", "type": "object", "properties": { - "ranges": { - "description": "The ranges that are formatted if the condition is true.\nAll the ranges must be on the same grid.", + "valuesIndex": { + "type": "integer", + "description": "The offset in the PivotTable.values list which the values in this\ngrouping should be sorted by.", + "format": "int32" + }, + "buckets": { "type": "array", "items": { - "$ref": "GridRange" - } - }, - "gradientRule": { - "description": "The formatting will vary based on the gradients in the rule.", - "$ref": "GradientRule" - }, - "booleanRule": { - "$ref": "BooleanRule", - "description": "The formatting is either \"on\" or \"off\" according to the rule." + "$ref": "ExtendedValue" + }, + "description": "Determines the bucket from which values are chosen to sort.\n\nFor example, in a pivot table with one row group & two column groups,\nthe row group can list up to two values. The first value corresponds\nto a value within the first column group, and the second value\ncorresponds to a value in the second column group. If no values\nare listed, this would indicate that the row should be sorted according\nto the \"Grand Total\" over the column groups. If a single value is listed,\nthis would correspond to using the \"Total\" of that bucket." + } + } + }, + "DeleteDeveloperMetadataRequest": { + "description": "A request to delete developer metadata.", + "type": "object", + "properties": { + "dataFilter": { + "description": "The data filter describing the criteria used to select which developer\nmetadata entry to delete.", + "$ref": "DataFilter" } }, - "id": "ConditionalFormatRule" + "id": "DeleteDeveloperMetadataRequest" }, - "CopyPasteRequest": { - "description": "Copies data from the source to the destination.", + "CandlestickData": { + "description": "The Candlestick chart data, each containing the low, open, close, and high\nvalues for a series.", "type": "object", "properties": { - "source": { - "$ref": "GridRange", - "description": "The source range to copy." + "highSeries": { + "description": "The range data (vertical axis) for the high/maximum value for each\ncandle. This is the top of the candle's center line.", + "$ref": "CandlestickSeries" }, - "pasteType": { - "enum": [ - "PASTE_NORMAL", - "PASTE_VALUES", - "PASTE_FORMAT", - "PASTE_NO_BORDERS", - "PASTE_FORMULA", - "PASTE_DATA_VALIDATION", - "PASTE_CONDITIONAL_FORMATTING" - ], - "description": "What kind of data to paste.", - "type": "string", - "enumDescriptions": [ - "Paste values, formulas, formats, and merges.", - "Paste the values ONLY without formats, formulas, or merges.", - "Paste the format and data validation only.", - "Like PASTE_NORMAL but without borders.", - "Paste the formulas only.", - "Paste the data validation only.", - "Paste the conditional formatting rules only." - ] + "lowSeries": { + "description": "The range data (vertical axis) for the low/minimum value for each candle.\nThis is the bottom of the candle's center line.", + "$ref": "CandlestickSeries" }, - "destination": { - "$ref": "GridRange", - "description": "The location to paste to. If the range covers a span that's\na multiple of the source's height or width, then the\ndata will be repeated to fill in the destination range.\nIf the range is smaller than the source range, the entire\nsource data will still be copied (beyond the end of the destination range)." + "closeSeries": { + "$ref": "CandlestickSeries", + "description": "The range data (vertical axis) for the close/final value for each candle.\nThis is the top of the candle body. If greater than the open value the\ncandle will be filled. Otherwise the candle will be hollow." }, - "pasteOrientation": { - "description": "How that data should be oriented when pasting.", - "type": "string", - "enumDescriptions": [ - "Paste normally.", - "Paste transposed, where all rows become columns and vice versa." - ], - "enum": [ - "NORMAL", - "TRANSPOSE" - ] + "openSeries": { + "description": "The range data (vertical axis) for the open/initial value for each\ncandle. This is the bottom of the candle body. If less than the close\nvalue the candle will be filled. Otherwise the candle will be hollow.", + "$ref": "CandlestickSeries" } }, - "id": "CopyPasteRequest" + "id": "CandlestickData" }, - "BooleanCondition": { + "DeleteProtectedRangeRequest": { + "description": "Deletes the protected range with the given ID.", "type": "object", "properties": { - "type": { - "enum": [ - "CONDITION_TYPE_UNSPECIFIED", - "NUMBER_GREATER", - "NUMBER_GREATER_THAN_EQ", - "NUMBER_LESS", - "NUMBER_LESS_THAN_EQ", - "NUMBER_EQ", - "NUMBER_NOT_EQ", - "NUMBER_BETWEEN", - "NUMBER_NOT_BETWEEN", - "TEXT_CONTAINS", - "TEXT_NOT_CONTAINS", - "TEXT_STARTS_WITH", - "TEXT_ENDS_WITH", - "TEXT_EQ", - "TEXT_IS_EMAIL", - "TEXT_IS_URL", - "DATE_EQ", - "DATE_BEFORE", - "DATE_AFTER", - "DATE_ON_OR_BEFORE", - "DATE_ON_OR_AFTER", - "DATE_BETWEEN", - "DATE_NOT_BETWEEN", - "DATE_IS_VALID", - "ONE_OF_RANGE", - "ONE_OF_LIST", - "BLANK", - "NOT_BLANK", - "CUSTOM_FORMULA", - "BOOLEAN" - ], - "description": "The type of condition.", - "type": "string", - "enumDescriptions": [ - "The default value, do not use.", - "The cell's value must be greater than the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be greater than or equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be less than the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be less than or equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be not equal to the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be between the two condition values.\nSupported by data validation, conditional formatting and filters.\nRequires exactly two ConditionValues.", - "The cell's value must not be between the two condition values.\nSupported by data validation, conditional formatting and filters.\nRequires exactly two ConditionValues.", - "The cell's value must contain the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must not contain the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must start with the condition's value.\nSupported by conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must end with the condition's value.\nSupported by conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be exactly the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be a valid email address.\nSupported by data validation.\nRequires no ConditionValues.", - "The cell's value must be a valid URL.\nSupported by data validation.\nRequires no ConditionValues.", - "The cell's value must be the same date as the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be before the date of the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue\nthat may be a relative date.", - "The cell's value must be after the date of the condition's value.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue\nthat may be a relative date.", - "The cell's value must be on or before the date of the condition's value.\nSupported by data validation.\nRequires a single ConditionValue\nthat may be a relative date.", - "The cell's value must be on or after the date of the condition's value.\nSupported by data validation.\nRequires a single ConditionValue\nthat may be a relative date.", - "The cell's value must be between the dates of the two condition values.\nSupported by data validation.\nRequires exactly two ConditionValues.", - "The cell's value must be outside the dates of the two condition values.\nSupported by data validation.\nRequires exactly two ConditionValues.", - "The cell's value must be a date.\nSupported by data validation.\nRequires no ConditionValues.", - "The cell's value must be listed in the grid in condition value's range.\nSupported by data validation.\nRequires a single ConditionValue,\nand the value must be a valid range in A1 notation.", - "The cell's value must be in the list of condition values.\nSupported by data validation.\nSupports any number of condition values,\none per item in the list.\nFormulas are not supported in the values.", - "The cell's value must be empty.\nSupported by conditional formatting and filters.\nRequires no ConditionValues.", - "The cell's value must not be empty.\nSupported by conditional formatting and filters.\nRequires no ConditionValues.", - "The condition's formula must evaluate to true.\nSupported by data validation, conditional formatting and filters.\nRequires a single ConditionValue.", - "The cell's value must be TRUE/FALSE or in the list of condition values.\nSupported by data validation.\nRenders as a cell checkbox.\nSupports zero, one or two ConditionValues. No\nvalues indicates the cell must be TRUE or FALSE, where TRUE renders as\nchecked and FALSE renders as unchecked. One value indicates the cell\nwill render as checked when it contains that value and unchecked when it\nis blank. Two values indicate that the cell will render as checked when\nit contains the first value and unchecked when it contains the second\nvalue. For example, [\"Yes\",\"No\"] indicates that the cell will render a\nchecked box when it has the value \"Yes\" and an unchecked box when it has\nthe value \"No\"." - ] + "protectedRangeId": { + "description": "The ID of the protected range to delete.", + "format": "int32", + "type": "integer" + } + }, + "id": "DeleteProtectedRangeRequest" + } + }, + "protocol": "rest", + "icons": { + "x32": "http://www.google.com/images/icons/product/search-32.gif", + "x16": "http://www.google.com/images/icons/product/search-16.gif" + }, + "canonicalName": "Sheets", + "auth": { + "oauth2": { + "scopes": { + "https://www.googleapis.com/auth/drive.file": { + "description": "View and manage Google Drive files and folders that you have opened or created with this app" + }, + "https://www.googleapis.com/auth/drive": { + "description": "See, edit, create, and delete all of your Google Drive files" + }, + "https://www.googleapis.com/auth/drive.readonly": { + "description": "See and download all your Google Drive files" }, - "values": { - "description": "The values of the condition. The number of supported values depends\non the condition type. Some support zero values,\nothers one or two values,\nand ConditionType.ONE_OF_LIST supports an arbitrary number of values.", - "type": "array", - "items": { - "$ref": "ConditionValue" - } - } - }, - "id": "BooleanCondition", - "description": "A condition that can evaluate to true or false.\nBooleanConditions are used by conditional formatting,\ndata validation, and the criteria in filters." - }, - "AddDimensionGroupRequest": { - "id": "AddDimensionGroupRequest", - "description": "Creates a group over the specified range.\n\nIf the requested range is a superset of the range of an existing group G,\nthen the depth of G is incremented and this new group G' has the\ndepth of that group. For example, a group [C:D, depth 1] + [B:E] results in\ngroups [B:E, depth 1] and [C:D, depth 2].\nIf the requested range is a subset of the range of an existing group G,\nthen the depth of the new group G' becomes one greater than the depth of G.\nFor example, a group [B:E, depth 1] + [C:D] results in groups [B:E, depth 1]\nand [C:D, depth 2].\nIf the requested range starts before and ends within, or starts within and\nends after, the range of an existing group G, then the range of the existing\ngroup G becomes the union of the ranges, and the new group G' has\ndepth one greater than the depth of G and range as the intersection of the\nranges. For example, a group [B:D, depth 1] + [C:E] results in groups [B:E,\ndepth 1] and [C:D, depth 2].", - "type": "object", - "properties": { - "range": { - "$ref": "DimensionRange", - "description": "The range over which to create a group." + "https://www.googleapis.com/auth/spreadsheets.readonly": { + "description": "View your Google Spreadsheets" + }, + "https://www.googleapis.com/auth/spreadsheets": { + "description": "See, edit, create, and delete your spreadsheets in Google Drive" } } - }, - "BasicChartSpec": { - "type": "object", - "properties": { - "stackedType": { - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "Series are not stacked.", - "Series values are stacked, each value is rendered vertically beginning\nfrom the top of the value below it.", - "Vertical stacks are stretched to reach the top of the chart, with\nvalues laid out as percentages of each other." - ], - "enum": [ - "BASIC_CHART_STACKED_TYPE_UNSPECIFIED", - "NOT_STACKED", - "STACKED", - "PERCENT_STACKED" + } + }, + "rootUrl": "https://sheets.googleapis.com/", + "ownerDomain": "google.com", + "name": "sheets", + "batchPath": "batch", + "fullyEncodeReservedExpansion": true, + "title": "Google Sheets API", + "ownerName": "Google", + "resources": { + "spreadsheets": { + "methods": { + "create": { + "description": "Creates a spreadsheet, returning the newly created spreadsheet.", + "request": { + "$ref": "Spreadsheet" + }, + "httpMethod": "POST", + "parameterOrder": [], + "response": { + "$ref": "Spreadsheet" + }, + "parameters": {}, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" ], - "description": "The stacked type for charts that support vertical stacking.\nApplies to Area, Bar, Column, Combo, and Stepped Area charts." - }, - "threeDimensional": { - "description": "True to make the chart 3D.\nApplies to Bar and Column charts.", - "type": "boolean" + "flatPath": "v4/spreadsheets", + "id": "sheets.spreadsheets.create", + "path": "v4/spreadsheets" }, - "axis": { - "type": "array", - "items": { - "$ref": "BasicChartAxis" + "batchUpdate": { + "description": "Applies one or more updates to the spreadsheet.\n\nEach request is validated before\nbeing applied. If any request is not valid then the entire request will\nfail and nothing will be applied.\n\nSome requests have replies to\ngive you some information about how\nthey are applied. The replies will mirror the requests. For example,\nif you applied 4 updates and the 3rd one had a reply, then the\nresponse will have 2 empty replies, the actual reply, and another empty\nreply, in that order.\n\nDue to the collaborative nature of spreadsheets, it is not guaranteed that\nthe spreadsheet will reflect exactly your changes after this completes,\nhowever it is guaranteed that the updates in the request will be\napplied together atomically. Your changes may be altered with respect to\ncollaborator changes. If there are no collaborators, the spreadsheet\nshould reflect your changes.", + "request": { + "$ref": "BatchUpdateSpreadsheetRequest" }, - "description": "The axis on the chart." - }, - "interpolateNulls": { - "description": "If some values in a series are missing, gaps may appear in the chart (e.g,\nsegments of lines in a line chart will be missing). To eliminate these\ngaps set this to true.\nApplies to Line, Area, and Combo charts.", - "type": "boolean" + "httpMethod": "POST", + "parameterOrder": [ + "spreadsheetId" + ], + "response": { + "$ref": "BatchUpdateSpreadsheetResponse" + }, + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The spreadsheet to apply the updates to.", + "required": true, + "type": "string" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}:batchUpdate", + "id": "sheets.spreadsheets.batchUpdate", + "path": "v4/spreadsheets/{spreadsheetId}:batchUpdate" }, - "chartType": { - "enum": [ - "BASIC_CHART_TYPE_UNSPECIFIED", - "BAR", - "LINE", - "AREA", - "COLUMN", - "SCATTER", - "COMBO", - "STEPPED_AREA" + "get": { + "response": { + "$ref": "Spreadsheet" + }, + "parameterOrder": [ + "spreadsheetId" ], - "description": "The type of the chart.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "A \u003ca href=\"/chart/interactive/docs/gallery/barchart\"\u003ebar chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/linechart\"\u003eline chart\u003c/a\u003e.", - "An \u003ca href=\"/chart/interactive/docs/gallery/areachart\"\u003earea chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/columnchart\"\u003ecolumn chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/scatterchart\"\u003escatter\nchart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/combochart\"\u003ecombo chart\u003c/a\u003e.", - "A \u003ca href=\"/chart/interactive/docs/gallery/steppedareachart\"\u003estepped area\nchart\u003c/a\u003e." - ] + "httpMethod": "GET", + "parameters": { + "ranges": { + "repeated": true, + "location": "query", + "description": "The ranges to retrieve from the spreadsheet.", + "type": "string" + }, + "includeGridData": { + "location": "query", + "description": "True if grid data should be returned.\nThis parameter is ignored if a field mask was set in the request.", + "type": "boolean" + }, + "spreadsheetId": { + "required": true, + "type": "string", + "location": "path", + "description": "The spreadsheet to request." + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/drive.readonly", + "https://www.googleapis.com/auth/spreadsheets", + "https://www.googleapis.com/auth/spreadsheets.readonly" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}", + "path": "v4/spreadsheets/{spreadsheetId}", + "id": "sheets.spreadsheets.get", + "description": "Returns the spreadsheet at the given ID.\nThe caller must specify the spreadsheet ID.\n\nBy default, data within grids will not be returned.\nYou can include grid data one of two ways:\n\n* Specify a field mask listing your desired fields using the `fields` URL\nparameter in HTTP\n\n* Set the includeGridData\nURL parameter to true. If a field mask is set, the `includeGridData`\nparameter is ignored\n\nFor large spreadsheets, it is recommended to retrieve only the specific\nfields of the spreadsheet that you want.\n\nTo retrieve only subsets of the spreadsheet, use the\nranges URL parameter.\nMultiple ranges can be specified. Limiting the range will\nreturn only the portions of the spreadsheet that intersect the requested\nranges. Ranges are specified using A1 notation." }, - "series": { - "description": "The data this chart is visualizing.", - "type": "array", - "items": { - "$ref": "BasicChartSeries" + "getByDataFilter": { + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The spreadsheet to request.", + "required": true, + "type": "string" + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}:getByDataFilter", + "id": "sheets.spreadsheets.getByDataFilter", + "path": "v4/spreadsheets/{spreadsheetId}:getByDataFilter", + "request": { + "$ref": "GetSpreadsheetByDataFilterRequest" + }, + "description": "Returns the spreadsheet at the given ID.\nThe caller must specify the spreadsheet ID.\n\nThis method differs from GetSpreadsheet in that it allows selecting\nwhich subsets of spreadsheet data to return by specifying a\ndataFilters parameter.\nMultiple DataFilters can be specified. Specifying one or\nmore data filters will return the portions of the spreadsheet that\nintersect ranges matched by any of the filters.\n\nBy default, data within grids will not be returned.\nYou can include grid data one of two ways:\n\n* Specify a field mask listing your desired fields using the `fields` URL\nparameter in HTTP\n\n* Set the includeGridData\nparameter to true. If a field mask is set, the `includeGridData`\nparameter is ignored\n\nFor large spreadsheets, it is recommended to retrieve only the specific\nfields of the spreadsheet that you want.", + "httpMethod": "POST", + "parameterOrder": [ + "spreadsheetId" + ], + "response": { + "$ref": "Spreadsheet" + } + } + }, + "resources": { + "developerMetadata": { + "methods": { + "search": { + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to retrieve metadata from.", + "required": true, + "type": "string" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/developerMetadata:search", + "id": "sheets.spreadsheets.developerMetadata.search", + "path": "v4/spreadsheets/{spreadsheetId}/developerMetadata:search", + "description": "Returns all developer metadata matching the specified DataFilter.\nIf the provided DataFilter represents a DeveloperMetadataLookup object,\nthis will return all DeveloperMetadata entries selected by it. If the\nDataFilter represents a location in a spreadsheet, this will return all\ndeveloper metadata associated with locations intersecting that region.", + "request": { + "$ref": "SearchDeveloperMetadataRequest" + }, + "httpMethod": "POST", + "parameterOrder": [ + "spreadsheetId" + ], + "response": { + "$ref": "SearchDeveloperMetadataResponse" + } + }, + "get": { + "response": { + "$ref": "DeveloperMetadata" + }, + "parameterOrder": [ + "spreadsheetId", + "metadataId" + ], + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to retrieve metadata from.", + "required": true, + "type": "string" + }, + "metadataId": { + "location": "path", + "description": "The ID of the developer metadata to retrieve.", + "format": "int32", + "required": true, + "type": "integer" + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}", + "path": "v4/spreadsheets/{spreadsheetId}/developerMetadata/{metadataId}", + "id": "sheets.spreadsheets.developerMetadata.get", + "description": "Returns the developer metadata with the specified ID.\nThe caller must specify the spreadsheet ID and the developer metadata's\nunique metadataId." + } } }, - "legendPosition": { - "enum": [ - "BASIC_CHART_LEGEND_POSITION_UNSPECIFIED", - "BOTTOM_LEGEND", - "LEFT_LEGEND", - "RIGHT_LEGEND", - "TOP_LEGEND", - "NO_LEGEND" - ], - "description": "The position of the chart legend.", - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "The legend is rendered on the bottom of the chart.", - "The legend is rendered on the left of the chart.", - "The legend is rendered on the right of the chart.", - "The legend is rendered on the top of the chart.", - "No legend is rendered." - ] - }, - "compareMode": { - "type": "string", - "enumDescriptions": [ - "Default value, do not use.", - "Only the focused data element is highlighted and shown in the tooltip.", - "All data elements with the same category (e.g., domain value) are\nhighlighted and shown in the tooltip." - ], - "enum": [ - "BASIC_CHART_COMPARE_MODE_UNSPECIFIED", - "DATUM", - "CATEGORY" - ], - "description": "The behavior of tooltips and data highlighting when hovering on data and\nchart area." - }, - "domains": { - "type": "array", - "items": { - "$ref": "BasicChartDomain" - }, - "description": "The domain of data this is charting.\nOnly a single domain is supported." - }, - "lineSmoothing": { - "description": "Gets whether all lines should be rendered smooth or straight by default.\nApplies to Line charts.", - "type": "boolean" - }, - "headerCount": { - "type": "integer", - "description": "The number of rows or columns in the data that are \"headers\".\nIf not set, Google Sheets will guess how many rows are headers based\non the data.\n\n(Note that BasicChartAxis.title may override the axis title\n inferred from the header values.)", - "format": "int32" - } - }, - "id": "BasicChartSpec", - "description": "The specification for a basic chart. See BasicChartType for the list\nof charts this supports." - }, - "CellData": { - "id": "CellData", - "description": "Data about a specific cell.", - "type": "object", - "properties": { - "pivotTable": { - "description": "A pivot table anchored at this cell. The size of pivot table itself\nis computed dynamically based on its data, grouping, filters, values,\netc. Only the top-left cell of the pivot table contains the pivot table\ndefinition. The other cells will contain the calculated values of the\nresults of the pivot in their effective_value fields.", - "$ref": "PivotTable" - }, - "userEnteredFormat": { - "$ref": "CellFormat", - "description": "The format the user entered for the cell.\n\nWhen writing, the new format will be merged with the existing format." - }, - "effectiveFormat": { - "$ref": "CellFormat", - "description": "The effective format being used by the cell.\nThis includes the results of applying any conditional formatting and,\nif the cell contains a formula, the computed number format.\nIf the effective format is the default format, effective format will\nnot be written.\nThis field is read-only." - }, - "note": { - "type": "string", - "description": "Any note on the cell." - }, - "userEnteredValue": { - "description": "The value the user entered in the cell. e.g, `1234`, `'Hello'`, or `=NOW()`\nNote: Dates, Times and DateTimes are represented as doubles in\nserial number format.", - "$ref": "ExtendedValue" - }, - "dataValidation": { - "$ref": "DataValidationRule", - "description": "A data validation rule on the cell, if any.\n\nWhen writing, the new data validation rule will overwrite any prior rule." - }, - "effectiveValue": { - "$ref": "ExtendedValue", - "description": "The effective value of the cell. For cells with formulas, this is\nthe calculated value. For cells with literals, this is\nthe same as the user_entered_value.\nThis field is read-only." - }, - "textFormatRuns": { - "description": "Runs of rich text applied to subsections of the cell. Runs are only valid\non user entered strings, not formulas, bools, or numbers.\nRuns start at specific indexes in the text and continue until the next\nrun. Properties of a run will continue unless explicitly changed\nin a subsequent run (and properties of the first run will continue\nthe properties of the cell unless explicitly changed).\n\nWhen writing, the new runs will overwrite any prior runs. When writing a\nnew user_entered_value, previous runs are erased.", - "type": "array", - "items": { - "$ref": "TextFormatRun" + "values": { + "methods": { + "batchGet": { + "description": "Returns one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more ranges.", + "response": { + "$ref": "BatchGetValuesResponse" + }, + "parameterOrder": [ + "spreadsheetId" + ], + "httpMethod": "GET", + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/drive.readonly", + "https://www.googleapis.com/auth/spreadsheets", + "https://www.googleapis.com/auth/spreadsheets.readonly" + ], + "parameters": { + "spreadsheetId": { + "description": "The ID of the spreadsheet to retrieve data from.", + "required": true, + "type": "string", + "location": "path" + }, + "valueRenderOption": { + "type": "string", + "location": "query", + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" + ], + "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE." + }, + "dateTimeRenderOption": { + "type": "string", + "location": "query", + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ], + "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER]." + }, + "ranges": { + "location": "query", + "description": "The A1 notation of the values to retrieve.", + "type": "string", + "repeated": true + }, + "majorDimension": { + "location": "query", + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`.", + "type": "string" + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchGet", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchGet", + "id": "sheets.spreadsheets.values.batchGet" + }, + "clear": { + "response": { + "$ref": "ClearValuesResponse" + }, + "parameterOrder": [ + "spreadsheetId", + "range" + ], + "httpMethod": "POST", + "parameters": { + "spreadsheetId": { + "required": true, + "type": "string", + "location": "path", + "description": "The ID of the spreadsheet to update." + }, + "range": { + "description": "The A1 notation of the values to clear.", + "required": true, + "type": "string", + "location": "path" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}:clear", + "path": "v4/spreadsheets/{spreadsheetId}/values/{range}:clear", + "id": "sheets.spreadsheets.values.clear", + "description": "Clears values from a spreadsheet.\nThe caller must specify the spreadsheet ID and range.\nOnly values are cleared -- all other properties of the cell (such as\nformatting, data validation, etc..) are kept.", + "request": { + "$ref": "ClearValuesRequest" + } + }, + "batchClearByDataFilter": { + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "spreadsheetId": { + "required": true, + "type": "string", + "location": "path", + "description": "The ID of the spreadsheet to update." + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchClearByDataFilter", + "id": "sheets.spreadsheets.values.batchClearByDataFilter", + "request": { + "$ref": "BatchClearValuesByDataFilterRequest" + }, + "description": "Clears one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more\nDataFilters. Ranges matching any of the specified data\nfilters will be cleared. Only values are cleared -- all other properties\nof the cell (such as formatting, data validation, etc..) are kept.", + "response": { + "$ref": "BatchClearValuesByDataFilterResponse" + }, + "parameterOrder": [ + "spreadsheetId" + ], + "httpMethod": "POST" + }, + "append": { + "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}:append", + "path": "v4/spreadsheets/{spreadsheetId}/values/{range}:append", + "id": "sheets.spreadsheets.values.append", + "description": "Appends values to a spreadsheet. The input range is used to search for\nexisting data and find a \"table\" within that range. Values will be\nappended to the next row of the table, starting with the first column of\nthe table. See the\n[guide](/sheets/api/guides/values#appending_values)\nand\n[sample code](/sheets/api/samples/writing#append_values)\nfor specific details of how tables are detected and data is appended.\n\nThe caller must specify the spreadsheet ID, range, and\na valueInputOption. The `valueInputOption` only\ncontrols how the input data will be added to the sheet (column-wise or\nrow-wise), it does not influence what cell the data starts being written\nto.", + "request": { + "$ref": "ValueRange" + }, + "response": { + "$ref": "AppendValuesResponse" + }, + "parameterOrder": [ + "spreadsheetId", + "range" + ], + "httpMethod": "POST", + "parameters": { + "range": { + "location": "path", + "description": "The A1 notation of a range to search for a logical table of data.\nValues will be appended after the last row of the table.", + "required": true, + "type": "string" + }, + "includeValuesInResponse": { + "location": "query", + "description": "Determines if the update response should include the values\nof the cells that were appended. By default, responses\ndo not include the updated values.", + "type": "boolean" + }, + "spreadsheetId": { + "required": true, + "type": "string", + "location": "path", + "description": "The ID of the spreadsheet to update." + }, + "responseValueRenderOption": { + "location": "query", + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" + ], + "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", + "type": "string" + }, + "insertDataOption": { + "location": "query", + "enum": [ + "OVERWRITE", + "INSERT_ROWS" + ], + "description": "How the input data should be inserted.", + "type": "string" + }, + "valueInputOption": { + "location": "query", + "enum": [ + "INPUT_VALUE_OPTION_UNSPECIFIED", + "RAW", + "USER_ENTERED" + ], + "description": "How the input data should be interpreted.", + "type": "string" + }, + "responseDateTimeRenderOption": { + "location": "query", + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ], + "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", + "type": "string" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ] + }, + "batchGetByDataFilter": { + "id": "sheets.spreadsheets.values.batchGetByDataFilter", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter", + "description": "Returns one or more ranges of values that match the specified data filters.\nThe caller must specify the spreadsheet ID and one or more\nDataFilters. Ranges that match any of the data filters in\nthe request will be returned.", + "request": { + "$ref": "BatchGetValuesByDataFilterRequest" + }, + "httpMethod": "POST", + "parameterOrder": [ + "spreadsheetId" + ], + "response": { + "$ref": "BatchGetValuesByDataFilterResponse" + }, + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to retrieve data from.", + "required": true, + "type": "string" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchGetByDataFilter" + }, + "batchClear": { + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to update.", + "required": true, + "type": "string" + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchClear", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchClear", + "id": "sheets.spreadsheets.values.batchClear", + "request": { + "$ref": "BatchClearValuesRequest" + }, + "description": "Clears one or more ranges of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and one or more ranges.\nOnly values are cleared -- all other properties of the cell (such as\nformatting, data validation, etc..) are kept.", + "response": { + "$ref": "BatchClearValuesResponse" + }, + "parameterOrder": [ + "spreadsheetId" + ], + "httpMethod": "POST" + }, + "get": { + "path": "v4/spreadsheets/{spreadsheetId}/values/{range}", + "id": "sheets.spreadsheets.values.get", + "description": "Returns a range of values from a spreadsheet.\nThe caller must specify the spreadsheet ID and a range.", + "response": { + "$ref": "ValueRange" + }, + "parameterOrder": [ + "spreadsheetId", + "range" + ], + "httpMethod": "GET", + "parameters": { + "majorDimension": { + "type": "string", + "location": "query", + "enum": [ + "DIMENSION_UNSPECIFIED", + "ROWS", + "COLUMNS" + ], + "description": "The major dimension that results should use.\n\nFor example, if the spreadsheet data is: `A1=1,B1=2,A2=3,B2=4`,\nthen requesting `range=A1:B2,majorDimension=ROWS` will return\n`[[1,2],[3,4]]`,\nwhereas requesting `range=A1:B2,majorDimension=COLUMNS` will return\n`[[1,3],[2,4]]`." + }, + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to retrieve data from.", + "required": true, + "type": "string" + }, + "range": { + "required": true, + "type": "string", + "location": "path", + "description": "The A1 notation of the values to retrieve." + }, + "valueRenderOption": { + "location": "query", + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" + ], + "description": "How values should be represented in the output.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", + "type": "string" + }, + "dateTimeRenderOption": { + "description": "How dates, times, and durations should be represented in the output.\nThis is ignored if value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is [DateTimeRenderOption.SERIAL_NUMBER].", + "type": "string", + "location": "query", + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ] + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/drive.readonly", + "https://www.googleapis.com/auth/spreadsheets", + "https://www.googleapis.com/auth/spreadsheets.readonly" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}" + }, + "batchUpdateByDataFilter": { + "response": { + "$ref": "BatchUpdateValuesByDataFilterResponse" + }, + "parameterOrder": [ + "spreadsheetId" + ], + "httpMethod": "POST", + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to update.", + "required": true, + "type": "string" + } + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchUpdateByDataFilter", + "id": "sheets.spreadsheets.values.batchUpdateByDataFilter", + "description": "Sets values in one or more ranges of a spreadsheet.\nThe caller must specify the spreadsheet ID,\na valueInputOption, and one or more\nDataFilterValueRanges.", + "request": { + "$ref": "BatchUpdateValuesByDataFilterRequest" + } + }, + "update": { + "httpMethod": "PUT", + "parameterOrder": [ + "spreadsheetId", + "range" + ], + "response": { + "$ref": "UpdateValuesResponse" + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "range": { + "required": true, + "type": "string", + "location": "path", + "description": "The A1 notation of the values to update." + }, + "includeValuesInResponse": { + "location": "query", + "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values.\nIf the range to write was larger than than the range actually written,\nthe response will include all values in the requested range (excluding\ntrailing empty rows and columns).", + "type": "boolean" + }, + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to update.", + "required": true, + "type": "string" + }, + "responseValueRenderOption": { + "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", + "type": "string", + "location": "query", + "enum": [ + "FORMATTED_VALUE", + "UNFORMATTED_VALUE", + "FORMULA" + ] + }, + "valueInputOption": { + "type": "string", + "location": "query", + "enum": [ + "INPUT_VALUE_OPTION_UNSPECIFIED", + "RAW", + "USER_ENTERED" + ], + "description": "How the input data should be interpreted." + }, + "responseDateTimeRenderOption": { + "location": "query", + "enum": [ + "SERIAL_NUMBER", + "FORMATTED_STRING" + ], + "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER.", + "type": "string" + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}/values/{range}", + "id": "sheets.spreadsheets.values.update", + "path": "v4/spreadsheets/{spreadsheetId}/values/{range}", + "request": { + "$ref": "ValueRange" + }, + "description": "Sets values in a range of a spreadsheet.\nThe caller must specify the spreadsheet ID, range, and\na valueInputOption." + }, + "batchUpdate": { + "id": "sheets.spreadsheets.values.batchUpdate", + "path": "v4/spreadsheets/{spreadsheetId}/values:batchUpdate", + "request": { + "$ref": "BatchUpdateValuesRequest" + }, + "description": "Sets values in one or more ranges of a spreadsheet.\nThe caller must specify the spreadsheet ID,\na valueInputOption, and one or more\nValueRanges.", + "httpMethod": "POST", + "parameterOrder": [ + "spreadsheetId" + ], + "response": { + "$ref": "BatchUpdateValuesResponse" + }, + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "spreadsheetId": { + "location": "path", + "description": "The ID of the spreadsheet to update.", + "required": true, + "type": "string" + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}/values:batchUpdate" + } } }, - "formattedValue": { - "description": "The formatted value of the cell.\nThis is the value as it's shown to the user.\nThis field is read-only.", - "type": "string" - }, - "hyperlink": { - "description": "A hyperlink this cell points to, if any.\nThis field is read-only. (To set it, use a `=HYPERLINK` formula\nin the userEnteredValue.formulaValue\nfield.)", - "type": "string" + "sheets": { + "methods": { + "copyTo": { + "scopes": [ + "https://www.googleapis.com/auth/drive", + "https://www.googleapis.com/auth/drive.file", + "https://www.googleapis.com/auth/spreadsheets" + ], + "parameters": { + "spreadsheetId": { + "required": true, + "type": "string", + "location": "path", + "description": "The ID of the spreadsheet containing the sheet to copy." + }, + "sheetId": { + "location": "path", + "description": "The ID of the sheet to copy.", + "format": "int32", + "required": true, + "type": "integer" + } + }, + "flatPath": "v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo", + "path": "v4/spreadsheets/{spreadsheetId}/sheets/{sheetId}:copyTo", + "id": "sheets.spreadsheets.sheets.copyTo", + "request": { + "$ref": "CopySheetToAnotherSpreadsheetRequest" + }, + "description": "Copies a single sheet from a spreadsheet to another spreadsheet.\nReturns the properties of the newly created sheet.", + "response": { + "$ref": "SheetProperties" + }, + "parameterOrder": [ + "spreadsheetId", + "sheetId" + ], + "httpMethod": "POST" + } + } } } + } + }, + "parameters": { + "prettyPrint": { + "location": "query", + "description": "Returns response with indentations and line breaks.", + "type": "boolean", + "default": "true" }, - "BatchUpdateValuesByDataFilterRequest": { - "description": "The request for updating more than one range of values in a spreadsheet.", - "type": "object", - "properties": { - "includeValuesInResponse": { - "type": "boolean", - "description": "Determines if the update response should include the values\nof the cells that were updated. By default, responses\ndo not include the updated values. The `updatedData` field within\neach of the BatchUpdateValuesResponse.responses will contain\nthe updated values. If the range to write was larger than than the range\nactually written, the response will include all values in the requested\nrange (excluding trailing empty rows and columns)." - }, - "valueInputOption": { - "type": "string", - "enumDescriptions": [ - "Default input value. This value must not be used.", - "The values the user has entered will not be parsed and will be stored\nas-is.", - "The values will be parsed as if the user typed them into the UI.\nNumbers will stay as numbers, but strings may be converted to numbers,\ndates, etc. following the same rules that are applied when entering\ntext into a cell via the Google Sheets UI." - ], - "enum": [ - "INPUT_VALUE_OPTION_UNSPECIFIED", - "RAW", - "USER_ENTERED" - ], - "description": "How the input data should be interpreted." - }, - "data": { - "description": "The new values to apply to the spreadsheet. If more than one range is\nmatched by the specified DataFilter the specified values will be\napplied to all of those ranges.", - "type": "array", - "items": { - "$ref": "DataFilterValueRange" - } - }, - "responseDateTimeRenderOption": { - "type": "string", - "enumDescriptions": [ - "Instructs date, time, datetime, and duration fields to be output\nas doubles in \"serial number\" format, as popularized by Lotus 1-2-3.\nThe whole number portion of the value (left of the decimal) counts\nthe days since December 30th 1899. The fractional portion (right of\nthe decimal) counts the time as a fraction of the day. For example,\nJanuary 1st 1900 at noon would be 2.5, 2 because it's 2 days after\nDecember 30st 1899, and .5 because noon is half a day. February 1st\n1900 at 3pm would be 33.625. This correctly treats the year 1900 as\nnot a leap year.", - "Instructs date, time, datetime, and duration fields to be output\nas strings in their given number format (which is dependent\non the spreadsheet locale)." - ], - "enum": [ - "SERIAL_NUMBER", - "FORMATTED_STRING" - ], - "description": "Determines how dates, times, and durations in the response should be\nrendered. This is ignored if response_value_render_option is\nFORMATTED_VALUE.\nThe default dateTime render option is\nDateTimeRenderOption.SERIAL_NUMBER." - }, - "responseValueRenderOption": { - "description": "Determines how values in the response should be rendered.\nThe default render option is ValueRenderOption.FORMATTED_VALUE.", - "type": "string", - "enumDescriptions": [ - "Values will be calculated & formatted in the reply according to the\ncell's formatting. Formatting is based on the spreadsheet's locale,\nnot the requesting user's locale.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return `\"$1.23\"`.", - "Values will be calculated, but not formatted in the reply.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen `A2` would return the number `1.23`.", - "Values will not be calculated. The reply will include the formulas.\nFor example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency,\nthen A2 would return `\"=A1\"`." - ], - "enum": [ - "FORMATTED_VALUE", - "UNFORMATTED_VALUE", - "FORMULA" - ] - } - }, - "id": "BatchUpdateValuesByDataFilterRequest" + "quotaUser": { + "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters.", + "type": "string", + "location": "query" }, - "UpdateDimensionGroupRequest": { - "description": "Updates the state of the specified group.", - "type": "object", - "properties": { - "dimensionGroup": { - "$ref": "DimensionGroup", - "description": "The group whose state should be updated. The range and depth of the group\nshould specify a valid group on the sheet, and all other fields updated." - }, - "fields": { - "type": "string", - "description": "The fields that should be updated. At least one field must be specified.\nThe root `dimensionGroup` is implied and should not be specified.\nA single `\"*\"` can be used as short-hand for listing every field.", - "format": "google-fieldmask" - } - }, - "id": "UpdateDimensionGroupRequest" + "fields": { + "type": "string", + "location": "query", + "description": "Selector specifying which fields to include in a partial response." }, - "DeleteDeveloperMetadataResponse": { - "description": "The response from deleting developer metadata.", - "type": "object", - "properties": { - "deletedDeveloperMetadata": { - "description": "The metadata that was deleted.", - "type": "array", - "items": { - "$ref": "DeveloperMetadata" - } - } - }, - "id": "DeleteDeveloperMetadataResponse" + "uploadType": { + "type": "string", + "location": "query", + "description": "Legacy upload protocol for media (e.g. \"media\", \"multipart\")." }, - "SortRangeRequest": { - "description": "Sorts data in rows based on a sort order per column.", - "type": "object", - "properties": { - "range": { - "description": "The range to sort.", - "$ref": "GridRange" - }, - "sortSpecs": { - "description": "The sort order per column. Later specifications are used when values\nare equal in the earlier specifications.", - "type": "array", - "items": { - "$ref": "SortSpec" - } - } - }, - "id": "SortRangeRequest" - } - }, - "protocol": "rest", - "icons": { - "x16": "http://www.google.com/images/icons/product/search-16.gif", - "x32": "http://www.google.com/images/icons/product/search-32.gif" - }, - "canonicalName": "Sheets", - "auth": { - "oauth2": { - "scopes": { - "https://www.googleapis.com/auth/drive.file": { - "description": "View and manage Google Drive files and folders that you have opened or created with this app" - }, - "https://www.googleapis.com/auth/drive": { - "description": "See, edit, create, and delete all of your Google Drive files" - }, - "https://www.googleapis.com/auth/drive.readonly": { - "description": "See and download all your Google Drive files" - }, - "https://www.googleapis.com/auth/spreadsheets.readonly": { - "description": "View your Google Spreadsheets" - }, - "https://www.googleapis.com/auth/spreadsheets": { - "description": "See, edit, create, and delete your spreadsheets in Google Drive" - } - } + "$.xgafv": { + "description": "V1 error format.", + "type": "string", + "enumDescriptions": [ + "v1 error format", + "v2 error format" + ], + "location": "query", + "enum": [ + "1", + "2" + ] + }, + "oauth_token": { + "location": "query", + "description": "OAuth 2.0 token for the current user.", + "type": "string" + }, + "callback": { + "description": "JSONP", + "type": "string", + "location": "query" + }, + "alt": { + "enum": [ + "json", + "media", + "proto" + ], + "type": "string", + "enumDescriptions": [ + "Responses with Content-Type of application/json", + "Media download with context-dependent Content-Type", + "Responses with Content-Type of application/x-protobuf" + ], + "location": "query", + "description": "Data format for response.", + "default": "json" + }, + "key": { + "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.", + "type": "string", + "location": "query" + }, + "access_token": { + "type": "string", + "location": "query", + "description": "OAuth access token." + }, + "upload_protocol": { + "location": "query", + "description": "Upload protocol for media (e.g. \"raw\", \"multipart\").", + "type": "string" } }, - "rootUrl": "https://sheets.googleapis.com/", - "ownerDomain": "google.com", - "name": "sheets", - "batchPath": "batch", - "fullyEncodeReservedExpansion": true, - "title": "Google Sheets API" + "version": "v4", + "baseUrl": "https://sheets.googleapis.com/", + "servicePath": "", + "kind": "discovery#restDescription", + "description": "Reads and writes Google Sheets." } From 03b628a6ff6a30b3ba7f7cb2662b00a1e6944f0e Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Thu, 21 Nov 2019 16:06:22 -0800 Subject: [PATCH 23/28] Refactor patch(); schemas know their own id now --- R/schemas.R | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/R/schemas.R b/R/schemas.R index d1f152ada..097b01ffd 100644 --- a/R/schemas.R +++ b/R/schemas.R @@ -5,7 +5,7 @@ new <- function(id, ...) { } dots <- rlang::list2(...) - check_against_schema(dots, schema = schema, id = id) + check_against_schema(dots, schema = schema) structure( dots, @@ -17,11 +17,11 @@ new <- function(id, ...) { } # TODO: if it proves necessary, this could do more meaningful checks -check_against_schema <- function(properties, schema, id) { +check_against_schema <- function(properties, schema) { unexpected <- setdiff(names(properties), schema$property) if (length(unexpected) > 0) { msg <- glue(" - Properties not recognized for the {sq(id)} schema: + Properties not recognized for the {sq(attr(schema, 'id'))} schema: * {glue_collapse(unexpected, sep = ', ')} ") rlang::abort(msg) @@ -49,7 +49,9 @@ patch.default <- function(x, ...) { patch.googlesheets4_schema <- function(x, ...) { dots <- rlang::list2(...) - new(id_from_class(x), !!!utils::modifyList(x, dots)) + check_against_schema(dots, schema = attr(x, "schema")) + x[names(dots)] <- dots + x } # tibblify ---- From ded50e4af3e23169c304068e454a23a4d23c295a Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Thu, 21 Nov 2019 16:19:42 -0800 Subject: [PATCH 24/28] Describe status of sheets_create() --- R/sheets_create.R | 14 ++++++++++---- man/sheets_create.Rd | 14 ++++++++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/R/sheets_create.R b/R/sheets_create.R index dfb247847..9499958b6 100644 --- a/R/sheets_create.R +++ b/R/sheets_create.R @@ -1,7 +1,9 @@ #' Create a new Sheet #' #' Creates an entirely new Sheet (spreadsheet or workbook). Offers some control -#' over the initial set of sheets (worksheets or tabs). +#' over the initial set of sheets (worksheets or tabs). CAUTION: this function +#' is still being developed and, for example, currently sends all data as +#' character. #' #' @seealso Wraps the `spreadsheets.create` endpoint: #' * @@ -9,9 +11,8 @@ #' @param name The name of the spreadsheet. #' @param ... Optional spreadsheet properties that can be set through this API #' endpoint, such as locale and time zone. -#' @param sheets Optional something something about the sheets. Will this just -#' offer control over names? Alternatively there could be an interface that -#' supports specifying data here. +#' @param sheets Optional named list of data frames. One sheet is created for +#' each data frame. #' #' @inherit sheets_get return #' @export @@ -27,6 +28,11 @@ #' locale = "fr_FR", #' timeZone = "Europe/Paris" #' ) +#' +#' sheets_create( +#' "sheets-create-demo-4", +#' sheets = list(iris = head(iris), mtcars = head(mtcars)) +#' ) #' } sheets_create <- function(name, ..., sheets = NULL) { ss_body <- new("Spreadsheet") %>% diff --git a/man/sheets_create.Rd b/man/sheets_create.Rd index 04fef0db3..0efa9110c 100644 --- a/man/sheets_create.Rd +++ b/man/sheets_create.Rd @@ -12,9 +12,8 @@ sheets_create(name, ..., sheets = NULL) \item{...}{Optional spreadsheet properties that can be set through this API endpoint, such as locale and time zone.} -\item{sheets}{Optional something something about the sheets. Will this just -offer control over names? Alternatively there could be an interface that -supports specifying data here.} +\item{sheets}{Optional named list of data frames. One sheet is created for +each data frame.} } \value{ \itemize{ @@ -25,7 +24,9 @@ purposes. } \description{ Creates an entirely new Sheet (spreadsheet or workbook). Offers some control -over the initial set of sheets (worksheets or tabs). +over the initial set of sheets (worksheets or tabs). CAUTION: this function +is still being developed and, for example, currently sends all data as +character. } \examples{ if (sheets_has_token()) { @@ -38,6 +39,11 @@ if (sheets_has_token()) { locale = "fr_FR", timeZone = "Europe/Paris" ) + + sheets_create( + "sheets-create-demo-4", + sheets = list(iris = head(iris), mtcars = head(mtcars)) + ) } } \seealso{ From 76777116f02e7b06779403d7a35558811957fc0f Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Thu, 21 Nov 2019 16:28:24 -0800 Subject: [PATCH 25/28] Send column names --- R/schema_Sheet.R | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/R/schema_Sheet.R b/R/schema_Sheet.R index e4d2169a7..b60f9edd7 100644 --- a/R/schema_Sheet.R +++ b/R/schema_Sheet.R @@ -24,8 +24,7 @@ as_Sheet.data.frame <- function(df, name) { properties = new( id = "SheetProperties", title = name, - # TODO: not making room for col_names here yet - gridProperties = list(rowCount = nrow(df), columnCount = ncol(df)) + gridProperties = list(rowCount = nrow(df) + 1, columnCount = ncol(df)) ), data = list( # an array of instances of GridData list( @@ -36,7 +35,7 @@ as_Sheet.data.frame <- function(df, name) { } as_RowData <- function(df) { - df_rows <- transpose(df) + df_rows <- c(list(names(df)), transpose(df)) make_row <- function(x) { map(x, ~ list(userEnteredValue = list(stringValue = as.character(.x)))) } From 34394148e4940e1d3f02704c4b01f27b1ccf6834 Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Thu, 21 Nov 2019 22:23:00 -0800 Subject: [PATCH 26/28] Teach as_sheets_id() about sheets_Spreadsheet --- NAMESPACE | 1 + R/sheets_id.R | 23 +++++++++++++++++------ man/as_sheets_id.Rd | 18 ++++++++++++------ tests/testthat/test-sheets_id.R | 7 +++++++ 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index c99a2bda5..aef9ffa92 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -6,6 +6,7 @@ S3method(as_sheets_id,character) S3method(as_sheets_id,default) S3method(as_sheets_id,dribble) S3method(as_sheets_id,drive_id) +S3method(as_sheets_id,sheets_Spreadsheet) S3method(as_sheets_id,sheets_id) S3method(ctype,"NULL") S3method(ctype,SHEETS_CELL) diff --git a/R/sheets_id.R b/R/sheets_id.R index d025ae73c..95921c5a7 100644 --- a/R/sheets_id.R +++ b/R/sheets_id.R @@ -56,18 +56,24 @@ sheets_id <- function(x) { #' * Spreadsheet id, "a string containing letters, numbers, and some special #' characters", typically 44 characters long, in our experience. Example: #' `1qpyC0XzvTcKT6EISywvqESX3A0MwQoFDE8p-Bll4hps`. -#' * A URL, from which we can excavate a spreadsheet or file id. Example: . +#' * A URL, from which we can excavate a spreadsheet or file id. Example: +#' . #' * A one-row [`dribble`][googledrive::dribble], a "Drive tibble" used by the -#' [googledrive] package. In general, a `dribble` can represent several files, -#' one row per file. Since googlesheets4 is not vectorized over spreadsheets, -#' we are only prepared to accept a one-row `dribble`. -#' - [`googledrive::drive_get("YOUR SHEET NAME")`][googledrive::drive_get()] +#' [googledrive] package. In general, a `dribble` can represent several +#' files, one row per file. Since googlesheets4 is not vectorized over +#' spreadsheets, we are only prepared to accept a one-row `dribble`. +#' - [`googledrive::drive_get("YOUR_SHEET_NAME")`][googledrive::drive_get()] #' is a great way to look up a Sheet via its name. +#' - [`sheets_find("YOUR_SHEET_NAME")`][sheets_find()] is another good way +#' to get your hands on a Sheet. +#' * Spreadsheet meta data, as returned by, e.g., [sheets_get()]. Literally, +#' this is an object of class `sheets_Spreadsheet`. #' #' @description This is a generic function. #' #' @param x Something that uniquely identifies a Google Sheet: a [`sheets_id`], -#' URL, or [`dribble`][googledrive::dribble]. +#' a URL, one-row [`dribble`][googledrive::dribble], or a +#' `sheets_Spreadsheet`. #' @param ... Other arguments passed down to methods. (Not used.) #' @export #' @examples @@ -134,6 +140,11 @@ as_sheets_id.character <- function(x, ...) { sheets_id(out) } +#' @export +as_sheets_id.sheets_Spreadsheet <- function(x, ...) { + new_sheets_id(x$spreadsheet_id) +} + ## copied from googledrive one_id <- function(x) { if (!grepl("^http|/", x)) return(x) diff --git a/man/as_sheets_id.Rd b/man/as_sheets_id.Rd index 8f2b531f5..0b6f24e01 100644 --- a/man/as_sheets_id.Rd +++ b/man/as_sheets_id.Rd @@ -8,7 +8,8 @@ as_sheets_id(x, ...) } \arguments{ \item{x}{Something that uniquely identifies a Google Sheet: a \code{\link{sheets_id}}, -URL, or \code{\link[googledrive:dribble]{dribble}}.} +a URL, one-row \code{\link[googledrive:dribble]{dribble}}, or a +\code{sheets_Spreadsheet}.} \item{...}{Other arguments passed down to methods. (Not used.)} } @@ -19,15 +20,20 @@ Converts various representations of a Google Sheet into a \item Spreadsheet id, "a string containing letters, numbers, and some special characters", typically 44 characters long, in our experience. Example: \verb{1qpyC0XzvTcKT6EISywvqESX3A0MwQoFDE8p-Bll4hps}. -\item A URL, from which we can excavate a spreadsheet or file id. Example: \url{https://docs.google.com/spreadsheets/d/1BzfL0kZUz1TsI5zxJF1WNF01IxvC67FbOJUiiGMZ_mQ/edit#gid=1150108545}. +\item A URL, from which we can excavate a spreadsheet or file id. Example: +\url{https://docs.google.com/spreadsheets/d/1BzfL0kZUz1TsI5zxJF1WNF01IxvC67FbOJUiiGMZ_mQ/edit#gid=1150108545}. \item A one-row \code{\link[googledrive:dribble]{dribble}}, a "Drive tibble" used by the -\link{googledrive} package. In general, a \code{dribble} can represent several files, -one row per file. Since googlesheets4 is not vectorized over spreadsheets, -we are only prepared to accept a one-row \code{dribble}. +\link{googledrive} package. In general, a \code{dribble} can represent several +files, one row per file. Since googlesheets4 is not vectorized over +spreadsheets, we are only prepared to accept a one-row \code{dribble}. \itemize{ -\item \code{\link[googledrive:drive_get]{googledrive::drive_get("YOUR SHEET NAME")}} +\item \code{\link[googledrive:drive_get]{googledrive::drive_get("YOUR_SHEET_NAME")}} is a great way to look up a Sheet via its name. +\item \code{\link[=sheets_find]{sheets_find("YOUR_SHEET_NAME")}} is another good way +to get your hands on a Sheet. } +\item Spreadsheet meta data, as returned by, e.g., \code{\link[=sheets_get]{sheets_get()}}. Literally, +this is an object of class \code{sheets_Spreadsheet}. } This is a generic function. diff --git a/tests/testthat/test-sheets_id.R b/tests/testthat/test-sheets_id.R index 316259368..5624e5f80 100644 --- a/tests/testthat/test-sheets_id.R +++ b/tests/testthat/test-sheets_id.R @@ -65,3 +65,10 @@ test_that("dribble with one Sheet can be coerced", { d <- d[d$mime_type == "application/vnd.google-apps.spreadsheet", ] expect_s3_class(as_sheets_id(d), "sheets_id") }) + +test_that("a sheets_Spreadsheet can be coerced", { + x <- new("Spreadsheet", spreadsheetId = "123") + out <- as_sheets_id(sheets_Spreadsheet(x)) + expect_s3_class(out, "sheets_id") + expect_identical(out, as_sheets_id("123")) +}) From 0c5d929c7e3e00016c8eb3cd66174915ee78a62a Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Thu, 21 Nov 2019 22:41:40 -0800 Subject: [PATCH 27/28] Another small refactor for patch() --- R/schemas.R | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/R/schemas.R b/R/schemas.R index 097b01ffd..cda91e4ec 100644 --- a/R/schemas.R +++ b/R/schemas.R @@ -17,8 +17,9 @@ new <- function(id, ...) { } # TODO: if it proves necessary, this could do more meaningful checks -check_against_schema <- function(properties, schema) { - unexpected <- setdiff(names(properties), schema$property) +check_against_schema <- function(x, schema = NULL) { + schema <- schema %||% attr(x, "schema") + unexpected <- setdiff(names(x), schema$property) if (length(unexpected) > 0) { msg <- glue(" Properties not recognized for the {sq(attr(schema, 'id'))} schema: @@ -26,7 +27,7 @@ check_against_schema <- function(properties, schema) { ") rlang::abort(msg) } - invisible(properties) + invisible(x) } id_as_class <- function(id) glue("googlesheets4_{id}") @@ -49,9 +50,8 @@ patch.default <- function(x, ...) { patch.googlesheets4_schema <- function(x, ...) { dots <- rlang::list2(...) - check_against_schema(dots, schema = attr(x, "schema")) x[names(dots)] <- dots - x + check_against_schema(x) } # tibblify ---- From fbf23758b0be5ecbbf3d4da86cb953157aab8203 Mon Sep 17 00:00:00 2001 From: Jenny Bryan Date: Thu, 21 Nov 2019 22:43:56 -0800 Subject: [PATCH 28/28] Add NEWS bullet --- NEWS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/NEWS.md b/NEWS.md index 761207c06..4937ab2a4 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # googlesheets4 (development version) +* `sheets_create()` is a new function to create a new Sheet and, optionally, write one or more data frames into it (#61). *caution: function still under development* + # googlesheets4 0.1.0 * Added a `NEWS.md` file to track changes to the package.