Skip to main content
Glama

sheets.spreadsheets.values.append

Append values to a spreadsheet by finding a table in the given range and adding data to its next row, with input and insert options.

Instructions

Appends values to a spreadsheet. The input range is used to search for existing data and find a "table" within that range. Values will be appended to the next row of the table, starting with the first column of the table. See the guide and sample code for specific details of how tables are detected and data is appended. The caller must specify the spreadsheet ID, range, and a valueInputOption. The valueInputOption only contro [HTTP POST] — creates or triggers a change; refused under --readonly safety profiles. Returns the API's response resource as JSON — request body is a JSON ValueRange object accepting majorDimension, range, values; pass it via params or whole via body_file Siblings over the same resource: batchClear, batchClearByDataFilter, batchGet, batchGetByDataFilter, batchUpdate, batchUpdateByDataFilter, clear, get, update.

Input Schema

NameRequiredDescriptionDefault
queryNoExtra KEY=VALUE query pairs for endpoints whose parameters Discovery does not describe.
rangeYes[URL path segment] The [A1 notation](https://developers.google.com/workspace/sheets/api/guides/concepts#cell) of a range to search for a logical table of data. Values are appended
paramsNoParameter map merged into the request; typed parameters win.
dry_runNoReturn the request that would be sent, without sending it.
body_fileNoRead the request body from this file ('-' for stdin) instead of building one from the parameters. The body is a JSON ValueRange object.
request_bodyNoRequest body of type ValueRange: pass it via `params` (merged into the built body) or whole via `body_file`.
spreadsheetIdYes[URL path segment] The ID of the spreadsheet to update.
insertDataOptionNo[query parameter] How the input data should be inserted. Values: `OVERWRITE` = The new data overwrites existing data in the areas it is written. (Note: adding data to the end of the sheet will still insert new rows or columns so the data can be written.); `INSERT_ROWS` = Rows are inserted for the new data..
valueInputOptionNo[query parameter] How the input data should be interpreted. Values: `INPUT_VALUE_OPTION_UNSPECIFIED` = Default input value. This value must not be used.; `RAW` = The values the user has entered will not be parsed and will be stored as-is.; `USER_ENTERED` = The values will be parsed as if the user typed them into the UI. Numbers will stay as numbers, but strings may be converted to numbers, dates, etc. following the same rules that are applied when entering text into a cell via the Google Sheets UI..
includeValuesInResponseNo[query parameter] Determines if the update response should include the values of the cells that were appended. By default, responses do not include the updated values.
responseValueRenderOptionNo[query parameter] Determines how values in the response should be rendered. The default render option is FORMATTED_VALUE. Values: `FORMATTED_VALUE` = Values will be calculated & formatted in the response according to the cell's formatting. Formatting is based on the spreadsheet's locale, not the requesting user's locale. For example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency, then `A2` would return `"$1.23"`.; `UNFORMATTED_VALUE` = Values will be calculated, but not formatted in the reply. For example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency, then `A2` would return the number `1.23`.; `FORMULA` = Values will not be calculated. The reply will include the formulas. For example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency, then A2 would return `"=A1"`. Sheets treats date and time values as decimal values. This lets you perform arithmetic on them in formulas. For more information on interpreting date and time values, see [About date & time values](https://developers.google.com/workspace/sheets/api/guides/formats#about_date_time_values)..
responseDateTimeRenderOptionNo[query parameter] Determines how dates, times, and durations in the response should be rendered. This is ignored if response_value_render_option is FORMATTED_VALUE. The default d Values: `SERIAL_NUMBER` = Instructs date, time, datetime, and duration fields to be output as doubles in "serial number" format, as popularized by Lotus 1-2-3. The whole number portion of the value (left of the decimal) counts the days since December 30th 1899. The fractional portion (right of the decimal) counts the time as a fraction of the day. For example, January 1st 1900 at noon would be 2.5, 2 because it's 2 days after December 30th 1899, and .5 because noon is half a day. February 1st 1900 at 3pm would be 33.625. This correctly treats the year 1900 as not a leap year.; `FORMATTED_STRING` = Instructs date, time, datetime, and duration fields to be output as strings in their given number format (which depends on the spreadsheet locale)..

Output Schema

NameRequiredDescriptionDefault
updatesNo
tableRangeNo
spreadsheetIdNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / body_file / description
      Previous value: -"Read the request body from this file ('-' for stdin) instead of building one from the parameters."New value: +"Read the request body from this file ('-' for stdin) instead of building one from the parameters. The body is a JSON ValueRange object."
    • addedInput schema / properties / request_body
      Added value: +{
      +  "description": "Request body of type ValueRange: pass it via `params` (merged into the built body) or whole via `body_file`.",
      +  "properties": {
      +    "majorDimension": {
      +      "enum": [
      +        "DIMENSION_UNSPECIFIED",
      +        "ROWS",
      +        "COLUMNS"
      +      ],
      +      "type": "string"
      +    },
      +    "range": {
      +      "type": "string"
      +    },
      +    "values": {
      +      "items": {
      +        "items": {
      +          "type": "any"
      +        },
      +        "type": "array"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
  2. Changed8 schema fields changed
    • changedInput schema / properties / includeValuesInResponse / description
      Previous value: -"Determines if the update response should include the values of the cells that were appended. By default, responses do not include the updated values."New value: +"[query parameter] Determines if the update response should include the values of the cells that were appended. By default, responses do not include the updated values."
    • changedInput schema / properties / insertDataOption / description
      Previous value: -"How the input data should be inserted."New value: +"[query parameter] How the input data should be inserted. Values: `OVERWRITE` = The new data overwrites existing data in the areas it is written. (Note: adding data to the end of the sheet will still insert new rows or columns so the data can be written.); `INSERT_ROWS` = Rows are inserted for the new data.."
    • changedInput schema / properties / range / description
      Previous value: -"The [A1 notation](https://developers.google.com/workspace/sheets/api/guides/concepts#cell) of a range to search for a logical table of data. Values are appended"New value: +"[URL path segment] The [A1 notation](https://developers.google.com/workspace/sheets/api/guides/concepts#cell) of a range to search for a logical table of data. Values are appended"
    • changedInput schema / properties / responseDateTimeRenderOption / description
      Previous value: -"Determines how dates, times, and durations in the response should be rendered. This is ignored if response_value_render_option is FORMATTED_VALUE. The default d"New value: +"[query parameter] Determines how dates, times, and durations in the response should be rendered. This is ignored if response_value_render_option is FORMATTED_VALUE. The default d Values: `SERIAL_NUMBER` = Instructs date, time, datetime, and duration fields to be output as doubles in \"serial number\" format, as popularized by Lotus 1-2-3. The whole number portion of the value (left of the decimal) counts the days since December 30th 1899. The fractional portion (right of the decimal) counts the time as a fraction of the day. For example, January 1st 1900 at noon would be 2.5, 2 because it's 2 days after December 30th 1899, and .5 because noon is half a day. February 1st 1900 at 3pm would be 33.625. This correctly treats the year 1900 as not a leap year.; `FORMATTED_STRING` = Instructs date, time, datetime, and duration fields to be output as strings in their given number format (which depends on the spreadsheet locale).."
    • changedInput schema / properties / responseValueRenderOption / description
      Previous value: -"Determines how values in the response should be rendered. The default render option is FORMATTED_VALUE."New value: +"[query parameter] Determines how values in the response should be rendered. The default render option is FORMATTED_VALUE. Values: `FORMATTED_VALUE` = Values will be calculated & formatted in the response according to the cell's formatting. Formatting is based on the spreadsheet's locale, not the requesting user's locale. For example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency, then `A2` would return `\"$1.23\"`.; `UNFORMATTED_VALUE` = Values will be calculated, but not formatted in the reply. For example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency, then `A2` would return the number `1.23`.; `FORMULA` = Values will not be calculated. The reply will include the formulas. For example, if `A1` is `1.23` and `A2` is `=A1` and formatted as currency, then A2 would return `\"=A1\"`. Sheets treats date and time values as decimal values. This lets you perform arithmetic on them in formulas. For more information on interpreting date and time values, see [About date & time values](https://developers.google.com/workspace/sheets/api/guides/formats#about_date_time_values).."
    • changedInput schema / properties / spreadsheetId / description
      Previous value: -"The ID of the spreadsheet to update."New value: +"[URL path segment] The ID of the spreadsheet to update."
    • changedInput schema / properties / valueInputOption / description
      Previous value: -"How the input data should be interpreted."New value: +"[query parameter] How the input data should be interpreted. Values: `INPUT_VALUE_OPTION_UNSPECIFIED` = Default input value. This value must not be used.; `RAW` = The values the user has entered will not be parsed and will be stored as-is.; `USER_ENTERED` = The values will be parsed as if the user typed them into the UI. Numbers will stay as numbers, but strings may be converted to numbers, dates, etc. following the same rules that are applied when entering text into a cell via the Google Sheets UI.."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "spreadsheetId": {
      +      "type": "string"
      +    },
      +    "tableRange": {
      +      "type": "string"
      +    },
      +    "updates": {
      +      "properties": {
      +        "spreadsheetId": {
      +          "type": "string"
      +        },
      +        "updatedCells": {
      +          "type": "integer"
      +        },
      +        "updatedColumns": {
      +          "type": "integer"
      +        },
      +        "updatedData": {
      +          "properties": {
      +            "majorDimension": {
      +              "enum": [
      +                "DIMENSION_UNSPECIFIED",
      +                "ROWS",
      +                "COLUMNS"
      +              ],
      +              "type": "string"
      +            },
      +            "range": {
      +              "type": "string"
      +            },
      +            "values": {
      +              "items": {
      +                "items": {
      +                  "type": "any"
      +                },
      +                "type": "array"
      +              },
      +              "type": "array"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "updatedRange": {
      +          "type": "string"
      +        },
      +        "updatedRows": {
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  3. First observed

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, and the description does useful work: it discloses the HTTP method and that the call mutates state, warns it is refused under --readonly safety profiles, and explains the return shape and how to pass the ValueRange body via `params` or `body_file`. It does not cover permission/auth requirements, rate limits, or what happens when no table is detected in the range.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded correctly with the core behavior and table semantics first, but the prose is cut off mid-sentence and padded with injected boilerplate ("[HTTP POST] — creates or triggers a change; refused under --readonly safety profiles") plus a bare sibling name dump. Real content competes with template noise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and 12 parameters are fully schema-documented, so the description only needs to carry the append-specific behavior — which it does, including table detection and body passing. It falls short only on routing guidance against the many sibling write methods sharing this resource.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds only that valueInputOption is required — and that sentence is truncated mid-word ("The `valueInputOption` only contro"), so the one piece of extra semantic guidance it attempted is lost.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Appends values to a spreadsheet") and explains the non-obvious table-detection semantics of the input range, which is genuinely informative. It enumerates sibling operations over the same resource but never differentiates them functionally, so an agent still can't tell append from update or batchUpdate without opening those schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage through "The caller must specify the spreadsheet ID, range, and a valueInputOption" and the trailing sibling list, but never states when to choose append over update/batchUpdate or when not to use it. The alternative names are given with no selection criteria, leaving the agent to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Deploy Server

Other Tools