<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="sheets_v4.html">Google Sheets API</a> . <a href="sheets_v4.spreadsheets.html">spreadsheets</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="sheets_v4.spreadsheets.sheets.html">sheets()</a></code>
</p>
<p class="firstline">Returns the sheets Resource.</p>

<p class="toc_element">
  <code><a href="sheets_v4.spreadsheets.values.html">values()</a></code>
</p>
<p class="firstline">Returns the values Resource.</p>

<p class="toc_element">
  <code><a href="#batchUpdate">batchUpdate(spreadsheetId, body, x__xgafv=None)</a></code></p>
<p class="firstline">Applies one or more updates to the spreadsheet.</p>
<p class="toc_element">
  <code><a href="#create">create(body, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a spreadsheet, returning the newly created spreadsheet.</p>
<p class="toc_element">
  <code><a href="#get">get(spreadsheetId, ranges=None, x__xgafv=None, includeGridData=None)</a></code></p>
<p class="firstline">Returns the spreadsheet at the given ID.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="batchUpdate">batchUpdate(spreadsheetId, body, x__xgafv=None)</code>
  <pre>Applies one or more updates to the spreadsheet.

Each request is validated before
being applied. If any request is not valid then the entire request will
fail and nothing will be applied.

Some requests have replies to
give you some information about how
they are applied. The replies will mirror the requests.  For example,
if you applied 4 updates and the 3rd one had a reply, then the
response will have 2 empty replies, the actual reply, and another empty
reply, in that order.

Due to the collaborative nature of spreadsheets, it is not guaranteed that
the spreadsheet will reflect exactly your changes after this completes,
however it is guaranteed that the updates in the request will be
applied together atomically. Your changes may be altered with respect to
collaborator changes. If there are no collaborators, the spreadsheet
should reflect your changes.

Args:
  spreadsheetId: string, The spreadsheet to apply the updates to. (required)
  body: object, The request body. (required)
    The object takes the form of:

{ # The request for updating any aspect of a spreadsheet.
    "responseRanges": [ # Limits the ranges included in the response spreadsheet.
        # Meaningful only if include_spreadsheet_response is 'true'.
      "A String",
    ],
    "includeSpreadsheetInResponse": True or False, # Determines if the update response should include the spreadsheet
        # resource.
    "responseIncludeGridData": True or False, # True if grid data should be returned. Meaningful only if
        # if include_spreadsheet_response is 'true'.
        # This parameter is ignored if a field mask was set in the request.
    "requests": [ # A list of updates to apply to the spreadsheet.
      { # A single kind of update to apply to a spreadsheet.
        "duplicateFilterView": { # Duplicates a particular filter view. # Duplicates a filter view.
          "filterId": 42, # The ID of the filter being duplicated.
        },
        "sortRange": { # Sorts data in rows based on a sort order per column. # Sorts data in a range.
          "range": { # A range on a sheet. # The range to sort.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "sortSpecs": [ # The sort order per column. Later specifications are used when values
              # are equal in the earlier specifications.
            { # A sort order associated with a specific column or row.
              "sortOrder": "A String", # The order data should be sorted.
              "dimensionIndex": 42, # The dimension the sort should be applied to.
            },
          ],
        },
        "updateEmbeddedObjectPosition": { # Update an embedded object's position (such as a moving or resizing a # Updates an embedded object's (e.g. chart, image) position.
            # chart or image).
          "newPosition": { # The position of an embedded object such as a chart. # An explicit position to move the embedded object to.
              # If newPosition.sheetId is set,
              # a new sheet with that ID will be created.
              # If newPosition.newSheet is set to true,
              # a new sheet will be created with an ID that will be chosen for you.
            "newSheet": True or False, # If true, the embedded object will be put on a new sheet whose ID
                # is chosen for you. Used only when writing.
            "sheetId": 42, # The sheet this is on. Set only if the embedded object
                # is on its own sheet. Must be non-negative.
            "overlayPosition": { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
              "anchorCell": { # A coordinate in a sheet. # The cell the object is anchored to.
                  # All indexes are zero-based.
                "rowIndex": 42, # The row index of the coordinate.
                "columnIndex": 42, # The column index of the coordinate.
                "sheetId": 42, # The sheet this coordinate is on.
              },
              "offsetYPixels": 42, # The vertical offset, in pixels, that the object is offset
                  # from the anchor cell.
              "widthPixels": 42, # The width of the object, in pixels. Defaults to 600.
              "offsetXPixels": 42, # The horizontal offset, in pixels, that the object is offset
                  # from the anchor cell.
              "heightPixels": 42, # The height of the object, in pixels. Defaults to 371.
            },
          },
          "fields": "A String", # The fields of OverlayPosition
              # that should be updated when setting a new position. Used only if
              # newPosition.overlayPosition
              # is set, in which case at least one field must
              # be specified.  The root `newPosition.overlayPosition` is implied and
              # should not be specified.
              # A single `"*"` can be used as short-hand for listing every field.
          "objectId": 42, # The ID of the object to moved.
        },
        "updateConditionalFormatRule": { # Updates a conditional format rule at the given index, # Updates an existing conditional format rule.
            # or moves a conditional format rule to another index.
          "index": 42, # The zero-based index of the rule that should be replaced or moved.
          "newIndex": 42, # The zero-based new index the rule should end up at.
          "sheetId": 42, # The sheet of the rule to move.  Required if new_index is set,
              # unused otherwise.
          "rule": { # A rule describing a conditional format. # The rule that should replace the rule at the given index.
            "ranges": [ # The ranges that will be formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
            ],
            "booleanRule": { # A rule that may or may not match, depending on the condition. # The formatting is either "on" or "off" according to the rule.
              "condition": { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format will be applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                "type": "A String", # The type of condition.
                "values": [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    "relativeDate": "A String", # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    "userEnteredValue": "A String", # A value the condition is based on.
                        # The value will be parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=`).
                  },
                ],
              },
              "format": { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &
                  # background color.
                "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                  "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user's locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                      # information about the supported patterns.
                  "type": "A String", # The type of the number format.
                      # When writing, this field must be set.
                },
                "textDirection": "A String", # The direction of the text in the cell.
                "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  "top": 42, # The top padding of the cell.
                  "right": 42, # The right padding of the cell.
                  "bottom": 42, # The bottom padding of the cell.
                  "left": 42, # The left padding of the cell.
                },
                "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn't specified.
                  "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "bold": True or False, # True if the text is bold.
                  "strikethrough": True or False, # True if the text has a strikethrough.
                  "fontFamily": "A String", # The font family.
                  "fontSize": 42, # The size of the font.
                  "italic": True or False, # True if the text is italicized.
                  "underline": True or False, # True if the text is underlined.
                },
                "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                "borders": { # The borders of the cell. # The borders of the cell.
                  "top": { # A border along a cell. # The top border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "right": { # A border along a cell. # The right border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "bottom": { # A border along a cell. # The bottom border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "left": { # A border along a cell. # The left border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                },
                "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
              },
            },
            "gradientRule": { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              "maxpoint": { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
              "midpoint": { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
              "minpoint": { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
            },
          },
        },
        "updateProtectedRange": { # Updates an existing protected range with the specified # Updates a protected range.
            # protectedRangeId.
          "fields": "A String", # The fields that should be updated.  At least one field must be specified.
              # The root `protectedRange` is implied and should not be specified.
              # A single `"*"` can be used as short-hand for listing every field.
          "protectedRange": { # A protected range. # The protected range to update with the new properties.
            "unprotectedRanges": [ # The list of unprotected ranges within a protected sheet.
                # Unprotected ranges are only supported on protected sheets.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
            ],
            "requestingUserCanEdit": True or False, # True if the user who requested this protected range can edit the
                # protected area.
                # This field is read-only.
            "description": "A String", # The description of this protected range.
            "namedRangeId": "A String", # The named range this protected range is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            "editors": { # The editors of a protected range. # The users and groups with edit access to the protected range.
                # This field is only visible to users with edit access to the protected
                # range and the document.
                # Editors are not supported with warning_only protection.
              "domainUsersCanEdit": True or False, # True if anyone in the document's domain has edit access to the protected
                  # range.  Domain protection is only supported on documents within a domain.
              "users": [ # The email addresses of users with edit access to the protected range.
                "A String",
              ],
              "groups": [ # The email addresses of groups with edit access to the protected range.
                "A String",
              ],
            },
            "protectedRangeId": 42, # The ID of the protected range.
                # This field is read-only.
            "warningOnly": True or False, # True if this protected range will show a warning when editing.
                # Warning-based protection means that every user can edit data in the
                # protected range, except editing will prompt a warning asking the user
                # to confirm the edit.
                #
                # When writing: if this field is true, then editors is ignored.
                # Additionally, if this field is changed from true to false and the
                # `editors` field is not set (nor included in the field mask), then
                # the editors will be set to all the editors in the document.
            "range": { # A range on a sheet. # The range that is being protected.
                # The range may be fully unbounded, in which case this is considered
                # a protected sheet.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
          },
        },
        "deleteDimension": { # Deletes the dimensions from the sheet. # Deletes rows or columns in a sheet.
          "range": { # A range along a single dimension on a sheet. # The dimensions to delete from the sheet.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            "endIndex": 42, # The end (exclusive) of the span, or not set if unbounded.
            "startIndex": 42, # The start (inclusive) of the span, or not set if unbounded.
            "sheetId": 42, # The sheet this span is on.
            "dimension": "A String", # The dimension of the span.
          },
        },
        "addProtectedRange": { # Adds a new protected range. # Adds a protected range.
          "protectedRange": { # A protected range. # The protected range to be added. The
              # protectedRangeId field is optional; if
              # one is not set, an id will be randomly generated. (It is an error to
              # specify the ID of a range that already exists.)
            "unprotectedRanges": [ # The list of unprotected ranges within a protected sheet.
                # Unprotected ranges are only supported on protected sheets.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
            ],
            "requestingUserCanEdit": True or False, # True if the user who requested this protected range can edit the
                # protected area.
                # This field is read-only.
            "description": "A String", # The description of this protected range.
            "namedRangeId": "A String", # The named range this protected range is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            "editors": { # The editors of a protected range. # The users and groups with edit access to the protected range.
                # This field is only visible to users with edit access to the protected
                # range and the document.
                # Editors are not supported with warning_only protection.
              "domainUsersCanEdit": True or False, # True if anyone in the document's domain has edit access to the protected
                  # range.  Domain protection is only supported on documents within a domain.
              "users": [ # The email addresses of users with edit access to the protected range.
                "A String",
              ],
              "groups": [ # The email addresses of groups with edit access to the protected range.
                "A String",
              ],
            },
            "protectedRangeId": 42, # The ID of the protected range.
                # This field is read-only.
            "warningOnly": True or False, # True if this protected range will show a warning when editing.
                # Warning-based protection means that every user can edit data in the
                # protected range, except editing will prompt a warning asking the user
                # to confirm the edit.
                #
                # When writing: if this field is true, then editors is ignored.
                # Additionally, if this field is changed from true to false and the
                # `editors` field is not set (nor included in the field mask), then
                # the editors will be set to all the editors in the document.
            "range": { # A range on a sheet. # The range that is being protected.
                # The range may be fully unbounded, in which case this is considered
                # a protected sheet.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
          },
        },
        "deleteEmbeddedObject": { # Deletes the embedded object with the given ID. # Deletes an embedded object (e.g, chart, image) in a sheet.
          "objectId": 42, # The ID of the embedded object to delete.
        },
        "pasteData": { # Inserts data into the spreadsheet starting at the specified coordinate. # Pastes data (HTML or delimited) into a sheet.
          "coordinate": { # A coordinate in a sheet. # The coordinate at which the data should start being inserted.
              # All indexes are zero-based.
            "rowIndex": 42, # The row index of the coordinate.
            "columnIndex": 42, # The column index of the coordinate.
            "sheetId": 42, # The sheet this coordinate is on.
          },
          "type": "A String", # How the data should be pasted.
          "delimiter": "A String", # The delimiter in the data.
          "html": True or False, # True if the data is HTML.
          "data": "A String", # The data to insert.
        },
        "appendCells": { # Adds new cells after the last row with data in a sheet, # Appends cells after the last row with data in a sheet.
            # inserting new rows into the sheet if necessary.
          "fields": "A String", # The fields of CellData that should be updated.
              # At least one field must be specified.
              # The root is the CellData; 'row.values.' should not be specified.
              # A single `"*"` can be used as short-hand for listing every field.
          "rows": [ # The data to append.
            { # Data about each cell in a row.
              "values": [ # The values in the row, one per column.
                { # Data about a specific cell.
                  "pivotTable": { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                      # is computed dynamically based on its data, grouping, filters, values,
                      # etc. Only the top-left cell of the pivot table contains the pivot table
                      # definition. The other cells will contain the calculated values of the
                      # results of the pivot in their effective_value fields.
                    "valueLayout": "A String", # Whether values should be listed horizontally (as columns)
                        # or vertically (as rows).
                    "rows": [ # Each row grouping in the pivot table.
                      { # A single grouping (either row or column) in a pivot table.
                        "showTotals": True or False, # True if the pivot table should include the totals for this grouping.
                        "valueMetadata": [ # Metadata about values in the grouping.
                          { # Metadata about a value in a pivot grouping.
                            "collapsed": True or False, # True if the data corresponding to the value is collapsed.
                            "value": { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                # (Note that formulaValue is not valid,
                                #  because the values will be calculated.)
                              "numberValue": 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # "serial number" format.
                              "boolValue": True or False, # Represents a boolean value.
                              "formulaValue": "A String", # Represents a formula.
                              "stringValue": "A String", # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `'123` into the UI, this would be represented as a `stringValue` of
                                  # `"123"`.
                              "errorValue": { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                "message": "A String", # A message with more information about the error
                                    # (in the spreadsheet's locale).
                                "type": "A String", # The type of error.
                              },
                            },
                          },
                        ],
                        "valueBucket": { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                            # If not specified, sorting is alphabetical by this group's values.
                          "buckets": [ # Determines the bucket from which values are chosen to sort.
                              #
                              # For example, in a pivot table with one row group & two column groups,
                              # the row group can list up to two values. The first value corresponds
                              # to a value within the first column group, and the second value
                              # corresponds to a value in the second column group.  If no values
                              # are listed, this would indicate that the row should be sorted according
                              # to the "Grand Total" over the column groups. If a single value is listed,
                              # this would correspond to using the "Total" of that bucket.
                            { # The kinds of value that a cell in a spreadsheet can have.
                              "numberValue": 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # "serial number" format.
                              "boolValue": True or False, # Represents a boolean value.
                              "formulaValue": "A String", # Represents a formula.
                              "stringValue": "A String", # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `'123` into the UI, this would be represented as a `stringValue` of
                                  # `"123"`.
                              "errorValue": { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                "message": "A String", # A message with more information about the error
                                    # (in the spreadsheet's locale).
                                "type": "A String", # The type of error.
                              },
                            },
                          ],
                          "valuesIndex": 42, # The offset in the PivotTable.values list which the values in this
                              # grouping should be sorted by.
                        },
                        "sortOrder": "A String", # The order the values in this group should be sorted.
                        "sourceColumnOffset": 42, # The column offset of the source range that this grouping is based on.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this group refers to column `C`, whereas the offset `1` would refer
                            # to column `D`.
                      },
                    ],
                    "source": { # A range on a sheet. # The range the pivot table is reading data from.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `"Sheet1"` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                      "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                      "sheetId": 42, # The sheet this range is on.
                      "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                      "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                    },
                    "values": [ # A list of values to include in the pivot table.
                      { # The definition of how a value in a pivot table should be calculated.
                        "formula": "A String", # A custom formula to calculate the value.  The formula must start
                            # with an `=` character.
                        "summarizeFunction": "A String", # A function to summarize the value.
                            # If formula is set, the only supported values are
                            # SUM and
                            # CUSTOM.
                            # If sourceColumnOffset is set, then `CUSTOM`
                            # is not supported.
                        "sourceColumnOffset": 42, # The column offset of the source range that this value reads from.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this value refers to column `C`, whereas the offset `1` would
                            # refer to column `D`.
                        "name": "A String", # A name to use for the value. This is only used if formula was set.
                            # Otherwise, the column name is used.
                      },
                    ],
                    "criteria": { # An optional mapping of filters per source column offset.
                        #
                        # The filters will be applied before aggregating data into the pivot table.
                        # The map's key is the column offset of the source range that you want to
                        # filter, and the value is the criteria for that column.
                        #
                        # For example, if the source was `C10:E15`, a key of `0` will have the filter
                        # for column `C`, whereas the key `1` is for column `D`.
                      "a_key": { # Criteria for showing/hiding rows in a pivot table.
                        "visibleValues": [ # Values that should be included.  Values not listed here are excluded.
                          "A String",
                        ],
                      },
                    },
                    "columns": [ # Each column grouping in the pivot table.
                      { # A single grouping (either row or column) in a pivot table.
                        "showTotals": True or False, # True if the pivot table should include the totals for this grouping.
                        "valueMetadata": [ # Metadata about values in the grouping.
                          { # Metadata about a value in a pivot grouping.
                            "collapsed": True or False, # True if the data corresponding to the value is collapsed.
                            "value": { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                # (Note that formulaValue is not valid,
                                #  because the values will be calculated.)
                              "numberValue": 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # "serial number" format.
                              "boolValue": True or False, # Represents a boolean value.
                              "formulaValue": "A String", # Represents a formula.
                              "stringValue": "A String", # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `'123` into the UI, this would be represented as a `stringValue` of
                                  # `"123"`.
                              "errorValue": { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                "message": "A String", # A message with more information about the error
                                    # (in the spreadsheet's locale).
                                "type": "A String", # The type of error.
                              },
                            },
                          },
                        ],
                        "valueBucket": { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                            # If not specified, sorting is alphabetical by this group's values.
                          "buckets": [ # Determines the bucket from which values are chosen to sort.
                              #
                              # For example, in a pivot table with one row group & two column groups,
                              # the row group can list up to two values. The first value corresponds
                              # to a value within the first column group, and the second value
                              # corresponds to a value in the second column group.  If no values
                              # are listed, this would indicate that the row should be sorted according
                              # to the "Grand Total" over the column groups. If a single value is listed,
                              # this would correspond to using the "Total" of that bucket.
                            { # The kinds of value that a cell in a spreadsheet can have.
                              "numberValue": 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # "serial number" format.
                              "boolValue": True or False, # Represents a boolean value.
                              "formulaValue": "A String", # Represents a formula.
                              "stringValue": "A String", # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `'123` into the UI, this would be represented as a `stringValue` of
                                  # `"123"`.
                              "errorValue": { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                "message": "A String", # A message with more information about the error
                                    # (in the spreadsheet's locale).
                                "type": "A String", # The type of error.
                              },
                            },
                          ],
                          "valuesIndex": 42, # The offset in the PivotTable.values list which the values in this
                              # grouping should be sorted by.
                        },
                        "sortOrder": "A String", # The order the values in this group should be sorted.
                        "sourceColumnOffset": 42, # The column offset of the source range that this grouping is based on.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this group refers to column `C`, whereas the offset `1` would refer
                            # to column `D`.
                      },
                    ],
                  },
                  "hyperlink": "A String", # A hyperlink this cell points to, if any.
                      # This field is read-only.  (To set it, use a `=HYPERLINK` formula.)
                  "effectiveValue": { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this will be
                      # the calculated value.  For cells with literals, this will be
                      # the same as the user_entered_value.
                      # This field is read-only.
                    "numberValue": 3.14, # Represents a double value.
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # "serial number" format.
                    "boolValue": True or False, # Represents a boolean value.
                    "formulaValue": "A String", # Represents a formula.
                    "stringValue": "A String", # Represents a string value.
                        # Leading single quotes are not included. For example, if the user typed
                        # `'123` into the UI, this would be represented as a `stringValue` of
                        # `"123"`.
                    "errorValue": { # An error in a cell. # Represents an error.
                        # This field is read-only.
                      "message": "A String", # A message with more information about the error
                          # (in the spreadsheet's locale).
                      "type": "A String", # The type of error.
                    },
                  },
                  "formattedValue": "A String", # The formatted value of the cell.
                      # This is the value as it's shown to the user.
                      # This field is read-only.
                  "userEnteredValue": { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `'Hello'`, or `=NOW()`
                      # Note: Dates, Times and DateTimes are represented as doubles in
                      # serial number format.
                    "numberValue": 3.14, # Represents a double value.
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # "serial number" format.
                    "boolValue": True or False, # Represents a boolean value.
                    "formulaValue": "A String", # Represents a formula.
                    "stringValue": "A String", # Represents a string value.
                        # Leading single quotes are not included. For example, if the user typed
                        # `'123` into the UI, this would be represented as a `stringValue` of
                        # `"123"`.
                    "errorValue": { # An error in a cell. # Represents an error.
                        # This field is read-only.
                      "message": "A String", # A message with more information about the error
                          # (in the spreadsheet's locale).
                      "type": "A String", # The type of error.
                    },
                  },
                  "note": "A String", # Any note on the cell.
                  "effectiveFormat": { # The format of a cell. # The effective format being used by the cell.
                      # This includes the results of applying any conditional formatting and,
                      # if the cell contains a formula, the computed number format.
                      # If the effective format is the default format, effective format will
                      # not be written.
                      # This field is read-only.
                    "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                      "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                          # the user's locale will be used if necessary for the given type.
                          # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                          # information about the supported patterns.
                      "type": "A String", # The type of the number format.
                          # When writing, this field must be set.
                    },
                    "textDirection": "A String", # The direction of the text in the cell.
                    "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                        # When updating padding, every field must be specified.
                      "top": 42, # The top padding of the cell.
                      "right": 42, # The right padding of the cell.
                      "bottom": 42, # The bottom padding of the cell.
                      "left": 42, # The left padding of the cell.
                    },
                    "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                    "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                    "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                        # Absent values indicate that the field isn't specified.
                      "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "bold": True or False, # True if the text is bold.
                      "strikethrough": True or False, # True if the text has a strikethrough.
                      "fontFamily": "A String", # The font family.
                      "fontSize": 42, # The size of the font.
                      "italic": True or False, # True if the text is italicized.
                      "underline": True or False, # True if the text is underlined.
                    },
                    "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                    "borders": { # The borders of the cell. # The borders of the cell.
                      "top": { # A border along a cell. # The top border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "right": { # A border along a cell. # The right border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "bottom": { # A border along a cell. # The bottom border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "left": { # A border along a cell. # The left border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                    },
                    "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
                  },
                  "userEnteredFormat": { # The format of a cell. # The format the user entered for the cell.
                      #
                      # When writing, the new format will be merged with the existing format.
                    "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                      "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                          # the user's locale will be used if necessary for the given type.
                          # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                          # information about the supported patterns.
                      "type": "A String", # The type of the number format.
                          # When writing, this field must be set.
                    },
                    "textDirection": "A String", # The direction of the text in the cell.
                    "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                        # When updating padding, every field must be specified.
                      "top": 42, # The top padding of the cell.
                      "right": 42, # The right padding of the cell.
                      "bottom": 42, # The bottom padding of the cell.
                      "left": 42, # The left padding of the cell.
                    },
                    "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                    "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                    "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                        # Absent values indicate that the field isn't specified.
                      "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "bold": True or False, # True if the text is bold.
                      "strikethrough": True or False, # True if the text has a strikethrough.
                      "fontFamily": "A String", # The font family.
                      "fontSize": 42, # The size of the font.
                      "italic": True or False, # True if the text is italicized.
                      "underline": True or False, # True if the text is underlined.
                    },
                    "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                    "borders": { # The borders of the cell. # The borders of the cell.
                      "top": { # A border along a cell. # The top border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "right": { # A border along a cell. # The right border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "bottom": { # A border along a cell. # The bottom border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "left": { # A border along a cell. # The left border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                    },
                    "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
                  },
                  "dataValidation": { # A data validation rule. # A data validation rule on the cell, if any.
                      #
                      # When writing, the new data validation rule will overwrite any prior rule.
                    "showCustomUi": True or False, # True if the UI should be customized based on the kind of condition.
                        # If true, "List" conditions will show a dropdown.
                    "strict": True or False, # True if invalid data should be rejected.
                    "inputMessage": "A String", # A message to show the user when adding data to the cell.
                    "condition": { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                        # BooleanConditions are used by conditional formatting,
                        # data validation, and the criteria in filters.
                      "type": "A String", # The type of condition.
                      "values": [ # The values of the condition. The number of supported values depends
                          # on the condition type.  Some support zero values,
                          # others one or two values,
                          # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                        { # The value of the condition.
                          "relativeDate": "A String", # A relative date (based on the current date).
                              # Valid only if the type is
                              # DATE_BEFORE,
                              # DATE_AFTER,
                              # DATE_ON_OR_BEFORE or
                              # DATE_ON_OR_AFTER.
                              #
                              # Relative dates are not supported in data validation.
                              # They are supported only in conditional formatting and
                              # conditional filters.
                          "userEnteredValue": "A String", # A value the condition is based on.
                              # The value will be parsed as if the user typed into a cell.
                              # Formulas are supported (and must begin with an `=`).
                        },
                      ],
                    },
                  },
                  "textFormatRuns": [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                      # on user entered strings, not formulas, bools, or numbers.
                      # Runs start at specific indexes in the text and continue until the next
                      # run. Properties of a run will continue unless explicitly changed
                      # in a subsequent run (and properties of the first run will continue
                      # the properties of the cell unless explicitly changed).
                      #
                      # When writing, the new runs will overwrite any prior runs.  When writing a
                      # new user_entered_value, previous runs will be erased.
                    { # A run of a text format. The format of this run continues until the start
                        # index of the next run.
                        # When updating, all fields must be set.
                      "startIndex": 42, # The character index where this run starts.
                      "format": { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell's format.
                          # Absent values indicate that the field isn't specified.
                        "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "bold": True or False, # True if the text is bold.
                        "strikethrough": True or False, # True if the text has a strikethrough.
                        "fontFamily": "A String", # The font family.
                        "fontSize": 42, # The size of the font.
                        "italic": True or False, # True if the text is italicized.
                        "underline": True or False, # True if the text is underlined.
                      },
                    },
                  ],
                },
              ],
            },
          ],
          "sheetId": 42, # The sheet ID to append the data to.
        },
        "duplicateSheet": { # Duplicates the contents of a sheet. # Duplicates a sheet.
          "sourceSheetId": 42, # The sheet to duplicate.
          "insertSheetIndex": 42, # The zero-based index where the new sheet should be inserted.
              # The index of all sheets after this are incremented.
          "newSheetName": "A String", # The name of the new sheet.  If empty, a new name is chosen for you.
          "newSheetId": 42, # If set, the ID of the new sheet. If not set, an ID is chosen.
              # If set, the ID must not conflict with any existing sheet ID.
              # If set, it must be non-negative.
        },
        "updateSheetProperties": { # Updates properties of the sheet with the specified # Updates a sheet's properties.
            # sheetId.
          "fields": "A String", # The fields that should be updated.  At least one field must be specified.
              # The root `properties` is implied and should not be specified.
              # A single `"*"` can be used as short-hand for listing every field.
          "properties": { # Properties of a sheet. # The properties to update.
            "sheetType": "A String", # The type of sheet. Defaults to GRID.
                # This field cannot be changed once set.
            "index": 42, # The index of the sheet within the spreadsheet.
                # When adding or updating sheet properties, if this field
                # is excluded then the sheet will be added or moved to the end
                # of the sheet list. When updating sheet indices or inserting
                # sheets, movement is considered in "before the move" indexes.
                # For example, if there were 3 sheets (S1, S2, S3) in order to
                # move S1 ahead of S2 the index would have to be set to 2. A sheet
                # index update request will be ignored if the requested index is
                # identical to the sheets current index or if the requested new
                # index is equal to the current sheet index + 1.
            "title": "A String", # The name of the sheet.
            "gridProperties": { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
                # (If the sheet is an object sheet, containing a chart or image, then
                # this field will be absent.)
                # When writing it is an error to set any grid properties on non-grid sheets.
              "columnCount": 42, # The number of columns in the grid.
              "rowCount": 42, # The number of rows in the grid.
              "frozenColumnCount": 42, # The number of columns that are frozen in the grid.
              "hideGridlines": True or False, # True if the grid isn't showing gridlines in the UI.
              "frozenRowCount": 42, # The number of rows that are frozen in the grid.
            },
            "rightToLeft": True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
            "tabColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "hidden": True or False, # True if the sheet is hidden in the UI, false if it's visible.
            "sheetId": 42, # The ID of the sheet. Must be non-negative.
                # This field cannot be changed once set.
          },
        },
        "addChart": { # Adds a chart to a sheet in the spreadsheet. # Adds a chart.
          "chart": { # A chart embedded in a sheet. # The chart that should be added to the spreadsheet, including the position
              # where it should be placed. The chartId
              # field is optional; if one is not set, an id will be randomly generated. (It
              # is an error to specify the ID of a chart that already exists.)
            "chartId": 42, # The ID of the chart.
            "position": { # The position of an embedded object such as a chart. # The position of the chart.
              "newSheet": True or False, # If true, the embedded object will be put on a new sheet whose ID
                  # is chosen for you. Used only when writing.
              "sheetId": 42, # The sheet this is on. Set only if the embedded object
                  # is on its own sheet. Must be non-negative.
              "overlayPosition": { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                "anchorCell": { # A coordinate in a sheet. # The cell the object is anchored to.
                    # All indexes are zero-based.
                  "rowIndex": 42, # The row index of the coordinate.
                  "columnIndex": 42, # The column index of the coordinate.
                  "sheetId": 42, # The sheet this coordinate is on.
                },
                "offsetYPixels": 42, # The vertical offset, in pixels, that the object is offset
                    # from the anchor cell.
                "widthPixels": 42, # The width of the object, in pixels. Defaults to 600.
                "offsetXPixels": 42, # The horizontal offset, in pixels, that the object is offset
                    # from the anchor cell.
                "heightPixels": 42, # The height of the object, in pixels. Defaults to 371.
              },
            },
            "spec": { # The specifications of a chart. # The specification of the chart.
              "hiddenDimensionStrategy": "A String", # Determines how the charts will use hidden rows or columns.
              "pieChart": { # A <a href="/chart/interactive/docs/gallery/piechart">pie chart</a>. # A pie chart specification.
                "series": { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                  "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                    "sources": [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) & all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be contiguous across the domain and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `"Sheet1"` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                        "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                        "sheetId": 42, # The sheet this range is on.
                        "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                        "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                "domain": { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                  "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                    "sources": [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) & all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be contiguous across the domain and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `"Sheet1"` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                        "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                        "sheetId": 42, # The sheet this range is on.
                        "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                        "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                "threeDimensional": True or False, # True if the pie is three dimensional.
                "legendPosition": "A String", # Where the legend of the pie chart should be drawn.
                "pieHole": 3.14, # The size of the hole in the pie chart.
              },
              "basicChart": { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                  # See BasicChartType for the list of all
                  # charts this supports.
                  # of charts this supports.
                "headerCount": 42, # The number of rows or columns in the data that are "headers".
                    # If not set, Google Sheets will guess how many rows are headers based
                    # on the data.
                    #
                    # (Note that BasicChartAxis.title may override the axis title
                    #  inferred from the header values.)
                "series": [ # The data this chart is visualizing.
                  { # A single series of data in a chart.
                      # For example, if charting stock prices over time, multiple series may exist,
                      # one for the "Open Price", "High Price", "Low Price" and "Close Price".
                    "series": { # The data included in a domain or series. # The data being visualized in this chart series.
                      "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                        "sources": [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) & all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be contiguous across the domain and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `"Sheet1"` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                            "sheetId": 42, # The sheet this range is on.
                            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    "targetAxis": "A String", # The minor axis that will specify the range of values for this series.
                        # For example, if charting stocks over time, the "Volume" series
                        # may want to be pinned to the right with the prices pinned to the left,
                        # because the scale of trading volume is different than the scale of
                        # prices.
                        # It is an error to specify an axis that isn't a valid minor axis
                        # for the chart's type.
                    "type": "A String", # The type of this series. Valid only if the
                        # chartType is
                        # COMBO.
                        # Different types will change the way the series is visualized.
                        # Only LINE, AREA,
                        # and COLUMN are supported.
                  },
                ],
                "legendPosition": "A String", # The position of the chart legend.
                "domains": [ # The domain of data this is charting.
                    # Only a single domain is currently supported.
                  { # The domain of a chart.
                      # For example, if charting stock prices over time, this would be the date.
                    "domain": { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                        # this is the data representing the dates.
                      "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                        "sources": [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) & all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be contiguous across the domain and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `"Sheet1"` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                            "sheetId": 42, # The sheet this range is on.
                            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                  },
                ],
                "chartType": "A String", # The type of the chart.
                "axis": [ # The axis on the chart.
                  { # An axis of the chart.
                      # A chart may not have more than one axis per
                      # axis position.
                    "position": "A String", # The position of this axis.
                    "format": { # The format of a run of text in a cell. # The format of the title.
                        # Only valid if the axis is not associated with the domain.
                        # Absent values indicate that the field isn't specified.
                      "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "bold": True or False, # True if the text is bold.
                      "strikethrough": True or False, # True if the text has a strikethrough.
                      "fontFamily": "A String", # The font family.
                      "fontSize": 42, # The size of the font.
                      "italic": True or False, # True if the text is italicized.
                      "underline": True or False, # True if the text is underlined.
                    },
                    "title": "A String", # The title of this axis. If set, this overrides any title inferred
                        # from headers of the data.
                  },
                ],
              },
              "title": "A String", # The title of the chart.
            },
          },
        },
        "addConditionalFormatRule": { # Adds a new conditional format rule at the given index. # Adds a new conditional format rule.
            # All subsequent rules' indexes are incremented.
          "index": 42, # The zero-based index where the rule should be inserted.
          "rule": { # A rule describing a conditional format. # The rule to add.
            "ranges": [ # The ranges that will be formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
            ],
            "booleanRule": { # A rule that may or may not match, depending on the condition. # The formatting is either "on" or "off" according to the rule.
              "condition": { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format will be applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                "type": "A String", # The type of condition.
                "values": [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    "relativeDate": "A String", # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    "userEnteredValue": "A String", # A value the condition is based on.
                        # The value will be parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=`).
                  },
                ],
              },
              "format": { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &
                  # background color.
                "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                  "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user's locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                      # information about the supported patterns.
                  "type": "A String", # The type of the number format.
                      # When writing, this field must be set.
                },
                "textDirection": "A String", # The direction of the text in the cell.
                "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  "top": 42, # The top padding of the cell.
                  "right": 42, # The right padding of the cell.
                  "bottom": 42, # The bottom padding of the cell.
                  "left": 42, # The left padding of the cell.
                },
                "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn't specified.
                  "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "bold": True or False, # True if the text is bold.
                  "strikethrough": True or False, # True if the text has a strikethrough.
                  "fontFamily": "A String", # The font family.
                  "fontSize": 42, # The size of the font.
                  "italic": True or False, # True if the text is italicized.
                  "underline": True or False, # True if the text is underlined.
                },
                "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                "borders": { # The borders of the cell. # The borders of the cell.
                  "top": { # A border along a cell. # The top border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "right": { # A border along a cell. # The right border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "bottom": { # A border along a cell. # The bottom border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "left": { # A border along a cell. # The left border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                },
                "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
              },
            },
            "gradientRule": { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              "maxpoint": { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
              "midpoint": { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
              "minpoint": { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
            },
          },
        },
        "deleteBanding": { # Removes the banded range with the given ID from the spreadsheet. # Removes a banded range
          "bandedRangeId": 42, # The ID of the banded range to delete.
        },
        "repeatCell": { # Updates all cells in the range to the values in the given Cell object. # Repeats a single cell across a range.
            # Only the fields listed in the fields field are updated; others are
            # unchanged.
            #
            # If writing a cell with a formula, the formula's ranges will automatically
            # increment for each field in the range.
            # For example, if writing a cell with formula `=A1` into range B2:C4,
            # B2 would be `=A1`, B3 would be `=A2`, B4 would be `=A3`,
            # C2 would be `=B1`, C3 would be `=B2`, C4 would be `=B3`.
            #
            # To keep the formula's ranges static, use the `$` indicator.
            # For example, use the formula `=$A$1` to prevent both the row and the
            # column from incrementing.
          "cell": { # Data about a specific cell. # The data to write.
            "pivotTable": { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                # is computed dynamically based on its data, grouping, filters, values,
                # etc. Only the top-left cell of the pivot table contains the pivot table
                # definition. The other cells will contain the calculated values of the
                # results of the pivot in their effective_value fields.
              "valueLayout": "A String", # Whether values should be listed horizontally (as columns)
                  # or vertically (as rows).
              "rows": [ # Each row grouping in the pivot table.
                { # A single grouping (either row or column) in a pivot table.
                  "showTotals": True or False, # True if the pivot table should include the totals for this grouping.
                  "valueMetadata": [ # Metadata about values in the grouping.
                    { # Metadata about a value in a pivot grouping.
                      "collapsed": True or False, # True if the data corresponding to the value is collapsed.
                      "value": { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                          # (Note that formulaValue is not valid,
                          #  because the values will be calculated.)
                        "numberValue": 3.14, # Represents a double value.
                            # Note: Dates, Times and DateTimes are represented as doubles in
                            # "serial number" format.
                        "boolValue": True or False, # Represents a boolean value.
                        "formulaValue": "A String", # Represents a formula.
                        "stringValue": "A String", # Represents a string value.
                            # Leading single quotes are not included. For example, if the user typed
                            # `'123` into the UI, this would be represented as a `stringValue` of
                            # `"123"`.
                        "errorValue": { # An error in a cell. # Represents an error.
                            # This field is read-only.
                          "message": "A String", # A message with more information about the error
                              # (in the spreadsheet's locale).
                          "type": "A String", # The type of error.
                        },
                      },
                    },
                  ],
                  "valueBucket": { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                      # If not specified, sorting is alphabetical by this group's values.
                    "buckets": [ # Determines the bucket from which values are chosen to sort.
                        #
                        # For example, in a pivot table with one row group & two column groups,
                        # the row group can list up to two values. The first value corresponds
                        # to a value within the first column group, and the second value
                        # corresponds to a value in the second column group.  If no values
                        # are listed, this would indicate that the row should be sorted according
                        # to the "Grand Total" over the column groups. If a single value is listed,
                        # this would correspond to using the "Total" of that bucket.
                      { # The kinds of value that a cell in a spreadsheet can have.
                        "numberValue": 3.14, # Represents a double value.
                            # Note: Dates, Times and DateTimes are represented as doubles in
                            # "serial number" format.
                        "boolValue": True or False, # Represents a boolean value.
                        "formulaValue": "A String", # Represents a formula.
                        "stringValue": "A String", # Represents a string value.
                            # Leading single quotes are not included. For example, if the user typed
                            # `'123` into the UI, this would be represented as a `stringValue` of
                            # `"123"`.
                        "errorValue": { # An error in a cell. # Represents an error.
                            # This field is read-only.
                          "message": "A String", # A message with more information about the error
                              # (in the spreadsheet's locale).
                          "type": "A String", # The type of error.
                        },
                      },
                    ],
                    "valuesIndex": 42, # The offset in the PivotTable.values list which the values in this
                        # grouping should be sorted by.
                  },
                  "sortOrder": "A String", # The order the values in this group should be sorted.
                  "sourceColumnOffset": 42, # The column offset of the source range that this grouping is based on.
                      #
                      # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                      # means this group refers to column `C`, whereas the offset `1` would refer
                      # to column `D`.
                },
              ],
              "source": { # A range on a sheet. # The range the pivot table is reading data from.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
              "values": [ # A list of values to include in the pivot table.
                { # The definition of how a value in a pivot table should be calculated.
                  "formula": "A String", # A custom formula to calculate the value.  The formula must start
                      # with an `=` character.
                  "summarizeFunction": "A String", # A function to summarize the value.
                      # If formula is set, the only supported values are
                      # SUM and
                      # CUSTOM.
                      # If sourceColumnOffset is set, then `CUSTOM`
                      # is not supported.
                  "sourceColumnOffset": 42, # The column offset of the source range that this value reads from.
                      #
                      # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                      # means this value refers to column `C`, whereas the offset `1` would
                      # refer to column `D`.
                  "name": "A String", # A name to use for the value. This is only used if formula was set.
                      # Otherwise, the column name is used.
                },
              ],
              "criteria": { # An optional mapping of filters per source column offset.
                  #
                  # The filters will be applied before aggregating data into the pivot table.
                  # The map's key is the column offset of the source range that you want to
                  # filter, and the value is the criteria for that column.
                  #
                  # For example, if the source was `C10:E15`, a key of `0` will have the filter
                  # for column `C`, whereas the key `1` is for column `D`.
                "a_key": { # Criteria for showing/hiding rows in a pivot table.
                  "visibleValues": [ # Values that should be included.  Values not listed here are excluded.
                    "A String",
                  ],
                },
              },
              "columns": [ # Each column grouping in the pivot table.
                { # A single grouping (either row or column) in a pivot table.
                  "showTotals": True or False, # True if the pivot table should include the totals for this grouping.
                  "valueMetadata": [ # Metadata about values in the grouping.
                    { # Metadata about a value in a pivot grouping.
                      "collapsed": True or False, # True if the data corresponding to the value is collapsed.
                      "value": { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                          # (Note that formulaValue is not valid,
                          #  because the values will be calculated.)
                        "numberValue": 3.14, # Represents a double value.
                            # Note: Dates, Times and DateTimes are represented as doubles in
                            # "serial number" format.
                        "boolValue": True or False, # Represents a boolean value.
                        "formulaValue": "A String", # Represents a formula.
                        "stringValue": "A String", # Represents a string value.
                            # Leading single quotes are not included. For example, if the user typed
                            # `'123` into the UI, this would be represented as a `stringValue` of
                            # `"123"`.
                        "errorValue": { # An error in a cell. # Represents an error.
                            # This field is read-only.
                          "message": "A String", # A message with more information about the error
                              # (in the spreadsheet's locale).
                          "type": "A String", # The type of error.
                        },
                      },
                    },
                  ],
                  "valueBucket": { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                      # If not specified, sorting is alphabetical by this group's values.
                    "buckets": [ # Determines the bucket from which values are chosen to sort.
                        #
                        # For example, in a pivot table with one row group & two column groups,
                        # the row group can list up to two values. The first value corresponds
                        # to a value within the first column group, and the second value
                        # corresponds to a value in the second column group.  If no values
                        # are listed, this would indicate that the row should be sorted according
                        # to the "Grand Total" over the column groups. If a single value is listed,
                        # this would correspond to using the "Total" of that bucket.
                      { # The kinds of value that a cell in a spreadsheet can have.
                        "numberValue": 3.14, # Represents a double value.
                            # Note: Dates, Times and DateTimes are represented as doubles in
                            # "serial number" format.
                        "boolValue": True or False, # Represents a boolean value.
                        "formulaValue": "A String", # Represents a formula.
                        "stringValue": "A String", # Represents a string value.
                            # Leading single quotes are not included. For example, if the user typed
                            # `'123` into the UI, this would be represented as a `stringValue` of
                            # `"123"`.
                        "errorValue": { # An error in a cell. # Represents an error.
                            # This field is read-only.
                          "message": "A String", # A message with more information about the error
                              # (in the spreadsheet's locale).
                          "type": "A String", # The type of error.
                        },
                      },
                    ],
                    "valuesIndex": 42, # The offset in the PivotTable.values list which the values in this
                        # grouping should be sorted by.
                  },
                  "sortOrder": "A String", # The order the values in this group should be sorted.
                  "sourceColumnOffset": 42, # The column offset of the source range that this grouping is based on.
                      #
                      # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                      # means this group refers to column `C`, whereas the offset `1` would refer
                      # to column `D`.
                },
              ],
            },
            "hyperlink": "A String", # A hyperlink this cell points to, if any.
                # This field is read-only.  (To set it, use a `=HYPERLINK` formula.)
            "effectiveValue": { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this will be
                # the calculated value.  For cells with literals, this will be
                # the same as the user_entered_value.
                # This field is read-only.
              "numberValue": 3.14, # Represents a double value.
                  # Note: Dates, Times and DateTimes are represented as doubles in
                  # "serial number" format.
              "boolValue": True or False, # Represents a boolean value.
              "formulaValue": "A String", # Represents a formula.
              "stringValue": "A String", # Represents a string value.
                  # Leading single quotes are not included. For example, if the user typed
                  # `'123` into the UI, this would be represented as a `stringValue` of
                  # `"123"`.
              "errorValue": { # An error in a cell. # Represents an error.
                  # This field is read-only.
                "message": "A String", # A message with more information about the error
                    # (in the spreadsheet's locale).
                "type": "A String", # The type of error.
              },
            },
            "formattedValue": "A String", # The formatted value of the cell.
                # This is the value as it's shown to the user.
                # This field is read-only.
            "userEnteredValue": { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `'Hello'`, or `=NOW()`
                # Note: Dates, Times and DateTimes are represented as doubles in
                # serial number format.
              "numberValue": 3.14, # Represents a double value.
                  # Note: Dates, Times and DateTimes are represented as doubles in
                  # "serial number" format.
              "boolValue": True or False, # Represents a boolean value.
              "formulaValue": "A String", # Represents a formula.
              "stringValue": "A String", # Represents a string value.
                  # Leading single quotes are not included. For example, if the user typed
                  # `'123` into the UI, this would be represented as a `stringValue` of
                  # `"123"`.
              "errorValue": { # An error in a cell. # Represents an error.
                  # This field is read-only.
                "message": "A String", # A message with more information about the error
                    # (in the spreadsheet's locale).
                "type": "A String", # The type of error.
              },
            },
            "note": "A String", # Any note on the cell.
            "effectiveFormat": { # The format of a cell. # The effective format being used by the cell.
                # This includes the results of applying any conditional formatting and,
                # if the cell contains a formula, the computed number format.
                # If the effective format is the default format, effective format will
                # not be written.
                # This field is read-only.
              "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                    # the user's locale will be used if necessary for the given type.
                    # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                    # information about the supported patterns.
                "type": "A String", # The type of the number format.
                    # When writing, this field must be set.
              },
              "textDirection": "A String", # The direction of the text in the cell.
              "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                  # When updating padding, every field must be specified.
                "top": 42, # The top padding of the cell.
                "right": 42, # The right padding of the cell.
                "bottom": 42, # The bottom padding of the cell.
                "left": 42, # The left padding of the cell.
              },
              "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
              "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
              "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                  # Absent values indicate that the field isn't specified.
                "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "bold": True or False, # True if the text is bold.
                "strikethrough": True or False, # True if the text has a strikethrough.
                "fontFamily": "A String", # The font family.
                "fontSize": 42, # The size of the font.
                "italic": True or False, # True if the text is italicized.
                "underline": True or False, # True if the text is underlined.
              },
              "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
              "borders": { # The borders of the cell. # The borders of the cell.
                "top": { # A border along a cell. # The top border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
                "right": { # A border along a cell. # The right border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
                "bottom": { # A border along a cell. # The bottom border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
                "left": { # A border along a cell. # The left border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
              },
              "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
            },
            "userEnteredFormat": { # The format of a cell. # The format the user entered for the cell.
                #
                # When writing, the new format will be merged with the existing format.
              "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                    # the user's locale will be used if necessary for the given type.
                    # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                    # information about the supported patterns.
                "type": "A String", # The type of the number format.
                    # When writing, this field must be set.
              },
              "textDirection": "A String", # The direction of the text in the cell.
              "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                  # When updating padding, every field must be specified.
                "top": 42, # The top padding of the cell.
                "right": 42, # The right padding of the cell.
                "bottom": 42, # The bottom padding of the cell.
                "left": 42, # The left padding of the cell.
              },
              "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
              "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
              "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                  # Absent values indicate that the field isn't specified.
                "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "bold": True or False, # True if the text is bold.
                "strikethrough": True or False, # True if the text has a strikethrough.
                "fontFamily": "A String", # The font family.
                "fontSize": 42, # The size of the font.
                "italic": True or False, # True if the text is italicized.
                "underline": True or False, # True if the text is underlined.
              },
              "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
              "borders": { # The borders of the cell. # The borders of the cell.
                "top": { # A border along a cell. # The top border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
                "right": { # A border along a cell. # The right border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
                "bottom": { # A border along a cell. # The bottom border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
                "left": { # A border along a cell. # The left border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
              },
              "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
            },
            "dataValidation": { # A data validation rule. # A data validation rule on the cell, if any.
                #
                # When writing, the new data validation rule will overwrite any prior rule.
              "showCustomUi": True or False, # True if the UI should be customized based on the kind of condition.
                  # If true, "List" conditions will show a dropdown.
              "strict": True or False, # True if invalid data should be rejected.
              "inputMessage": "A String", # A message to show the user when adding data to the cell.
              "condition": { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                "type": "A String", # The type of condition.
                "values": [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    "relativeDate": "A String", # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    "userEnteredValue": "A String", # A value the condition is based on.
                        # The value will be parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=`).
                  },
                ],
              },
            },
            "textFormatRuns": [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                # on user entered strings, not formulas, bools, or numbers.
                # Runs start at specific indexes in the text and continue until the next
                # run. Properties of a run will continue unless explicitly changed
                # in a subsequent run (and properties of the first run will continue
                # the properties of the cell unless explicitly changed).
                #
                # When writing, the new runs will overwrite any prior runs.  When writing a
                # new user_entered_value, previous runs will be erased.
              { # A run of a text format. The format of this run continues until the start
                  # index of the next run.
                  # When updating, all fields must be set.
                "startIndex": 42, # The character index where this run starts.
                "format": { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell's format.
                    # Absent values indicate that the field isn't specified.
                  "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "bold": True or False, # True if the text is bold.
                  "strikethrough": True or False, # True if the text has a strikethrough.
                  "fontFamily": "A String", # The font family.
                  "fontSize": 42, # The size of the font.
                  "italic": True or False, # True if the text is italicized.
                  "underline": True or False, # True if the text is underlined.
                },
              },
            ],
          },
          "fields": "A String", # The fields that should be updated.  At least one field must be specified.
              # The root `cell` is implied and should not be specified.
              # A single `"*"` can be used as short-hand for listing every field.
          "range": { # A range on a sheet. # The range to repeat the cell in.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
        },
        "findReplace": { # Finds and replaces data in cells over a range, sheet, or all sheets. # Finds and replaces occurrences of some text with other text.
          "includeFormulas": True or False, # True if the search should include cells with formulas.
              # False to skip cells with formulas.
          "matchEntireCell": True or False, # True if the find value should match the entire cell.
          "allSheets": True or False, # True to find/replace over all sheets.
          "matchCase": True or False, # True if the search is case sensitive.
          "sheetId": 42, # The sheet to find/replace over.
          "range": { # A range on a sheet. # The range to find/replace over.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "searchByRegex": True or False, # True if the find value is a regex.
              # The regular expression and replacement should follow Java regex rules
              # at https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html.
              # The replacement string is allowed to refer to capturing groups.
              # For example, if one cell has the contents `"Google Sheets"` and another
              # has `"Google Docs"`, then searching for `"o.* (.*)"` with a replacement of
              # `"$1 Rocks"` would change the contents of the cells to
              # `"GSheets Rocks"` and `"GDocs Rocks"` respectively.
          "find": "A String", # The value to search.
          "replacement": "A String", # The value to use as the replacement.
        },
        "setBasicFilter": { # Sets the basic filter associated with a sheet. # Sets the basic filter on a sheet.
          "filter": { # The default filter associated with a sheet. # The filter to set.
            "range": { # A range on a sheet. # The range the filter covers.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "sortSpecs": [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                "sortOrder": "A String", # The order data should be sorted.
                "dimensionIndex": 42, # The dimension the sort should be applied to.
              },
            ],
            "criteria": { # The criteria for showing/hiding values per column.
                # The map's key is the column index, and the value is the criteria for
                # that column.
              "a_key": { # Criteria for showing/hiding rows in a filter or filter view.
                "hiddenValues": [ # Values that should be hidden.
                  "A String",
                ],
                "condition": { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hiddenValues -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  "type": "A String", # The type of condition.
                  "values": [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      "relativeDate": "A String", # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      "userEnteredValue": "A String", # A value the condition is based on.
                          # The value will be parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=`).
                    },
                  ],
                },
              },
            },
          },
        },
        "updateSpreadsheetProperties": { # Updates properties of a spreadsheet. # Updates the spreadsheet's properties.
          "fields": "A String", # The fields that should be updated.  At least one field must be specified.
              # The root 'properties' is implied and should not be specified.
              # A single `"*"` can be used as short-hand for listing every field.
          "properties": { # Properties of a spreadsheet. # The properties to update.
            "locale": "A String", # The locale of the spreadsheet in one of the following formats:
                #
                # * an ISO 639-1 language code such as `en`
                #
                # * an ISO 639-2 language code such as `fil`, if no 639-1 code exists
                #
                # * a combination of the ISO language code and country code, such as `en_US`
                #
                # Note: when updating this field, not all locales/languages are supported.
            "timeZone": "A String", # The time zone of the spreadsheet, in CLDR format such as
                # `America/New_York`. If the time zone isn't recognized, this may
                # be a custom time zone such as `GMT-07:00`.
            "autoRecalc": "A String", # The amount of time to wait before volatile functions are recalculated.
            "defaultFormat": { # The format of a cell. # The default format of all cells in the spreadsheet.
                # CellData.effectiveFormat will not be set if the
                # cell's format is equal to this default format.
                # This field is read-only.
              "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                    # the user's locale will be used if necessary for the given type.
                    # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                    # information about the supported patterns.
                "type": "A String", # The type of the number format.
                    # When writing, this field must be set.
              },
              "textDirection": "A String", # The direction of the text in the cell.
              "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                  # When updating padding, every field must be specified.
                "top": 42, # The top padding of the cell.
                "right": 42, # The right padding of the cell.
                "bottom": 42, # The bottom padding of the cell.
                "left": 42, # The left padding of the cell.
              },
              "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
              "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
              "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                  # Absent values indicate that the field isn't specified.
                "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "bold": True or False, # True if the text is bold.
                "strikethrough": True or False, # True if the text has a strikethrough.
                "fontFamily": "A String", # The font family.
                "fontSize": 42, # The size of the font.
                "italic": True or False, # True if the text is italicized.
                "underline": True or False, # True if the text is underlined.
              },
              "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
              "borders": { # The borders of the cell. # The borders of the cell.
                "top": { # A border along a cell. # The top border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
                "right": { # A border along a cell. # The right border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
                "bottom": { # A border along a cell. # The bottom border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
                "left": { # A border along a cell. # The left border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
              },
              "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
            },
            "title": "A String", # The title of the spreadsheet.
          },
        },
        "updateCells": { # Updates all cells in a range with new data. # Updates many cells at once.
          "fields": "A String", # The fields of CellData that should be updated.
              # At least one field must be specified.
              # The root is the CellData; 'row.values.' should not be specified.
              # A single `"*"` can be used as short-hand for listing every field.
          "range": { # A range on a sheet. # The range to write data to.
              #
              # If the data in rows does not cover the entire requested range,
              # the fields matching those set in fields will be cleared.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "rows": [ # The data to write.
            { # Data about each cell in a row.
              "values": [ # The values in the row, one per column.
                { # Data about a specific cell.
                  "pivotTable": { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                      # is computed dynamically based on its data, grouping, filters, values,
                      # etc. Only the top-left cell of the pivot table contains the pivot table
                      # definition. The other cells will contain the calculated values of the
                      # results of the pivot in their effective_value fields.
                    "valueLayout": "A String", # Whether values should be listed horizontally (as columns)
                        # or vertically (as rows).
                    "rows": [ # Each row grouping in the pivot table.
                      { # A single grouping (either row or column) in a pivot table.
                        "showTotals": True or False, # True if the pivot table should include the totals for this grouping.
                        "valueMetadata": [ # Metadata about values in the grouping.
                          { # Metadata about a value in a pivot grouping.
                            "collapsed": True or False, # True if the data corresponding to the value is collapsed.
                            "value": { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                # (Note that formulaValue is not valid,
                                #  because the values will be calculated.)
                              "numberValue": 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # "serial number" format.
                              "boolValue": True or False, # Represents a boolean value.
                              "formulaValue": "A String", # Represents a formula.
                              "stringValue": "A String", # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `'123` into the UI, this would be represented as a `stringValue` of
                                  # `"123"`.
                              "errorValue": { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                "message": "A String", # A message with more information about the error
                                    # (in the spreadsheet's locale).
                                "type": "A String", # The type of error.
                              },
                            },
                          },
                        ],
                        "valueBucket": { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                            # If not specified, sorting is alphabetical by this group's values.
                          "buckets": [ # Determines the bucket from which values are chosen to sort.
                              #
                              # For example, in a pivot table with one row group & two column groups,
                              # the row group can list up to two values. The first value corresponds
                              # to a value within the first column group, and the second value
                              # corresponds to a value in the second column group.  If no values
                              # are listed, this would indicate that the row should be sorted according
                              # to the "Grand Total" over the column groups. If a single value is listed,
                              # this would correspond to using the "Total" of that bucket.
                            { # The kinds of value that a cell in a spreadsheet can have.
                              "numberValue": 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # "serial number" format.
                              "boolValue": True or False, # Represents a boolean value.
                              "formulaValue": "A String", # Represents a formula.
                              "stringValue": "A String", # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `'123` into the UI, this would be represented as a `stringValue` of
                                  # `"123"`.
                              "errorValue": { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                "message": "A String", # A message with more information about the error
                                    # (in the spreadsheet's locale).
                                "type": "A String", # The type of error.
                              },
                            },
                          ],
                          "valuesIndex": 42, # The offset in the PivotTable.values list which the values in this
                              # grouping should be sorted by.
                        },
                        "sortOrder": "A String", # The order the values in this group should be sorted.
                        "sourceColumnOffset": 42, # The column offset of the source range that this grouping is based on.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this group refers to column `C`, whereas the offset `1` would refer
                            # to column `D`.
                      },
                    ],
                    "source": { # A range on a sheet. # The range the pivot table is reading data from.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `"Sheet1"` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                      "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                      "sheetId": 42, # The sheet this range is on.
                      "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                      "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                    },
                    "values": [ # A list of values to include in the pivot table.
                      { # The definition of how a value in a pivot table should be calculated.
                        "formula": "A String", # A custom formula to calculate the value.  The formula must start
                            # with an `=` character.
                        "summarizeFunction": "A String", # A function to summarize the value.
                            # If formula is set, the only supported values are
                            # SUM and
                            # CUSTOM.
                            # If sourceColumnOffset is set, then `CUSTOM`
                            # is not supported.
                        "sourceColumnOffset": 42, # The column offset of the source range that this value reads from.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this value refers to column `C`, whereas the offset `1` would
                            # refer to column `D`.
                        "name": "A String", # A name to use for the value. This is only used if formula was set.
                            # Otherwise, the column name is used.
                      },
                    ],
                    "criteria": { # An optional mapping of filters per source column offset.
                        #
                        # The filters will be applied before aggregating data into the pivot table.
                        # The map's key is the column offset of the source range that you want to
                        # filter, and the value is the criteria for that column.
                        #
                        # For example, if the source was `C10:E15`, a key of `0` will have the filter
                        # for column `C`, whereas the key `1` is for column `D`.
                      "a_key": { # Criteria for showing/hiding rows in a pivot table.
                        "visibleValues": [ # Values that should be included.  Values not listed here are excluded.
                          "A String",
                        ],
                      },
                    },
                    "columns": [ # Each column grouping in the pivot table.
                      { # A single grouping (either row or column) in a pivot table.
                        "showTotals": True or False, # True if the pivot table should include the totals for this grouping.
                        "valueMetadata": [ # Metadata about values in the grouping.
                          { # Metadata about a value in a pivot grouping.
                            "collapsed": True or False, # True if the data corresponding to the value is collapsed.
                            "value": { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                # (Note that formulaValue is not valid,
                                #  because the values will be calculated.)
                              "numberValue": 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # "serial number" format.
                              "boolValue": True or False, # Represents a boolean value.
                              "formulaValue": "A String", # Represents a formula.
                              "stringValue": "A String", # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `'123` into the UI, this would be represented as a `stringValue` of
                                  # `"123"`.
                              "errorValue": { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                "message": "A String", # A message with more information about the error
                                    # (in the spreadsheet's locale).
                                "type": "A String", # The type of error.
                              },
                            },
                          },
                        ],
                        "valueBucket": { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                            # If not specified, sorting is alphabetical by this group's values.
                          "buckets": [ # Determines the bucket from which values are chosen to sort.
                              #
                              # For example, in a pivot table with one row group & two column groups,
                              # the row group can list up to two values. The first value corresponds
                              # to a value within the first column group, and the second value
                              # corresponds to a value in the second column group.  If no values
                              # are listed, this would indicate that the row should be sorted according
                              # to the "Grand Total" over the column groups. If a single value is listed,
                              # this would correspond to using the "Total" of that bucket.
                            { # The kinds of value that a cell in a spreadsheet can have.
                              "numberValue": 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # "serial number" format.
                              "boolValue": True or False, # Represents a boolean value.
                              "formulaValue": "A String", # Represents a formula.
                              "stringValue": "A String", # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `'123` into the UI, this would be represented as a `stringValue` of
                                  # `"123"`.
                              "errorValue": { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                "message": "A String", # A message with more information about the error
                                    # (in the spreadsheet's locale).
                                "type": "A String", # The type of error.
                              },
                            },
                          ],
                          "valuesIndex": 42, # The offset in the PivotTable.values list which the values in this
                              # grouping should be sorted by.
                        },
                        "sortOrder": "A String", # The order the values in this group should be sorted.
                        "sourceColumnOffset": 42, # The column offset of the source range that this grouping is based on.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this group refers to column `C`, whereas the offset `1` would refer
                            # to column `D`.
                      },
                    ],
                  },
                  "hyperlink": "A String", # A hyperlink this cell points to, if any.
                      # This field is read-only.  (To set it, use a `=HYPERLINK` formula.)
                  "effectiveValue": { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this will be
                      # the calculated value.  For cells with literals, this will be
                      # the same as the user_entered_value.
                      # This field is read-only.
                    "numberValue": 3.14, # Represents a double value.
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # "serial number" format.
                    "boolValue": True or False, # Represents a boolean value.
                    "formulaValue": "A String", # Represents a formula.
                    "stringValue": "A String", # Represents a string value.
                        # Leading single quotes are not included. For example, if the user typed
                        # `'123` into the UI, this would be represented as a `stringValue` of
                        # `"123"`.
                    "errorValue": { # An error in a cell. # Represents an error.
                        # This field is read-only.
                      "message": "A String", # A message with more information about the error
                          # (in the spreadsheet's locale).
                      "type": "A String", # The type of error.
                    },
                  },
                  "formattedValue": "A String", # The formatted value of the cell.
                      # This is the value as it's shown to the user.
                      # This field is read-only.
                  "userEnteredValue": { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `'Hello'`, or `=NOW()`
                      # Note: Dates, Times and DateTimes are represented as doubles in
                      # serial number format.
                    "numberValue": 3.14, # Represents a double value.
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # "serial number" format.
                    "boolValue": True or False, # Represents a boolean value.
                    "formulaValue": "A String", # Represents a formula.
                    "stringValue": "A String", # Represents a string value.
                        # Leading single quotes are not included. For example, if the user typed
                        # `'123` into the UI, this would be represented as a `stringValue` of
                        # `"123"`.
                    "errorValue": { # An error in a cell. # Represents an error.
                        # This field is read-only.
                      "message": "A String", # A message with more information about the error
                          # (in the spreadsheet's locale).
                      "type": "A String", # The type of error.
                    },
                  },
                  "note": "A String", # Any note on the cell.
                  "effectiveFormat": { # The format of a cell. # The effective format being used by the cell.
                      # This includes the results of applying any conditional formatting and,
                      # if the cell contains a formula, the computed number format.
                      # If the effective format is the default format, effective format will
                      # not be written.
                      # This field is read-only.
                    "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                      "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                          # the user's locale will be used if necessary for the given type.
                          # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                          # information about the supported patterns.
                      "type": "A String", # The type of the number format.
                          # When writing, this field must be set.
                    },
                    "textDirection": "A String", # The direction of the text in the cell.
                    "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                        # When updating padding, every field must be specified.
                      "top": 42, # The top padding of the cell.
                      "right": 42, # The right padding of the cell.
                      "bottom": 42, # The bottom padding of the cell.
                      "left": 42, # The left padding of the cell.
                    },
                    "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                    "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                    "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                        # Absent values indicate that the field isn't specified.
                      "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "bold": True or False, # True if the text is bold.
                      "strikethrough": True or False, # True if the text has a strikethrough.
                      "fontFamily": "A String", # The font family.
                      "fontSize": 42, # The size of the font.
                      "italic": True or False, # True if the text is italicized.
                      "underline": True or False, # True if the text is underlined.
                    },
                    "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                    "borders": { # The borders of the cell. # The borders of the cell.
                      "top": { # A border along a cell. # The top border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "right": { # A border along a cell. # The right border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "bottom": { # A border along a cell. # The bottom border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "left": { # A border along a cell. # The left border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                    },
                    "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
                  },
                  "userEnteredFormat": { # The format of a cell. # The format the user entered for the cell.
                      #
                      # When writing, the new format will be merged with the existing format.
                    "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                      "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                          # the user's locale will be used if necessary for the given type.
                          # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                          # information about the supported patterns.
                      "type": "A String", # The type of the number format.
                          # When writing, this field must be set.
                    },
                    "textDirection": "A String", # The direction of the text in the cell.
                    "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                        # When updating padding, every field must be specified.
                      "top": 42, # The top padding of the cell.
                      "right": 42, # The right padding of the cell.
                      "bottom": 42, # The bottom padding of the cell.
                      "left": 42, # The left padding of the cell.
                    },
                    "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                    "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                    "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                        # Absent values indicate that the field isn't specified.
                      "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "bold": True or False, # True if the text is bold.
                      "strikethrough": True or False, # True if the text has a strikethrough.
                      "fontFamily": "A String", # The font family.
                      "fontSize": 42, # The size of the font.
                      "italic": True or False, # True if the text is italicized.
                      "underline": True or False, # True if the text is underlined.
                    },
                    "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                    "borders": { # The borders of the cell. # The borders of the cell.
                      "top": { # A border along a cell. # The top border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "right": { # A border along a cell. # The right border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "bottom": { # A border along a cell. # The bottom border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "left": { # A border along a cell. # The left border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                    },
                    "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
                  },
                  "dataValidation": { # A data validation rule. # A data validation rule on the cell, if any.
                      #
                      # When writing, the new data validation rule will overwrite any prior rule.
                    "showCustomUi": True or False, # True if the UI should be customized based on the kind of condition.
                        # If true, "List" conditions will show a dropdown.
                    "strict": True or False, # True if invalid data should be rejected.
                    "inputMessage": "A String", # A message to show the user when adding data to the cell.
                    "condition": { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                        # BooleanConditions are used by conditional formatting,
                        # data validation, and the criteria in filters.
                      "type": "A String", # The type of condition.
                      "values": [ # The values of the condition. The number of supported values depends
                          # on the condition type.  Some support zero values,
                          # others one or two values,
                          # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                        { # The value of the condition.
                          "relativeDate": "A String", # A relative date (based on the current date).
                              # Valid only if the type is
                              # DATE_BEFORE,
                              # DATE_AFTER,
                              # DATE_ON_OR_BEFORE or
                              # DATE_ON_OR_AFTER.
                              #
                              # Relative dates are not supported in data validation.
                              # They are supported only in conditional formatting and
                              # conditional filters.
                          "userEnteredValue": "A String", # A value the condition is based on.
                              # The value will be parsed as if the user typed into a cell.
                              # Formulas are supported (and must begin with an `=`).
                        },
                      ],
                    },
                  },
                  "textFormatRuns": [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                      # on user entered strings, not formulas, bools, or numbers.
                      # Runs start at specific indexes in the text and continue until the next
                      # run. Properties of a run will continue unless explicitly changed
                      # in a subsequent run (and properties of the first run will continue
                      # the properties of the cell unless explicitly changed).
                      #
                      # When writing, the new runs will overwrite any prior runs.  When writing a
                      # new user_entered_value, previous runs will be erased.
                    { # A run of a text format. The format of this run continues until the start
                        # index of the next run.
                        # When updating, all fields must be set.
                      "startIndex": 42, # The character index where this run starts.
                      "format": { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell's format.
                          # Absent values indicate that the field isn't specified.
                        "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "bold": True or False, # True if the text is bold.
                        "strikethrough": True or False, # True if the text has a strikethrough.
                        "fontFamily": "A String", # The font family.
                        "fontSize": 42, # The size of the font.
                        "italic": True or False, # True if the text is italicized.
                        "underline": True or False, # True if the text is underlined.
                      },
                    },
                  ],
                },
              ],
            },
          ],
          "start": { # A coordinate in a sheet. # The coordinate to start writing data at.
              # Any number of rows and columns (including a different number of
              # columns per row) may be written.
              # All indexes are zero-based.
            "rowIndex": 42, # The row index of the coordinate.
            "columnIndex": 42, # The column index of the coordinate.
            "sheetId": 42, # The sheet this coordinate is on.
          },
        },
        "autoFill": { # Fills in more data based on existing data. # Automatically fills in more data based on existing data.
          "useAlternateSeries": True or False, # True if we should generate data with the "alternate" series.
              # This differs based on the type and amount of source data.
          "range": { # A range on a sheet. # The range to autofill. This will examine the range and detect
              # the location that has data and automatically fill that data
              # in to the rest of the range.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "sourceAndDestination": { # A combination of a source range and how to extend that source. # The source and destination areas to autofill.
              # This explicitly lists the source of the autofill and where to
              # extend that data.
            "source": { # A range on a sheet. # The location of the data to use as the source of the autofill.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "dimension": "A String", # The dimension that data should be filled into.
            "fillLength": 42, # The number of rows or columns that data should be filled into.
                # Positive numbers expand beyond the last row or last column
                # of the source.  Negative numbers expand before the first row
                # or first column of the source.
          },
        },
        "appendDimension": { # Appends rows or columns to the end of a sheet. # Appends dimensions to the end of a sheet.
          "length": 42, # The number of rows or columns to append.
          "sheetId": 42, # The sheet to append rows or columns to.
          "dimension": "A String", # Whether rows or columns should be appended.
        },
        "updateBanding": { # Updates properties of the supplied banded range. # Updates a banded range
          "fields": "A String", # The fields that should be updated.  At least one field must be specified.
              # The root `bandedRange` is implied and should not be specified.
              # A single `"*"` can be used as short-hand for listing every field.
          "bandedRange": { # A banded (alternating colors) range in a sheet. # The banded range to update with the new properties.
            "range": { # A range on a sheet. # The range over which these properties are applied.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "columnProperties": { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties will be applied on a column-
                # by-column basis throughout all the columns in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              "secondBandColor": { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "headerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first
                  # row or column will be filled with this color and the colors will
                  # alternate between first_band_color and second_band_color starting
                  # from the second row or column. Otherwise, the first row or column will be
                  # filled with first_band_color and the colors will proceed to alternate
                  # as they normally would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "footerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column will be filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "firstBandColor": { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
            },
            "rowProperties": { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties will be applied on a row-by-row
                # basis throughout all the rows in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              "secondBandColor": { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "headerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first
                  # row or column will be filled with this color and the colors will
                  # alternate between first_band_color and second_band_color starting
                  # from the second row or column. Otherwise, the first row or column will be
                  # filled with first_band_color and the colors will proceed to alternate
                  # as they normally would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "footerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column will be filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "firstBandColor": { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
            },
            "bandedRangeId": 42, # The id of the banded range.
          },
        },
        "autoResizeDimensions": { # Automatically resizes one or more dimensions based on the contents # Automatically resizes one or more dimensions based on the contents
            # of the cells in that dimension.
            # of the cells in that dimension.
          "dimensions": { # A range along a single dimension on a sheet. # The dimensions to automatically resize.
              # Only COLUMNS are supported.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            "endIndex": 42, # The end (exclusive) of the span, or not set if unbounded.
            "startIndex": 42, # The start (inclusive) of the span, or not set if unbounded.
            "sheetId": 42, # The sheet this span is on.
            "dimension": "A String", # The dimension of the span.
          },
        },
        "updateDimensionProperties": { # Updates properties of dimensions within the specified range. # Updates dimensions' properties.
          "fields": "A String", # The fields that should be updated.  At least one field must be specified.
              # The root `properties` is implied and should not be specified.
              # A single `"*"` can be used as short-hand for listing every field.
          "range": { # A range along a single dimension on a sheet. # The rows or columns to update.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            "endIndex": 42, # The end (exclusive) of the span, or not set if unbounded.
            "startIndex": 42, # The start (inclusive) of the span, or not set if unbounded.
            "sheetId": 42, # The sheet this span is on.
            "dimension": "A String", # The dimension of the span.
          },
          "properties": { # Properties about a dimension. # Properties to update.
            "pixelSize": 42, # The height (if a row) or width (if a column) of the dimension in pixels.
            "hiddenByUser": True or False, # True if this dimension is explicitly hidden.
            "hiddenByFilter": True or False, # True if this dimension is being filtered.
                # This field is read-only.
          },
        },
        "unmergeCells": { # Unmerges cells in the given range. # Unmerges merged cells.
          "range": { # A range on a sheet. # The range within which all cells should be unmerged.
              # If the range spans multiple merges, all will be unmerged.
              # The range must not partially span any merge.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
        },
        "setDataValidation": { # Sets a data validation rule to every cell in the range. # Sets data validation for one or more cells.
            # To clear validation in a range, call this with no rule specified.
          "range": { # A range on a sheet. # The range the data validation rule should apply to.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "rule": { # A data validation rule. # The data validation rule to set on each cell in the range,
              # or empty to clear the data validation in the range.
            "showCustomUi": True or False, # True if the UI should be customized based on the kind of condition.
                # If true, "List" conditions will show a dropdown.
            "strict": True or False, # True if invalid data should be rejected.
            "inputMessage": "A String", # A message to show the user when adding data to the cell.
            "condition": { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                # BooleanConditions are used by conditional formatting,
                # data validation, and the criteria in filters.
              "type": "A String", # The type of condition.
              "values": [ # The values of the condition. The number of supported values depends
                  # on the condition type.  Some support zero values,
                  # others one or two values,
                  # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                { # The value of the condition.
                  "relativeDate": "A String", # A relative date (based on the current date).
                      # Valid only if the type is
                      # DATE_BEFORE,
                      # DATE_AFTER,
                      # DATE_ON_OR_BEFORE or
                      # DATE_ON_OR_AFTER.
                      #
                      # Relative dates are not supported in data validation.
                      # They are supported only in conditional formatting and
                      # conditional filters.
                  "userEnteredValue": "A String", # A value the condition is based on.
                      # The value will be parsed as if the user typed into a cell.
                      # Formulas are supported (and must begin with an `=`).
                },
              ],
            },
          },
        },
        "clearBasicFilter": { # Clears the basic filter, if any exists on the sheet. # Clears the basic filter on a sheet.
          "sheetId": 42, # The sheet ID on which the basic filter should be cleared.
        },
        "addNamedRange": { # Adds a named range to the spreadsheet. # Adds a named range.
          "namedRange": { # A named range. # The named range to add. The namedRangeId
              # field is optional; if one is not set, an id will be randomly generated. (It
              # is an error to specify the ID of a range that already exists.)
            "namedRangeId": "A String", # The ID of the named range.
            "range": { # A range on a sheet. # The range this represents.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "name": "A String", # The name of the named range.
          },
        },
        "updateChartSpec": { # Updates a chart's specifications. # Updates a chart's specifications.
            # (This does not move or resize a chart. To move or resize a chart, use
            #  UpdateEmbeddedObjectPositionRequest.)
          "chartId": 42, # The ID of the chart to update.
          "spec": { # The specifications of a chart. # The specification to apply to the chart.
            "hiddenDimensionStrategy": "A String", # Determines how the charts will use hidden rows or columns.
            "pieChart": { # A <a href="/chart/interactive/docs/gallery/piechart">pie chart</a>. # A pie chart specification.
              "series": { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                  "sources": [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) & all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be contiguous across the domain and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `"Sheet1"` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                      "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                      "sheetId": 42, # The sheet this range is on.
                      "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                      "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              "domain": { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                  "sources": [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) & all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be contiguous across the domain and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `"Sheet1"` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                      "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                      "sheetId": 42, # The sheet this range is on.
                      "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                      "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              "threeDimensional": True or False, # True if the pie is three dimensional.
              "legendPosition": "A String", # Where the legend of the pie chart should be drawn.
              "pieHole": 3.14, # The size of the hole in the pie chart.
            },
            "basicChart": { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                # See BasicChartType for the list of all
                # charts this supports.
                # of charts this supports.
              "headerCount": 42, # The number of rows or columns in the data that are "headers".
                  # If not set, Google Sheets will guess how many rows are headers based
                  # on the data.
                  #
                  # (Note that BasicChartAxis.title may override the axis title
                  #  inferred from the header values.)
              "series": [ # The data this chart is visualizing.
                { # A single series of data in a chart.
                    # For example, if charting stock prices over time, multiple series may exist,
                    # one for the "Open Price", "High Price", "Low Price" and "Close Price".
                  "series": { # The data included in a domain or series. # The data being visualized in this chart series.
                    "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                      "sources": [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) & all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be contiguous across the domain and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `"Sheet1"` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                          "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                          "sheetId": 42, # The sheet this range is on.
                          "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                          "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  "targetAxis": "A String", # The minor axis that will specify the range of values for this series.
                      # For example, if charting stocks over time, the "Volume" series
                      # may want to be pinned to the right with the prices pinned to the left,
                      # because the scale of trading volume is different than the scale of
                      # prices.
                      # It is an error to specify an axis that isn't a valid minor axis
                      # for the chart's type.
                  "type": "A String", # The type of this series. Valid only if the
                      # chartType is
                      # COMBO.
                      # Different types will change the way the series is visualized.
                      # Only LINE, AREA,
                      # and COLUMN are supported.
                },
              ],
              "legendPosition": "A String", # The position of the chart legend.
              "domains": [ # The domain of data this is charting.
                  # Only a single domain is currently supported.
                { # The domain of a chart.
                    # For example, if charting stock prices over time, this would be the date.
                  "domain": { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                      # this is the data representing the dates.
                    "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                      "sources": [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) & all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be contiguous across the domain and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `"Sheet1"` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                          "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                          "sheetId": 42, # The sheet this range is on.
                          "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                          "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
              ],
              "chartType": "A String", # The type of the chart.
              "axis": [ # The axis on the chart.
                { # An axis of the chart.
                    # A chart may not have more than one axis per
                    # axis position.
                  "position": "A String", # The position of this axis.
                  "format": { # The format of a run of text in a cell. # The format of the title.
                      # Only valid if the axis is not associated with the domain.
                      # Absent values indicate that the field isn't specified.
                    "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "bold": True or False, # True if the text is bold.
                    "strikethrough": True or False, # True if the text has a strikethrough.
                    "fontFamily": "A String", # The font family.
                    "fontSize": 42, # The size of the font.
                    "italic": True or False, # True if the text is italicized.
                    "underline": True or False, # True if the text is underlined.
                  },
                  "title": "A String", # The title of this axis. If set, this overrides any title inferred
                      # from headers of the data.
                },
              ],
            },
            "title": "A String", # The title of the chart.
          },
        },
        "moveDimension": { # Moves one or more rows or columns. # Moves rows or columns to another location in a sheet.
          "source": { # A range along a single dimension on a sheet. # The source dimensions to move.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            "endIndex": 42, # The end (exclusive) of the span, or not set if unbounded.
            "startIndex": 42, # The start (inclusive) of the span, or not set if unbounded.
            "sheetId": 42, # The sheet this span is on.
            "dimension": "A String", # The dimension of the span.
          },
          "destinationIndex": 42, # The zero-based start index of where to move the source data to,
              # based on the coordinates *before* the source data is removed
              # from the grid.  Existing data will be shifted down or right
              # (depending on the dimension) to make room for the moved dimensions.
              # The source dimensions are removed from the grid, so the
              # the data may end up in a different index than specified.
              #
              # For example, given `A1..A5` of `0, 1, 2, 3, 4` and wanting to move
              # `"1"` and `"2"` to between `"3"` and `"4"`, the source would be
              # `ROWS [1..3)`,and the destination index would be `"4"`
              # (the zero-based index of row 5).
              # The end result would be `A1..A5` of `0, 3, 1, 2, 4`.
        },
        "textToColumns": { # Splits a column of text into multiple columns, # Converts a column of text into many columns of text.
            # based on a delimiter in each cell.
          "source": { # A range on a sheet. # The source data range.  This must span exactly one column.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "delimiter": "A String", # The delimiter to use. Used only if delimiterType is
              # CUSTOM.
          "delimiterType": "A String", # The delimiter type to use.
        },
        "addBanding": { # Adds a new banded range to the spreadsheet. # Adds a new banded range
          "bandedRange": { # A banded (alternating colors) range in a sheet. # The banded range to add. The bandedRangeId
              # field is optional; if one is not set, an id will be randomly generated. (It
              # is an error to specify the ID of a range that already exists.)
            "range": { # A range on a sheet. # The range over which these properties are applied.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "columnProperties": { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties will be applied on a column-
                # by-column basis throughout all the columns in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              "secondBandColor": { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "headerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first
                  # row or column will be filled with this color and the colors will
                  # alternate between first_band_color and second_band_color starting
                  # from the second row or column. Otherwise, the first row or column will be
                  # filled with first_band_color and the colors will proceed to alternate
                  # as they normally would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "footerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column will be filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "firstBandColor": { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
            },
            "rowProperties": { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties will be applied on a row-by-row
                # basis throughout all the rows in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              "secondBandColor": { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "headerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first
                  # row or column will be filled with this color and the colors will
                  # alternate between first_band_color and second_band_color starting
                  # from the second row or column. Otherwise, the first row or column will be
                  # filled with first_band_color and the colors will proceed to alternate
                  # as they normally would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "footerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column will be filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "firstBandColor": { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
            },
            "bandedRangeId": 42, # The id of the banded range.
          },
        },
        "deleteFilterView": { # Deletes a particular filter view. # Deletes a filter view from a sheet.
          "filterId": 42, # The ID of the filter to delete.
        },
        "mergeCells": { # Merges all cells in the range. # Merges cells together.
          "range": { # A range on a sheet. # The range of cells to merge.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "mergeType": "A String", # How the cells should be merged.
        },
        "deleteProtectedRange": { # Deletes the protected range with the given ID. # Deletes a protected range.
          "protectedRangeId": 42, # The ID of the protected range to delete.
        },
        "addFilterView": { # Adds a filter view. # Adds a filter view.
          "filter": { # A filter view. # The filter to add. The filterViewId
              # field is optional; if one is not set, an id will be randomly generated. (It
              # is an error to specify the ID of a filter that already exists.)
            "title": "A String", # The name of the filter view.
            "namedRangeId": "A String", # The named range this filter view is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            "filterViewId": 42, # The ID of the filter view.
            "range": { # A range on a sheet. # The range this filter view covers.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "sortSpecs": [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                "sortOrder": "A String", # The order data should be sorted.
                "dimensionIndex": 42, # The dimension the sort should be applied to.
              },
            ],
            "criteria": { # The criteria for showing/hiding values per column.
                # The map's key is the column index, and the value is the criteria for
                # that column.
              "a_key": { # Criteria for showing/hiding rows in a filter or filter view.
                "hiddenValues": [ # Values that should be hidden.
                  "A String",
                ],
                "condition": { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hiddenValues -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  "type": "A String", # The type of condition.
                  "values": [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      "relativeDate": "A String", # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      "userEnteredValue": "A String", # A value the condition is based on.
                          # The value will be parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=`).
                    },
                  ],
                },
              },
            },
          },
        },
        "deleteSheet": { # Deletes the requested sheet. # Deletes a sheet.
          "sheetId": 42, # The ID of the sheet to delete.
        },
        "updateBorders": { # Updates the borders of a range. # Updates the borders in a range of cells.
            # If a field is not set in the request, that means the border remains as-is.
            # For example, with two subsequent UpdateBordersRequest:
            #
            #  1. range: A1:A5 `{ top: RED, bottom: WHITE }`
            #  2. range: A1:A5 `{ left: BLUE }`
            #
            # That would result in A1:A5 having a borders of
            # `{ top: RED, bottom: WHITE, left: BLUE }`.
            # If you want to clear a border, explicitly set the style to
            # NONE.
          "right": { # A border along a cell. # The border to put at the right of the range.
            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "width": 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the "style" field.
            "style": "A String", # The style of the border.
          },
          "bottom": { # A border along a cell. # The border to put at the bottom of the range.
            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "width": 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the "style" field.
            "style": "A String", # The style of the border.
          },
          "top": { # A border along a cell. # The border to put at the top of the range.
            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "width": 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the "style" field.
            "style": "A String", # The style of the border.
          },
          "innerHorizontal": { # A border along a cell. # The horizontal border to put within the range.
            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "width": 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the "style" field.
            "style": "A String", # The style of the border.
          },
          "range": { # A range on a sheet. # The range whose borders should be updated.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "innerVertical": { # A border along a cell. # The vertical border to put within the range.
            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "width": 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the "style" field.
            "style": "A String", # The style of the border.
          },
          "left": { # A border along a cell. # The border to put at the left of the range.
            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "width": 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the "style" field.
            "style": "A String", # The style of the border.
          },
        },
        "cutPaste": { # Moves data from the source to the destination. # Cuts data from one area and pastes it to another.
          "pasteType": "A String", # What kind of data to paste.  All the source data will be cut, regardless
              # of what is pasted.
          "source": { # A range on a sheet. # The source data to cut.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "destination": { # A coordinate in a sheet. # The top-left coordinate where the data should be pasted.
              # All indexes are zero-based.
            "rowIndex": 42, # The row index of the coordinate.
            "columnIndex": 42, # The column index of the coordinate.
            "sheetId": 42, # The sheet this coordinate is on.
          },
        },
        "copyPaste": { # Copies data from the source to the destination. # Copies data from one area and pastes it to another.
          "pasteType": "A String", # What kind of data to paste.
          "source": { # A range on a sheet. # The source range to copy.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "destination": { # A range on a sheet. # The location to paste to. If the range covers a span that's
              # a multiple of the source's height or width, then the
              # data will be repeated to fill in the destination range.
              # If the range is smaller than the source range, the entire
              # source data will still be copied (beyond the end of the destination range).
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "pasteOrientation": "A String", # How that data should be oriented when pasting.
        },
        "addSheet": { # Adds a new sheet. # Adds a sheet.
            # When a sheet is added at a given index,
            # all subsequent sheets' indexes are incremented.
            # To add an object sheet, use AddChartRequest instead and specify
            # EmbeddedObjectPosition.sheetId or
            # EmbeddedObjectPosition.newSheet.
          "properties": { # Properties of a sheet. # The properties the new sheet should have.
              # All properties are optional.
              # The sheetId field is optional; if one is not
              # set, an id will be randomly generated. (It is an error to specify the ID
              # of a sheet that already exists.)
            "sheetType": "A String", # The type of sheet. Defaults to GRID.
                # This field cannot be changed once set.
            "index": 42, # The index of the sheet within the spreadsheet.
                # When adding or updating sheet properties, if this field
                # is excluded then the sheet will be added or moved to the end
                # of the sheet list. When updating sheet indices or inserting
                # sheets, movement is considered in "before the move" indexes.
                # For example, if there were 3 sheets (S1, S2, S3) in order to
                # move S1 ahead of S2 the index would have to be set to 2. A sheet
                # index update request will be ignored if the requested index is
                # identical to the sheets current index or if the requested new
                # index is equal to the current sheet index + 1.
            "title": "A String", # The name of the sheet.
            "gridProperties": { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
                # (If the sheet is an object sheet, containing a chart or image, then
                # this field will be absent.)
                # When writing it is an error to set any grid properties on non-grid sheets.
              "columnCount": 42, # The number of columns in the grid.
              "rowCount": 42, # The number of rows in the grid.
              "frozenColumnCount": 42, # The number of columns that are frozen in the grid.
              "hideGridlines": True or False, # True if the grid isn't showing gridlines in the UI.
              "frozenRowCount": 42, # The number of rows that are frozen in the grid.
            },
            "rightToLeft": True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
            "tabColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "hidden": True or False, # True if the sheet is hidden in the UI, false if it's visible.
            "sheetId": 42, # The ID of the sheet. Must be non-negative.
                # This field cannot be changed once set.
          },
        },
        "deleteNamedRange": { # Removes the named range with the given ID from the spreadsheet. # Deletes a named range.
          "namedRangeId": "A String", # The ID of the named range to delete.
        },
        "updateNamedRange": { # Updates properties of the named range with the specified # Updates a named range.
            # namedRangeId.
          "fields": "A String", # The fields that should be updated.  At least one field must be specified.
              # The root `namedRange` is implied and should not be specified.
              # A single `"*"` can be used as short-hand for listing every field.
          "namedRange": { # A named range. # The named range to update with the new properties.
            "namedRangeId": "A String", # The ID of the named range.
            "range": { # A range on a sheet. # The range this represents.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "name": "A String", # The name of the named range.
          },
        },
        "insertDimension": { # Inserts rows or columns in a sheet at a particular index. # Inserts new rows or columns in a sheet.
          "inheritFromBefore": True or False, # Whether dimension properties should be extended from the dimensions
              # before or after the newly inserted dimensions.
              # True to inherit from the dimensions before (in which case the start
              # index must be greater than 0), and false to inherit from the dimensions
              # after.
              #
              # For example, if row index 0 has red background and row index 1
              # has a green background, then inserting 2 rows at index 1 can inherit
              # either the green or red background.  If `inheritFromBefore` is true,
              # the two new rows will be red (because the row before the insertion point
              # was red), whereas if `inheritFromBefore` is false, the two new rows will
              # be green (because the row after the insertion point was green).
          "range": { # A range along a single dimension on a sheet. # The dimensions to insert.  Both the start and end indexes must be bounded.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            "endIndex": 42, # The end (exclusive) of the span, or not set if unbounded.
            "startIndex": 42, # The start (inclusive) of the span, or not set if unbounded.
            "sheetId": 42, # The sheet this span is on.
            "dimension": "A String", # The dimension of the span.
          },
        },
        "updateFilterView": { # Updates properties of the filter view. # Updates the properties of a filter view.
          "filter": { # A filter view. # The new properties of the filter view.
            "title": "A String", # The name of the filter view.
            "namedRangeId": "A String", # The named range this filter view is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            "filterViewId": 42, # The ID of the filter view.
            "range": { # A range on a sheet. # The range this filter view covers.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "sortSpecs": [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                "sortOrder": "A String", # The order data should be sorted.
                "dimensionIndex": 42, # The dimension the sort should be applied to.
              },
            ],
            "criteria": { # The criteria for showing/hiding values per column.
                # The map's key is the column index, and the value is the criteria for
                # that column.
              "a_key": { # Criteria for showing/hiding rows in a filter or filter view.
                "hiddenValues": [ # Values that should be hidden.
                  "A String",
                ],
                "condition": { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hiddenValues -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  "type": "A String", # The type of condition.
                  "values": [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      "relativeDate": "A String", # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      "userEnteredValue": "A String", # A value the condition is based on.
                          # The value will be parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=`).
                    },
                  ],
                },
              },
            },
          },
          "fields": "A String", # The fields that should be updated.  At least one field must be specified.
              # The root `filter` is implied and should not be specified.
              # A single `"*"` can be used as short-hand for listing every field.
        },
        "deleteConditionalFormatRule": { # Deletes a conditional format rule at the given index. # Deletes an existing conditional format rule.
            # All subsequent rules' indexes are decremented.
          "index": 42, # The zero-based index of the rule to be deleted.
          "sheetId": 42, # The sheet the rule is being deleted from.
        },
      },
    ],
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The reply for batch updating a spreadsheet.
    "spreadsheetId": "A String", # The spreadsheet the updates were applied to.
    "updatedSpreadsheet": { # Resource that represents a spreadsheet. # The spreadsheet after updates were applied. This is only set if
        # [BatchUpdateSpreadsheetRequest.include_spreadsheet_in_response] is `true`.
      "spreadsheetId": "A String", # The ID of the spreadsheet.
          # This field is read-only.
      "namedRanges": [ # The named ranges defined in a spreadsheet.
        { # A named range.
          "namedRangeId": "A String", # The ID of the named range.
          "range": { # A range on a sheet. # The range this represents.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "name": "A String", # The name of the named range.
        },
      ],
      "properties": { # Properties of a spreadsheet. # Overall properties of a spreadsheet.
        "locale": "A String", # The locale of the spreadsheet in one of the following formats:
            #
            # * an ISO 639-1 language code such as `en`
            #
            # * an ISO 639-2 language code such as `fil`, if no 639-1 code exists
            #
            # * a combination of the ISO language code and country code, such as `en_US`
            #
            # Note: when updating this field, not all locales/languages are supported.
        "timeZone": "A String", # The time zone of the spreadsheet, in CLDR format such as
            # `America/New_York`. If the time zone isn't recognized, this may
            # be a custom time zone such as `GMT-07:00`.
        "autoRecalc": "A String", # The amount of time to wait before volatile functions are recalculated.
        "defaultFormat": { # The format of a cell. # The default format of all cells in the spreadsheet.
            # CellData.effectiveFormat will not be set if the
            # cell's format is equal to this default format.
            # This field is read-only.
          "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
            "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                # the user's locale will be used if necessary for the given type.
                # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                # information about the supported patterns.
            "type": "A String", # The type of the number format.
                # When writing, this field must be set.
          },
          "textDirection": "A String", # The direction of the text in the cell.
          "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
              # When updating padding, every field must be specified.
            "top": 42, # The top padding of the cell.
            "right": 42, # The right padding of the cell.
            "bottom": 42, # The bottom padding of the cell.
            "left": 42, # The left padding of the cell.
          },
          "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
          "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
              #            return nil;
              #          }
              #          Color* result = [Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha <= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!('alpha' in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(',');
              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = ['#'];
              #       for (var i = 0; i < missingZeros; i++) {
              #          resultBuilder.push('0');
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join('');
              #     };
              #
              #     // ...
            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
          },
          "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
          "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
              # Absent values indicate that the field isn't specified.
            "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "bold": True or False, # True if the text is bold.
            "strikethrough": True or False, # True if the text has a strikethrough.
            "fontFamily": "A String", # The font family.
            "fontSize": 42, # The size of the font.
            "italic": True or False, # True if the text is italicized.
            "underline": True or False, # True if the text is underlined.
          },
          "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
          "borders": { # The borders of the cell. # The borders of the cell.
            "top": { # A border along a cell. # The top border of the cell.
              "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "width": 42, # The width of the border, in pixels.
                  # Deprecated; the width is determined by the "style" field.
              "style": "A String", # The style of the border.
            },
            "right": { # A border along a cell. # The right border of the cell.
              "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "width": 42, # The width of the border, in pixels.
                  # Deprecated; the width is determined by the "style" field.
              "style": "A String", # The style of the border.
            },
            "bottom": { # A border along a cell. # The bottom border of the cell.
              "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "width": 42, # The width of the border, in pixels.
                  # Deprecated; the width is determined by the "style" field.
              "style": "A String", # The style of the border.
            },
            "left": { # A border along a cell. # The left border of the cell.
              "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "width": 42, # The width of the border, in pixels.
                  # Deprecated; the width is determined by the "style" field.
              "style": "A String", # The style of the border.
            },
          },
          "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
        },
        "title": "A String", # The title of the spreadsheet.
      },
      "sheets": [ # The sheets that are part of a spreadsheet.
        { # A sheet in a spreadsheet.
          "conditionalFormats": [ # The conditional format rules in this sheet.
            { # A rule describing a conditional format.
              "ranges": [ # The ranges that will be formatted if the condition is true.
                  # All the ranges must be on the same grid.
                { # A range on a sheet.
                    # All indexes are zero-based.
                    # Indexes are half open, e.g the start index is inclusive
                    # and the end index is exclusive -- [start_index, end_index).
                    # Missing indexes indicate the range is unbounded on that side.
                    #
                    # For example, if `"Sheet1"` is sheet ID 0, then:
                    #
                    #   `Sheet1!A1:A1 == sheet_id: 0,
                    #                   start_row_index: 0, end_row_index: 1,
                    #                   start_column_index: 0, end_column_index: 1`
                    #
                    #   `Sheet1!A3:B4 == sheet_id: 0,
                    #                   start_row_index: 2, end_row_index: 4,
                    #                   start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1!A:B == sheet_id: 0,
                    #                 start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1!A5:B == sheet_id: 0,
                    #                  start_row_index: 4,
                    #                  start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1 == sheet_id:0`
                    #
                    # The start index must always be less than or equal to the end index.
                    # If the start index equals the end index, then the range is empty.
                    # Empty ranges are typically not meaningful and are usually rendered in the
                    # UI as `#REF!`.
                  "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                  "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                  "sheetId": 42, # The sheet this range is on.
                  "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                  "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                },
              ],
              "booleanRule": { # A rule that may or may not match, depending on the condition. # The formatting is either "on" or "off" according to the rule.
                "condition": { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                    # the format will be applied.
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  "type": "A String", # The type of condition.
                  "values": [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      "relativeDate": "A String", # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      "userEnteredValue": "A String", # A value the condition is based on.
                          # The value will be parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=`).
                    },
                  ],
                },
                "format": { # The format of a cell. # The format to apply.
                    # Conditional formatting can only apply a subset of formatting:
                    # bold, italic,
                    # strikethrough,
                    # foreground color &
                    # background color.
                  "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                    "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                        # the user's locale will be used if necessary for the given type.
                        # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                        # information about the supported patterns.
                    "type": "A String", # The type of the number format.
                        # When writing, this field must be set.
                  },
                  "textDirection": "A String", # The direction of the text in the cell.
                  "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                      # When updating padding, every field must be specified.
                    "top": 42, # The top padding of the cell.
                    "right": 42, # The right padding of the cell.
                    "bottom": 42, # The bottom padding of the cell.
                    "left": 42, # The left padding of the cell.
                  },
                  "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                  "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                  "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                      # Absent values indicate that the field isn't specified.
                    "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "bold": True or False, # True if the text is bold.
                    "strikethrough": True or False, # True if the text has a strikethrough.
                    "fontFamily": "A String", # The font family.
                    "fontSize": 42, # The size of the font.
                    "italic": True or False, # True if the text is italicized.
                    "underline": True or False, # True if the text is underlined.
                  },
                  "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                  "borders": { # The borders of the cell. # The borders of the cell.
                    "top": { # A border along a cell. # The top border of the cell.
                      "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "width": 42, # The width of the border, in pixels.
                          # Deprecated; the width is determined by the "style" field.
                      "style": "A String", # The style of the border.
                    },
                    "right": { # A border along a cell. # The right border of the cell.
                      "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "width": 42, # The width of the border, in pixels.
                          # Deprecated; the width is determined by the "style" field.
                      "style": "A String", # The style of the border.
                    },
                    "bottom": { # A border along a cell. # The bottom border of the cell.
                      "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "width": 42, # The width of the border, in pixels.
                          # Deprecated; the width is determined by the "style" field.
                      "style": "A String", # The style of the border.
                    },
                    "left": { # A border along a cell. # The left border of the cell.
                      "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "width": 42, # The width of the border, in pixels.
                          # Deprecated; the width is determined by the "style" field.
                      "style": "A String", # The style of the border.
                    },
                  },
                  "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
                },
              },
              "gradientRule": { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                  # the interpolation points listed. The format of a cell will vary
                  # based on its contents as compared to the values of the interpolation
                  # points.
                "maxpoint": { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                    # These pin the gradient color scale according to the color,
                    # type and value chosen.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "type": "A String", # How the value should be interpreted.
                  "value": "A String", # The value this interpolation point uses.  May be a formula.
                      # Unused if type is MIN or
                      # MAX.
                },
                "midpoint": { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                    # These pin the gradient color scale according to the color,
                    # type and value chosen.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "type": "A String", # How the value should be interpreted.
                  "value": "A String", # The value this interpolation point uses.  May be a formula.
                      # Unused if type is MIN or
                      # MAX.
                },
                "minpoint": { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                    # These pin the gradient color scale according to the color,
                    # type and value chosen.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "type": "A String", # How the value should be interpreted.
                  "value": "A String", # The value this interpolation point uses.  May be a formula.
                      # Unused if type is MIN or
                      # MAX.
                },
              },
            },
          ],
          "bandedRanges": [ # The banded (i.e. alternating colors) ranges on this sheet.
            { # A banded (alternating colors) range in a sheet.
              "range": { # A range on a sheet. # The range over which these properties are applied.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
              "columnProperties": { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties will be applied on a column-
                  # by-column basis throughout all the columns in the range. At least one of
                  # row_properties or column_properties must be specified.
                  # BandedRange.row_properties and BandedRange.column_properties are
                  # set, the fill colors are applied to cells according to the following rules:
                  #
                  # * header_color and footer_color take priority over band colors.
                  # * first_band_color takes priority over second_band_color.
                  # * row_properties takes priority over column_properties.
                  #
                  # For example, the first row color takes priority over the first column
                  # color, but the first column color takes priority over the second row color.
                  # Similarly, the row header takes priority over the column header in the
                  # top left cell, but the column header takes priority over the first row
                  # color if the row header is not set.
                "secondBandColor": { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "headerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first
                    # row or column will be filled with this color and the colors will
                    # alternate between first_band_color and second_band_color starting
                    # from the second row or column. Otherwise, the first row or column will be
                    # filled with first_band_color and the colors will proceed to alternate
                    # as they normally would.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "footerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                    # row or column will be filled with either first_band_color or
                    # second_band_color, depending on the color of the previous row or
                    # column.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "firstBandColor": { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
              },
              "rowProperties": { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties will be applied on a row-by-row
                  # basis throughout all the rows in the range. At least one of
                  # row_properties or column_properties must be specified.
                  # BandedRange.row_properties and BandedRange.column_properties are
                  # set, the fill colors are applied to cells according to the following rules:
                  #
                  # * header_color and footer_color take priority over band colors.
                  # * first_band_color takes priority over second_band_color.
                  # * row_properties takes priority over column_properties.
                  #
                  # For example, the first row color takes priority over the first column
                  # color, but the first column color takes priority over the second row color.
                  # Similarly, the row header takes priority over the column header in the
                  # top left cell, but the column header takes priority over the first row
                  # color if the row header is not set.
                "secondBandColor": { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "headerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first
                    # row or column will be filled with this color and the colors will
                    # alternate between first_band_color and second_band_color starting
                    # from the second row or column. Otherwise, the first row or column will be
                    # filled with first_band_color and the colors will proceed to alternate
                    # as they normally would.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "footerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                    # row or column will be filled with either first_band_color or
                    # second_band_color, depending on the color of the previous row or
                    # column.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "firstBandColor": { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
              },
              "bandedRangeId": 42, # The id of the banded range.
            },
          ],
          "merges": [ # The ranges that are merged together.
            { # A range on a sheet.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
          ],
          "basicFilter": { # The default filter associated with a sheet. # The filter on this sheet, if any.
            "range": { # A range on a sheet. # The range the filter covers.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "sortSpecs": [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                "sortOrder": "A String", # The order data should be sorted.
                "dimensionIndex": 42, # The dimension the sort should be applied to.
              },
            ],
            "criteria": { # The criteria for showing/hiding values per column.
                # The map's key is the column index, and the value is the criteria for
                # that column.
              "a_key": { # Criteria for showing/hiding rows in a filter or filter view.
                "hiddenValues": [ # Values that should be hidden.
                  "A String",
                ],
                "condition": { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hiddenValues -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  "type": "A String", # The type of condition.
                  "values": [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      "relativeDate": "A String", # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      "userEnteredValue": "A String", # A value the condition is based on.
                          # The value will be parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=`).
                    },
                  ],
                },
              },
            },
          },
          "charts": [ # The specifications of every chart on this sheet.
            { # A chart embedded in a sheet.
              "chartId": 42, # The ID of the chart.
              "position": { # The position of an embedded object such as a chart. # The position of the chart.
                "newSheet": True or False, # If true, the embedded object will be put on a new sheet whose ID
                    # is chosen for you. Used only when writing.
                "sheetId": 42, # The sheet this is on. Set only if the embedded object
                    # is on its own sheet. Must be non-negative.
                "overlayPosition": { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                  "anchorCell": { # A coordinate in a sheet. # The cell the object is anchored to.
                      # All indexes are zero-based.
                    "rowIndex": 42, # The row index of the coordinate.
                    "columnIndex": 42, # The column index of the coordinate.
                    "sheetId": 42, # The sheet this coordinate is on.
                  },
                  "offsetYPixels": 42, # The vertical offset, in pixels, that the object is offset
                      # from the anchor cell.
                  "widthPixels": 42, # The width of the object, in pixels. Defaults to 600.
                  "offsetXPixels": 42, # The horizontal offset, in pixels, that the object is offset
                      # from the anchor cell.
                  "heightPixels": 42, # The height of the object, in pixels. Defaults to 371.
                },
              },
              "spec": { # The specifications of a chart. # The specification of the chart.
                "hiddenDimensionStrategy": "A String", # Determines how the charts will use hidden rows or columns.
                "pieChart": { # A <a href="/chart/interactive/docs/gallery/piechart">pie chart</a>. # A pie chart specification.
                  "series": { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                    "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                      "sources": [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) & all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be contiguous across the domain and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `"Sheet1"` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                          "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                          "sheetId": 42, # The sheet this range is on.
                          "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                          "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  "domain": { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                    "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                      "sources": [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) & all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be contiguous across the domain and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `"Sheet1"` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                          "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                          "sheetId": 42, # The sheet this range is on.
                          "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                          "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  "threeDimensional": True or False, # True if the pie is three dimensional.
                  "legendPosition": "A String", # Where the legend of the pie chart should be drawn.
                  "pieHole": 3.14, # The size of the hole in the pie chart.
                },
                "basicChart": { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                    # See BasicChartType for the list of all
                    # charts this supports.
                    # of charts this supports.
                  "headerCount": 42, # The number of rows or columns in the data that are "headers".
                      # If not set, Google Sheets will guess how many rows are headers based
                      # on the data.
                      #
                      # (Note that BasicChartAxis.title may override the axis title
                      #  inferred from the header values.)
                  "series": [ # The data this chart is visualizing.
                    { # A single series of data in a chart.
                        # For example, if charting stock prices over time, multiple series may exist,
                        # one for the "Open Price", "High Price", "Low Price" and "Close Price".
                      "series": { # The data included in a domain or series. # The data being visualized in this chart series.
                        "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                          "sources": [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) & all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be contiguous across the domain and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `"Sheet1"` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                              "sheetId": 42, # The sheet this range is on.
                              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                      "targetAxis": "A String", # The minor axis that will specify the range of values for this series.
                          # For example, if charting stocks over time, the "Volume" series
                          # may want to be pinned to the right with the prices pinned to the left,
                          # because the scale of trading volume is different than the scale of
                          # prices.
                          # It is an error to specify an axis that isn't a valid minor axis
                          # for the chart's type.
                      "type": "A String", # The type of this series. Valid only if the
                          # chartType is
                          # COMBO.
                          # Different types will change the way the series is visualized.
                          # Only LINE, AREA,
                          # and COLUMN are supported.
                    },
                  ],
                  "legendPosition": "A String", # The position of the chart legend.
                  "domains": [ # The domain of data this is charting.
                      # Only a single domain is currently supported.
                    { # The domain of a chart.
                        # For example, if charting stock prices over time, this would be the date.
                      "domain": { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                          # this is the data representing the dates.
                        "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                          "sources": [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) & all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be contiguous across the domain and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `"Sheet1"` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                              "sheetId": 42, # The sheet this range is on.
                              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                  ],
                  "chartType": "A String", # The type of the chart.
                  "axis": [ # The axis on the chart.
                    { # An axis of the chart.
                        # A chart may not have more than one axis per
                        # axis position.
                      "position": "A String", # The position of this axis.
                      "format": { # The format of a run of text in a cell. # The format of the title.
                          # Only valid if the axis is not associated with the domain.
                          # Absent values indicate that the field isn't specified.
                        "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "bold": True or False, # True if the text is bold.
                        "strikethrough": True or False, # True if the text has a strikethrough.
                        "fontFamily": "A String", # The font family.
                        "fontSize": 42, # The size of the font.
                        "italic": True or False, # True if the text is italicized.
                        "underline": True or False, # True if the text is underlined.
                      },
                      "title": "A String", # The title of this axis. If set, this overrides any title inferred
                          # from headers of the data.
                    },
                  ],
                },
                "title": "A String", # The title of the chart.
              },
            },
          ],
          "filterViews": [ # The filter views in this sheet.
            { # A filter view.
              "title": "A String", # The name of the filter view.
              "namedRangeId": "A String", # The named range this filter view is backed by, if any.
                  #
                  # When writing, only one of range or named_range_id
                  # may be set.
              "filterViewId": 42, # The ID of the filter view.
              "range": { # A range on a sheet. # The range this filter view covers.
                  #
                  # When writing, only one of range or named_range_id
                  # may be set.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
              "sortSpecs": [ # The sort order per column. Later specifications are used when values
                  # are equal in the earlier specifications.
                { # A sort order associated with a specific column or row.
                  "sortOrder": "A String", # The order data should be sorted.
                  "dimensionIndex": 42, # The dimension the sort should be applied to.
                },
              ],
              "criteria": { # The criteria for showing/hiding values per column.
                  # The map's key is the column index, and the value is the criteria for
                  # that column.
                "a_key": { # Criteria for showing/hiding rows in a filter or filter view.
                  "hiddenValues": [ # Values that should be hidden.
                    "A String",
                  ],
                  "condition": { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                      # (This does not override hiddenValues -- if a value is listed there,
                      #  it will still be hidden.)
                      # BooleanConditions are used by conditional formatting,
                      # data validation, and the criteria in filters.
                    "type": "A String", # The type of condition.
                    "values": [ # The values of the condition. The number of supported values depends
                        # on the condition type.  Some support zero values,
                        # others one or two values,
                        # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                      { # The value of the condition.
                        "relativeDate": "A String", # A relative date (based on the current date).
                            # Valid only if the type is
                            # DATE_BEFORE,
                            # DATE_AFTER,
                            # DATE_ON_OR_BEFORE or
                            # DATE_ON_OR_AFTER.
                            #
                            # Relative dates are not supported in data validation.
                            # They are supported only in conditional formatting and
                            # conditional filters.
                        "userEnteredValue": "A String", # A value the condition is based on.
                            # The value will be parsed as if the user typed into a cell.
                            # Formulas are supported (and must begin with an `=`).
                      },
                    ],
                  },
                },
              },
            },
          ],
          "protectedRanges": [ # The protected ranges in this sheet.
            { # A protected range.
              "unprotectedRanges": [ # The list of unprotected ranges within a protected sheet.
                  # Unprotected ranges are only supported on protected sheets.
                { # A range on a sheet.
                    # All indexes are zero-based.
                    # Indexes are half open, e.g the start index is inclusive
                    # and the end index is exclusive -- [start_index, end_index).
                    # Missing indexes indicate the range is unbounded on that side.
                    #
                    # For example, if `"Sheet1"` is sheet ID 0, then:
                    #
                    #   `Sheet1!A1:A1 == sheet_id: 0,
                    #                   start_row_index: 0, end_row_index: 1,
                    #                   start_column_index: 0, end_column_index: 1`
                    #
                    #   `Sheet1!A3:B4 == sheet_id: 0,
                    #                   start_row_index: 2, end_row_index: 4,
                    #                   start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1!A:B == sheet_id: 0,
                    #                 start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1!A5:B == sheet_id: 0,
                    #                  start_row_index: 4,
                    #                  start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1 == sheet_id:0`
                    #
                    # The start index must always be less than or equal to the end index.
                    # If the start index equals the end index, then the range is empty.
                    # Empty ranges are typically not meaningful and are usually rendered in the
                    # UI as `#REF!`.
                  "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                  "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                  "sheetId": 42, # The sheet this range is on.
                  "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                  "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                },
              ],
              "requestingUserCanEdit": True or False, # True if the user who requested this protected range can edit the
                  # protected area.
                  # This field is read-only.
              "description": "A String", # The description of this protected range.
              "namedRangeId": "A String", # The named range this protected range is backed by, if any.
                  #
                  # When writing, only one of range or named_range_id
                  # may be set.
              "editors": { # The editors of a protected range. # The users and groups with edit access to the protected range.
                  # This field is only visible to users with edit access to the protected
                  # range and the document.
                  # Editors are not supported with warning_only protection.
                "domainUsersCanEdit": True or False, # True if anyone in the document's domain has edit access to the protected
                    # range.  Domain protection is only supported on documents within a domain.
                "users": [ # The email addresses of users with edit access to the protected range.
                  "A String",
                ],
                "groups": [ # The email addresses of groups with edit access to the protected range.
                  "A String",
                ],
              },
              "protectedRangeId": 42, # The ID of the protected range.
                  # This field is read-only.
              "warningOnly": True or False, # True if this protected range will show a warning when editing.
                  # Warning-based protection means that every user can edit data in the
                  # protected range, except editing will prompt a warning asking the user
                  # to confirm the edit.
                  #
                  # When writing: if this field is true, then editors is ignored.
                  # Additionally, if this field is changed from true to false and the
                  # `editors` field is not set (nor included in the field mask), then
                  # the editors will be set to all the editors in the document.
              "range": { # A range on a sheet. # The range that is being protected.
                  # The range may be fully unbounded, in which case this is considered
                  # a protected sheet.
                  #
                  # When writing, only one of range or named_range_id
                  # may be set.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
            },
          ],
          "data": [ # Data in the grid, if this is a grid sheet.
              # The number of GridData objects returned is dependent on the number of
              # ranges requested on this sheet. For example, if this is representing
              # `Sheet1`, and the spreadsheet was requested with ranges
              # `Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a
              # startRow/startColumn of `0`,
              # while the second one will have `startRow 14` (zero-based row 15),
              # and `startColumn 3` (zero-based column D).
            { # Data in the grid, as well as metadata about the dimensions.
              "startRow": 42, # The first row this GridData refers to, zero-based.
              "rowMetadata": [ # Metadata about the requested rows in the grid, starting with the row
                  # in start_row.
                { # Properties about a dimension.
                  "pixelSize": 42, # The height (if a row) or width (if a column) of the dimension in pixels.
                  "hiddenByUser": True or False, # True if this dimension is explicitly hidden.
                  "hiddenByFilter": True or False, # True if this dimension is being filtered.
                      # This field is read-only.
                },
              ],
              "startColumn": 42, # The first column this GridData refers to, zero-based.
              "columnMetadata": [ # Metadata about the requested columns in the grid, starting with the column
                  # in start_column.
                { # Properties about a dimension.
                  "pixelSize": 42, # The height (if a row) or width (if a column) of the dimension in pixels.
                  "hiddenByUser": True or False, # True if this dimension is explicitly hidden.
                  "hiddenByFilter": True or False, # True if this dimension is being filtered.
                      # This field is read-only.
                },
              ],
              "rowData": [ # The data in the grid, one entry per row,
                  # starting with the row in startRow.
                  # The values in RowData will correspond to columns starting
                  # at start_column.
                { # Data about each cell in a row.
                  "values": [ # The values in the row, one per column.
                    { # Data about a specific cell.
                      "pivotTable": { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                          # is computed dynamically based on its data, grouping, filters, values,
                          # etc. Only the top-left cell of the pivot table contains the pivot table
                          # definition. The other cells will contain the calculated values of the
                          # results of the pivot in their effective_value fields.
                        "valueLayout": "A String", # Whether values should be listed horizontally (as columns)
                            # or vertically (as rows).
                        "rows": [ # Each row grouping in the pivot table.
                          { # A single grouping (either row or column) in a pivot table.
                            "showTotals": True or False, # True if the pivot table should include the totals for this grouping.
                            "valueMetadata": [ # Metadata about values in the grouping.
                              { # Metadata about a value in a pivot grouping.
                                "collapsed": True or False, # True if the data corresponding to the value is collapsed.
                                "value": { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                    # (Note that formulaValue is not valid,
                                    #  because the values will be calculated.)
                                  "numberValue": 3.14, # Represents a double value.
                                      # Note: Dates, Times and DateTimes are represented as doubles in
                                      # "serial number" format.
                                  "boolValue": True or False, # Represents a boolean value.
                                  "formulaValue": "A String", # Represents a formula.
                                  "stringValue": "A String", # Represents a string value.
                                      # Leading single quotes are not included. For example, if the user typed
                                      # `'123` into the UI, this would be represented as a `stringValue` of
                                      # `"123"`.
                                  "errorValue": { # An error in a cell. # Represents an error.
                                      # This field is read-only.
                                    "message": "A String", # A message with more information about the error
                                        # (in the spreadsheet's locale).
                                    "type": "A String", # The type of error.
                                  },
                                },
                              },
                            ],
                            "valueBucket": { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                                # If not specified, sorting is alphabetical by this group's values.
                              "buckets": [ # Determines the bucket from which values are chosen to sort.
                                  #
                                  # For example, in a pivot table with one row group & two column groups,
                                  # the row group can list up to two values. The first value corresponds
                                  # to a value within the first column group, and the second value
                                  # corresponds to a value in the second column group.  If no values
                                  # are listed, this would indicate that the row should be sorted according
                                  # to the "Grand Total" over the column groups. If a single value is listed,
                                  # this would correspond to using the "Total" of that bucket.
                                { # The kinds of value that a cell in a spreadsheet can have.
                                  "numberValue": 3.14, # Represents a double value.
                                      # Note: Dates, Times and DateTimes are represented as doubles in
                                      # "serial number" format.
                                  "boolValue": True or False, # Represents a boolean value.
                                  "formulaValue": "A String", # Represents a formula.
                                  "stringValue": "A String", # Represents a string value.
                                      # Leading single quotes are not included. For example, if the user typed
                                      # `'123` into the UI, this would be represented as a `stringValue` of
                                      # `"123"`.
                                  "errorValue": { # An error in a cell. # Represents an error.
                                      # This field is read-only.
                                    "message": "A String", # A message with more information about the error
                                        # (in the spreadsheet's locale).
                                    "type": "A String", # The type of error.
                                  },
                                },
                              ],
                              "valuesIndex": 42, # The offset in the PivotTable.values list which the values in this
                                  # grouping should be sorted by.
                            },
                            "sortOrder": "A String", # The order the values in this group should be sorted.
                            "sourceColumnOffset": 42, # The column offset of the source range that this grouping is based on.
                                #
                                # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                                # means this group refers to column `C`, whereas the offset `1` would refer
                                # to column `D`.
                          },
                        ],
                        "source": { # A range on a sheet. # The range the pivot table is reading data from.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `"Sheet1"` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                          "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                          "sheetId": 42, # The sheet this range is on.
                          "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                          "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                        },
                        "values": [ # A list of values to include in the pivot table.
                          { # The definition of how a value in a pivot table should be calculated.
                            "formula": "A String", # A custom formula to calculate the value.  The formula must start
                                # with an `=` character.
                            "summarizeFunction": "A String", # A function to summarize the value.
                                # If formula is set, the only supported values are
                                # SUM and
                                # CUSTOM.
                                # If sourceColumnOffset is set, then `CUSTOM`
                                # is not supported.
                            "sourceColumnOffset": 42, # The column offset of the source range that this value reads from.
                                #
                                # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                                # means this value refers to column `C`, whereas the offset `1` would
                                # refer to column `D`.
                            "name": "A String", # A name to use for the value. This is only used if formula was set.
                                # Otherwise, the column name is used.
                          },
                        ],
                        "criteria": { # An optional mapping of filters per source column offset.
                            #
                            # The filters will be applied before aggregating data into the pivot table.
                            # The map's key is the column offset of the source range that you want to
                            # filter, and the value is the criteria for that column.
                            #
                            # For example, if the source was `C10:E15`, a key of `0` will have the filter
                            # for column `C`, whereas the key `1` is for column `D`.
                          "a_key": { # Criteria for showing/hiding rows in a pivot table.
                            "visibleValues": [ # Values that should be included.  Values not listed here are excluded.
                              "A String",
                            ],
                          },
                        },
                        "columns": [ # Each column grouping in the pivot table.
                          { # A single grouping (either row or column) in a pivot table.
                            "showTotals": True or False, # True if the pivot table should include the totals for this grouping.
                            "valueMetadata": [ # Metadata about values in the grouping.
                              { # Metadata about a value in a pivot grouping.
                                "collapsed": True or False, # True if the data corresponding to the value is collapsed.
                                "value": { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                    # (Note that formulaValue is not valid,
                                    #  because the values will be calculated.)
                                  "numberValue": 3.14, # Represents a double value.
                                      # Note: Dates, Times and DateTimes are represented as doubles in
                                      # "serial number" format.
                                  "boolValue": True or False, # Represents a boolean value.
                                  "formulaValue": "A String", # Represents a formula.
                                  "stringValue": "A String", # Represents a string value.
                                      # Leading single quotes are not included. For example, if the user typed
                                      # `'123` into the UI, this would be represented as a `stringValue` of
                                      # `"123"`.
                                  "errorValue": { # An error in a cell. # Represents an error.
                                      # This field is read-only.
                                    "message": "A String", # A message with more information about the error
                                        # (in the spreadsheet's locale).
                                    "type": "A String", # The type of error.
                                  },
                                },
                              },
                            ],
                            "valueBucket": { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                                # If not specified, sorting is alphabetical by this group's values.
                              "buckets": [ # Determines the bucket from which values are chosen to sort.
                                  #
                                  # For example, in a pivot table with one row group & two column groups,
                                  # the row group can list up to two values. The first value corresponds
                                  # to a value within the first column group, and the second value
                                  # corresponds to a value in the second column group.  If no values
                                  # are listed, this would indicate that the row should be sorted according
                                  # to the "Grand Total" over the column groups. If a single value is listed,
                                  # this would correspond to using the "Total" of that bucket.
                                { # The kinds of value that a cell in a spreadsheet can have.
                                  "numberValue": 3.14, # Represents a double value.
                                      # Note: Dates, Times and DateTimes are represented as doubles in
                                      # "serial number" format.
                                  "boolValue": True or False, # Represents a boolean value.
                                  "formulaValue": "A String", # Represents a formula.
                                  "stringValue": "A String", # Represents a string value.
                                      # Leading single quotes are not included. For example, if the user typed
                                      # `'123` into the UI, this would be represented as a `stringValue` of
                                      # `"123"`.
                                  "errorValue": { # An error in a cell. # Represents an error.
                                      # This field is read-only.
                                    "message": "A String", # A message with more information about the error
                                        # (in the spreadsheet's locale).
                                    "type": "A String", # The type of error.
                                  },
                                },
                              ],
                              "valuesIndex": 42, # The offset in the PivotTable.values list which the values in this
                                  # grouping should be sorted by.
                            },
                            "sortOrder": "A String", # The order the values in this group should be sorted.
                            "sourceColumnOffset": 42, # The column offset of the source range that this grouping is based on.
                                #
                                # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                                # means this group refers to column `C`, whereas the offset `1` would refer
                                # to column `D`.
                          },
                        ],
                      },
                      "hyperlink": "A String", # A hyperlink this cell points to, if any.
                          # This field is read-only.  (To set it, use a `=HYPERLINK` formula.)
                      "effectiveValue": { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this will be
                          # the calculated value.  For cells with literals, this will be
                          # the same as the user_entered_value.
                          # This field is read-only.
                        "numberValue": 3.14, # Represents a double value.
                            # Note: Dates, Times and DateTimes are represented as doubles in
                            # "serial number" format.
                        "boolValue": True or False, # Represents a boolean value.
                        "formulaValue": "A String", # Represents a formula.
                        "stringValue": "A String", # Represents a string value.
                            # Leading single quotes are not included. For example, if the user typed
                            # `'123` into the UI, this would be represented as a `stringValue` of
                            # `"123"`.
                        "errorValue": { # An error in a cell. # Represents an error.
                            # This field is read-only.
                          "message": "A String", # A message with more information about the error
                              # (in the spreadsheet's locale).
                          "type": "A String", # The type of error.
                        },
                      },
                      "formattedValue": "A String", # The formatted value of the cell.
                          # This is the value as it's shown to the user.
                          # This field is read-only.
                      "userEnteredValue": { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `'Hello'`, or `=NOW()`
                          # Note: Dates, Times and DateTimes are represented as doubles in
                          # serial number format.
                        "numberValue": 3.14, # Represents a double value.
                            # Note: Dates, Times and DateTimes are represented as doubles in
                            # "serial number" format.
                        "boolValue": True or False, # Represents a boolean value.
                        "formulaValue": "A String", # Represents a formula.
                        "stringValue": "A String", # Represents a string value.
                            # Leading single quotes are not included. For example, if the user typed
                            # `'123` into the UI, this would be represented as a `stringValue` of
                            # `"123"`.
                        "errorValue": { # An error in a cell. # Represents an error.
                            # This field is read-only.
                          "message": "A String", # A message with more information about the error
                              # (in the spreadsheet's locale).
                          "type": "A String", # The type of error.
                        },
                      },
                      "note": "A String", # Any note on the cell.
                      "effectiveFormat": { # The format of a cell. # The effective format being used by the cell.
                          # This includes the results of applying any conditional formatting and,
                          # if the cell contains a formula, the computed number format.
                          # If the effective format is the default format, effective format will
                          # not be written.
                          # This field is read-only.
                        "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                          "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                              # the user's locale will be used if necessary for the given type.
                              # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                              # information about the supported patterns.
                          "type": "A String", # The type of the number format.
                              # When writing, this field must be set.
                        },
                        "textDirection": "A String", # The direction of the text in the cell.
                        "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                            # When updating padding, every field must be specified.
                          "top": 42, # The top padding of the cell.
                          "right": 42, # The right padding of the cell.
                          "bottom": 42, # The bottom padding of the cell.
                          "left": 42, # The left padding of the cell.
                        },
                        "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                        "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                        "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                            # Absent values indicate that the field isn't specified.
                          "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "bold": True or False, # True if the text is bold.
                          "strikethrough": True or False, # True if the text has a strikethrough.
                          "fontFamily": "A String", # The font family.
                          "fontSize": 42, # The size of the font.
                          "italic": True or False, # True if the text is italicized.
                          "underline": True or False, # True if the text is underlined.
                        },
                        "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                        "borders": { # The borders of the cell. # The borders of the cell.
                          "top": { # A border along a cell. # The top border of the cell.
                            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha <= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!('alpha' in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(',');
                                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = ['#'];
                                #       for (var i = 0; i < missingZeros; i++) {
                                #          resultBuilder.push('0');
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join('');
                                #     };
                                #
                                #     // ...
                              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            },
                            "width": 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the "style" field.
                            "style": "A String", # The style of the border.
                          },
                          "right": { # A border along a cell. # The right border of the cell.
                            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha <= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!('alpha' in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(',');
                                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = ['#'];
                                #       for (var i = 0; i < missingZeros; i++) {
                                #          resultBuilder.push('0');
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join('');
                                #     };
                                #
                                #     // ...
                              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            },
                            "width": 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the "style" field.
                            "style": "A String", # The style of the border.
                          },
                          "bottom": { # A border along a cell. # The bottom border of the cell.
                            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha <= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!('alpha' in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(',');
                                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = ['#'];
                                #       for (var i = 0; i < missingZeros; i++) {
                                #          resultBuilder.push('0');
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join('');
                                #     };
                                #
                                #     // ...
                              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            },
                            "width": 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the "style" field.
                            "style": "A String", # The style of the border.
                          },
                          "left": { # A border along a cell. # The left border of the cell.
                            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha <= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!('alpha' in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(',');
                                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = ['#'];
                                #       for (var i = 0; i < missingZeros; i++) {
                                #          resultBuilder.push('0');
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join('');
                                #     };
                                #
                                #     // ...
                              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            },
                            "width": 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the "style" field.
                            "style": "A String", # The style of the border.
                          },
                        },
                        "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
                      },
                      "userEnteredFormat": { # The format of a cell. # The format the user entered for the cell.
                          #
                          # When writing, the new format will be merged with the existing format.
                        "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                          "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                              # the user's locale will be used if necessary for the given type.
                              # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                              # information about the supported patterns.
                          "type": "A String", # The type of the number format.
                              # When writing, this field must be set.
                        },
                        "textDirection": "A String", # The direction of the text in the cell.
                        "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                            # When updating padding, every field must be specified.
                          "top": 42, # The top padding of the cell.
                          "right": 42, # The right padding of the cell.
                          "bottom": 42, # The bottom padding of the cell.
                          "left": 42, # The left padding of the cell.
                        },
                        "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                        "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                        "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                            # Absent values indicate that the field isn't specified.
                          "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "bold": True or False, # True if the text is bold.
                          "strikethrough": True or False, # True if the text has a strikethrough.
                          "fontFamily": "A String", # The font family.
                          "fontSize": 42, # The size of the font.
                          "italic": True or False, # True if the text is italicized.
                          "underline": True or False, # True if the text is underlined.
                        },
                        "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                        "borders": { # The borders of the cell. # The borders of the cell.
                          "top": { # A border along a cell. # The top border of the cell.
                            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha <= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!('alpha' in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(',');
                                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = ['#'];
                                #       for (var i = 0; i < missingZeros; i++) {
                                #          resultBuilder.push('0');
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join('');
                                #     };
                                #
                                #     // ...
                              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            },
                            "width": 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the "style" field.
                            "style": "A String", # The style of the border.
                          },
                          "right": { # A border along a cell. # The right border of the cell.
                            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha <= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!('alpha' in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(',');
                                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = ['#'];
                                #       for (var i = 0; i < missingZeros; i++) {
                                #          resultBuilder.push('0');
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join('');
                                #     };
                                #
                                #     // ...
                              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            },
                            "width": 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the "style" field.
                            "style": "A String", # The style of the border.
                          },
                          "bottom": { # A border along a cell. # The bottom border of the cell.
                            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha <= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!('alpha' in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(',');
                                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = ['#'];
                                #       for (var i = 0; i < missingZeros; i++) {
                                #          resultBuilder.push('0');
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join('');
                                #     };
                                #
                                #     // ...
                              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            },
                            "width": 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the "style" field.
                            "style": "A String", # The style of the border.
                          },
                          "left": { # A border along a cell. # The left border of the cell.
                            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha <= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!('alpha' in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(',');
                                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = ['#'];
                                #       for (var i = 0; i < missingZeros; i++) {
                                #          resultBuilder.push('0');
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join('');
                                #     };
                                #
                                #     // ...
                              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            },
                            "width": 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the "style" field.
                            "style": "A String", # The style of the border.
                          },
                        },
                        "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
                      },
                      "dataValidation": { # A data validation rule. # A data validation rule on the cell, if any.
                          #
                          # When writing, the new data validation rule will overwrite any prior rule.
                        "showCustomUi": True or False, # True if the UI should be customized based on the kind of condition.
                            # If true, "List" conditions will show a dropdown.
                        "strict": True or False, # True if invalid data should be rejected.
                        "inputMessage": "A String", # A message to show the user when adding data to the cell.
                        "condition": { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                            # BooleanConditions are used by conditional formatting,
                            # data validation, and the criteria in filters.
                          "type": "A String", # The type of condition.
                          "values": [ # The values of the condition. The number of supported values depends
                              # on the condition type.  Some support zero values,
                              # others one or two values,
                              # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                            { # The value of the condition.
                              "relativeDate": "A String", # A relative date (based on the current date).
                                  # Valid only if the type is
                                  # DATE_BEFORE,
                                  # DATE_AFTER,
                                  # DATE_ON_OR_BEFORE or
                                  # DATE_ON_OR_AFTER.
                                  #
                                  # Relative dates are not supported in data validation.
                                  # They are supported only in conditional formatting and
                                  # conditional filters.
                              "userEnteredValue": "A String", # A value the condition is based on.
                                  # The value will be parsed as if the user typed into a cell.
                                  # Formulas are supported (and must begin with an `=`).
                            },
                          ],
                        },
                      },
                      "textFormatRuns": [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                          # on user entered strings, not formulas, bools, or numbers.
                          # Runs start at specific indexes in the text and continue until the next
                          # run. Properties of a run will continue unless explicitly changed
                          # in a subsequent run (and properties of the first run will continue
                          # the properties of the cell unless explicitly changed).
                          #
                          # When writing, the new runs will overwrite any prior runs.  When writing a
                          # new user_entered_value, previous runs will be erased.
                        { # A run of a text format. The format of this run continues until the start
                            # index of the next run.
                            # When updating, all fields must be set.
                          "startIndex": 42, # The character index where this run starts.
                          "format": { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell's format.
                              # Absent values indicate that the field isn't specified.
                            "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha <= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!('alpha' in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(',');
                                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = ['#'];
                                #       for (var i = 0; i < missingZeros; i++) {
                                #          resultBuilder.push('0');
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join('');
                                #     };
                                #
                                #     // ...
                              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            },
                            "bold": True or False, # True if the text is bold.
                            "strikethrough": True or False, # True if the text has a strikethrough.
                            "fontFamily": "A String", # The font family.
                            "fontSize": 42, # The size of the font.
                            "italic": True or False, # True if the text is italicized.
                            "underline": True or False, # True if the text is underlined.
                          },
                        },
                      ],
                    },
                  ],
                },
              ],
            },
          ],
          "properties": { # Properties of a sheet. # The properties of the sheet.
            "sheetType": "A String", # The type of sheet. Defaults to GRID.
                # This field cannot be changed once set.
            "index": 42, # The index of the sheet within the spreadsheet.
                # When adding or updating sheet properties, if this field
                # is excluded then the sheet will be added or moved to the end
                # of the sheet list. When updating sheet indices or inserting
                # sheets, movement is considered in "before the move" indexes.
                # For example, if there were 3 sheets (S1, S2, S3) in order to
                # move S1 ahead of S2 the index would have to be set to 2. A sheet
                # index update request will be ignored if the requested index is
                # identical to the sheets current index or if the requested new
                # index is equal to the current sheet index + 1.
            "title": "A String", # The name of the sheet.
            "gridProperties": { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
                # (If the sheet is an object sheet, containing a chart or image, then
                # this field will be absent.)
                # When writing it is an error to set any grid properties on non-grid sheets.
              "columnCount": 42, # The number of columns in the grid.
              "rowCount": 42, # The number of rows in the grid.
              "frozenColumnCount": 42, # The number of columns that are frozen in the grid.
              "hideGridlines": True or False, # True if the grid isn't showing gridlines in the UI.
              "frozenRowCount": 42, # The number of rows that are frozen in the grid.
            },
            "rightToLeft": True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
            "tabColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "hidden": True or False, # True if the sheet is hidden in the UI, false if it's visible.
            "sheetId": 42, # The ID of the sheet. Must be non-negative.
                # This field cannot be changed once set.
          },
        },
      ],
      "spreadsheetUrl": "A String", # The url of the spreadsheet.
          # This field is read-only.
    },
    "replies": [ # The reply of the updates.  This maps 1:1 with the updates, although
        # replies to some requests may be empty.
      { # A single response from an update.
        "duplicateFilterView": { # The result of a filter view being duplicated. # A reply from duplicating a filter view.
          "filter": { # A filter view. # The newly created filter.
            "title": "A String", # The name of the filter view.
            "namedRangeId": "A String", # The named range this filter view is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            "filterViewId": 42, # The ID of the filter view.
            "range": { # A range on a sheet. # The range this filter view covers.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "sortSpecs": [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                "sortOrder": "A String", # The order data should be sorted.
                "dimensionIndex": 42, # The dimension the sort should be applied to.
              },
            ],
            "criteria": { # The criteria for showing/hiding values per column.
                # The map's key is the column index, and the value is the criteria for
                # that column.
              "a_key": { # Criteria for showing/hiding rows in a filter or filter view.
                "hiddenValues": [ # Values that should be hidden.
                  "A String",
                ],
                "condition": { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hiddenValues -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  "type": "A String", # The type of condition.
                  "values": [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      "relativeDate": "A String", # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      "userEnteredValue": "A String", # A value the condition is based on.
                          # The value will be parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=`).
                    },
                  ],
                },
              },
            },
          },
        },
        "duplicateSheet": { # The result of duplicating a sheet. # A reply from duplicating a sheet.
          "properties": { # Properties of a sheet. # The properties of the duplicate sheet.
            "sheetType": "A String", # The type of sheet. Defaults to GRID.
                # This field cannot be changed once set.
            "index": 42, # The index of the sheet within the spreadsheet.
                # When adding or updating sheet properties, if this field
                # is excluded then the sheet will be added or moved to the end
                # of the sheet list. When updating sheet indices or inserting
                # sheets, movement is considered in "before the move" indexes.
                # For example, if there were 3 sheets (S1, S2, S3) in order to
                # move S1 ahead of S2 the index would have to be set to 2. A sheet
                # index update request will be ignored if the requested index is
                # identical to the sheets current index or if the requested new
                # index is equal to the current sheet index + 1.
            "title": "A String", # The name of the sheet.
            "gridProperties": { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
                # (If the sheet is an object sheet, containing a chart or image, then
                # this field will be absent.)
                # When writing it is an error to set any grid properties on non-grid sheets.
              "columnCount": 42, # The number of columns in the grid.
              "rowCount": 42, # The number of rows in the grid.
              "frozenColumnCount": 42, # The number of columns that are frozen in the grid.
              "hideGridlines": True or False, # True if the grid isn't showing gridlines in the UI.
              "frozenRowCount": 42, # The number of rows that are frozen in the grid.
            },
            "rightToLeft": True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
            "tabColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "hidden": True or False, # True if the sheet is hidden in the UI, false if it's visible.
            "sheetId": 42, # The ID of the sheet. Must be non-negative.
                # This field cannot be changed once set.
          },
        },
        "updateEmbeddedObjectPosition": { # The result of updating an embedded object's position. # A reply from updating an embedded object's position.
          "position": { # The position of an embedded object such as a chart. # The new position of the embedded object.
            "newSheet": True or False, # If true, the embedded object will be put on a new sheet whose ID
                # is chosen for you. Used only when writing.
            "sheetId": 42, # The sheet this is on. Set only if the embedded object
                # is on its own sheet. Must be non-negative.
            "overlayPosition": { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
              "anchorCell": { # A coordinate in a sheet. # The cell the object is anchored to.
                  # All indexes are zero-based.
                "rowIndex": 42, # The row index of the coordinate.
                "columnIndex": 42, # The column index of the coordinate.
                "sheetId": 42, # The sheet this coordinate is on.
              },
              "offsetYPixels": 42, # The vertical offset, in pixels, that the object is offset
                  # from the anchor cell.
              "widthPixels": 42, # The width of the object, in pixels. Defaults to 600.
              "offsetXPixels": 42, # The horizontal offset, in pixels, that the object is offset
                  # from the anchor cell.
              "heightPixels": 42, # The height of the object, in pixels. Defaults to 371.
            },
          },
        },
        "addChart": { # The result of adding a chart to a spreadsheet. # A reply from adding a chart.
          "chart": { # A chart embedded in a sheet. # The newly added chart.
            "chartId": 42, # The ID of the chart.
            "position": { # The position of an embedded object such as a chart. # The position of the chart.
              "newSheet": True or False, # If true, the embedded object will be put on a new sheet whose ID
                  # is chosen for you. Used only when writing.
              "sheetId": 42, # The sheet this is on. Set only if the embedded object
                  # is on its own sheet. Must be non-negative.
              "overlayPosition": { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                "anchorCell": { # A coordinate in a sheet. # The cell the object is anchored to.
                    # All indexes are zero-based.
                  "rowIndex": 42, # The row index of the coordinate.
                  "columnIndex": 42, # The column index of the coordinate.
                  "sheetId": 42, # The sheet this coordinate is on.
                },
                "offsetYPixels": 42, # The vertical offset, in pixels, that the object is offset
                    # from the anchor cell.
                "widthPixels": 42, # The width of the object, in pixels. Defaults to 600.
                "offsetXPixels": 42, # The horizontal offset, in pixels, that the object is offset
                    # from the anchor cell.
                "heightPixels": 42, # The height of the object, in pixels. Defaults to 371.
              },
            },
            "spec": { # The specifications of a chart. # The specification of the chart.
              "hiddenDimensionStrategy": "A String", # Determines how the charts will use hidden rows or columns.
              "pieChart": { # A <a href="/chart/interactive/docs/gallery/piechart">pie chart</a>. # A pie chart specification.
                "series": { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                  "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                    "sources": [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) & all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be contiguous across the domain and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `"Sheet1"` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                        "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                        "sheetId": 42, # The sheet this range is on.
                        "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                        "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                "domain": { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                  "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                    "sources": [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) & all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be contiguous across the domain and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `"Sheet1"` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                        "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                        "sheetId": 42, # The sheet this range is on.
                        "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                        "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                "threeDimensional": True or False, # True if the pie is three dimensional.
                "legendPosition": "A String", # Where the legend of the pie chart should be drawn.
                "pieHole": 3.14, # The size of the hole in the pie chart.
              },
              "basicChart": { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                  # See BasicChartType for the list of all
                  # charts this supports.
                  # of charts this supports.
                "headerCount": 42, # The number of rows or columns in the data that are "headers".
                    # If not set, Google Sheets will guess how many rows are headers based
                    # on the data.
                    #
                    # (Note that BasicChartAxis.title may override the axis title
                    #  inferred from the header values.)
                "series": [ # The data this chart is visualizing.
                  { # A single series of data in a chart.
                      # For example, if charting stock prices over time, multiple series may exist,
                      # one for the "Open Price", "High Price", "Low Price" and "Close Price".
                    "series": { # The data included in a domain or series. # The data being visualized in this chart series.
                      "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                        "sources": [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) & all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be contiguous across the domain and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `"Sheet1"` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                            "sheetId": 42, # The sheet this range is on.
                            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    "targetAxis": "A String", # The minor axis that will specify the range of values for this series.
                        # For example, if charting stocks over time, the "Volume" series
                        # may want to be pinned to the right with the prices pinned to the left,
                        # because the scale of trading volume is different than the scale of
                        # prices.
                        # It is an error to specify an axis that isn't a valid minor axis
                        # for the chart's type.
                    "type": "A String", # The type of this series. Valid only if the
                        # chartType is
                        # COMBO.
                        # Different types will change the way the series is visualized.
                        # Only LINE, AREA,
                        # and COLUMN are supported.
                  },
                ],
                "legendPosition": "A String", # The position of the chart legend.
                "domains": [ # The domain of data this is charting.
                    # Only a single domain is currently supported.
                  { # The domain of a chart.
                      # For example, if charting stock prices over time, this would be the date.
                    "domain": { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                        # this is the data representing the dates.
                      "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                        "sources": [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) & all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be contiguous across the domain and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `"Sheet1"` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                            "sheetId": 42, # The sheet this range is on.
                            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                  },
                ],
                "chartType": "A String", # The type of the chart.
                "axis": [ # The axis on the chart.
                  { # An axis of the chart.
                      # A chart may not have more than one axis per
                      # axis position.
                    "position": "A String", # The position of this axis.
                    "format": { # The format of a run of text in a cell. # The format of the title.
                        # Only valid if the axis is not associated with the domain.
                        # Absent values indicate that the field isn't specified.
                      "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "bold": True or False, # True if the text is bold.
                      "strikethrough": True or False, # True if the text has a strikethrough.
                      "fontFamily": "A String", # The font family.
                      "fontSize": 42, # The size of the font.
                      "italic": True or False, # True if the text is italicized.
                      "underline": True or False, # True if the text is underlined.
                    },
                    "title": "A String", # The title of this axis. If set, this overrides any title inferred
                        # from headers of the data.
                  },
                ],
              },
              "title": "A String", # The title of the chart.
            },
          },
        },
        "updateConditionalFormatRule": { # The result of updating a conditional format rule. # A reply from updating a conditional format rule.
          "oldIndex": 42, # The old index of the rule. Not set if a rule was replaced
              # (because it is the same as new_index).
          "newIndex": 42, # The index of the new rule.
          "oldRule": { # A rule describing a conditional format. # The old (deleted) rule. Not set if a rule was moved
              # (because it is the same as new_rule).
            "ranges": [ # The ranges that will be formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
            ],
            "booleanRule": { # A rule that may or may not match, depending on the condition. # The formatting is either "on" or "off" according to the rule.
              "condition": { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format will be applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                "type": "A String", # The type of condition.
                "values": [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    "relativeDate": "A String", # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    "userEnteredValue": "A String", # A value the condition is based on.
                        # The value will be parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=`).
                  },
                ],
              },
              "format": { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &
                  # background color.
                "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                  "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user's locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                      # information about the supported patterns.
                  "type": "A String", # The type of the number format.
                      # When writing, this field must be set.
                },
                "textDirection": "A String", # The direction of the text in the cell.
                "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  "top": 42, # The top padding of the cell.
                  "right": 42, # The right padding of the cell.
                  "bottom": 42, # The bottom padding of the cell.
                  "left": 42, # The left padding of the cell.
                },
                "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn't specified.
                  "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "bold": True or False, # True if the text is bold.
                  "strikethrough": True or False, # True if the text has a strikethrough.
                  "fontFamily": "A String", # The font family.
                  "fontSize": 42, # The size of the font.
                  "italic": True or False, # True if the text is italicized.
                  "underline": True or False, # True if the text is underlined.
                },
                "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                "borders": { # The borders of the cell. # The borders of the cell.
                  "top": { # A border along a cell. # The top border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "right": { # A border along a cell. # The right border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "bottom": { # A border along a cell. # The bottom border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "left": { # A border along a cell. # The left border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                },
                "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
              },
            },
            "gradientRule": { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              "maxpoint": { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
              "midpoint": { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
              "minpoint": { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
            },
          },
          "newRule": { # A rule describing a conditional format. # The new rule that replaced the old rule (if replacing),
              # or the rule that was moved (if moved)
            "ranges": [ # The ranges that will be formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
            ],
            "booleanRule": { # A rule that may or may not match, depending on the condition. # The formatting is either "on" or "off" according to the rule.
              "condition": { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format will be applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                "type": "A String", # The type of condition.
                "values": [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    "relativeDate": "A String", # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    "userEnteredValue": "A String", # A value the condition is based on.
                        # The value will be parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=`).
                  },
                ],
              },
              "format": { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &
                  # background color.
                "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                  "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user's locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                      # information about the supported patterns.
                  "type": "A String", # The type of the number format.
                      # When writing, this field must be set.
                },
                "textDirection": "A String", # The direction of the text in the cell.
                "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  "top": 42, # The top padding of the cell.
                  "right": 42, # The right padding of the cell.
                  "bottom": 42, # The bottom padding of the cell.
                  "left": 42, # The left padding of the cell.
                },
                "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn't specified.
                  "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "bold": True or False, # True if the text is bold.
                  "strikethrough": True or False, # True if the text has a strikethrough.
                  "fontFamily": "A String", # The font family.
                  "fontSize": 42, # The size of the font.
                  "italic": True or False, # True if the text is italicized.
                  "underline": True or False, # True if the text is underlined.
                },
                "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                "borders": { # The borders of the cell. # The borders of the cell.
                  "top": { # A border along a cell. # The top border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "right": { # A border along a cell. # The right border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "bottom": { # A border along a cell. # The bottom border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "left": { # A border along a cell. # The left border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                },
                "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
              },
            },
            "gradientRule": { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              "maxpoint": { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
              "midpoint": { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
              "minpoint": { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
            },
          },
        },
        "addSheet": { # The result of adding a sheet. # A reply from adding a sheet.
          "properties": { # Properties of a sheet. # The properties of the newly added sheet.
            "sheetType": "A String", # The type of sheet. Defaults to GRID.
                # This field cannot be changed once set.
            "index": 42, # The index of the sheet within the spreadsheet.
                # When adding or updating sheet properties, if this field
                # is excluded then the sheet will be added or moved to the end
                # of the sheet list. When updating sheet indices or inserting
                # sheets, movement is considered in "before the move" indexes.
                # For example, if there were 3 sheets (S1, S2, S3) in order to
                # move S1 ahead of S2 the index would have to be set to 2. A sheet
                # index update request will be ignored if the requested index is
                # identical to the sheets current index or if the requested new
                # index is equal to the current sheet index + 1.
            "title": "A String", # The name of the sheet.
            "gridProperties": { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
                # (If the sheet is an object sheet, containing a chart or image, then
                # this field will be absent.)
                # When writing it is an error to set any grid properties on non-grid sheets.
              "columnCount": 42, # The number of columns in the grid.
              "rowCount": 42, # The number of rows in the grid.
              "frozenColumnCount": 42, # The number of columns that are frozen in the grid.
              "hideGridlines": True or False, # True if the grid isn't showing gridlines in the UI.
              "frozenRowCount": 42, # The number of rows that are frozen in the grid.
            },
            "rightToLeft": True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
            "tabColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "hidden": True or False, # True if the sheet is hidden in the UI, false if it's visible.
            "sheetId": 42, # The ID of the sheet. Must be non-negative.
                # This field cannot be changed once set.
          },
        },
        "findReplace": { # The result of the find/replace. # A reply from doing a find/replace.
          "occurrencesChanged": 42, # The number of occurrences (possibly multiple within a cell) changed.
              # For example, if replacing `"e"` with `"o"` in `"Google Sheets"`, this would
              # be `"3"` because `"Google Sheets"` -> `"Googlo Shoots"`.
          "sheetsChanged": 42, # The number of sheets changed.
          "rowsChanged": 42, # The number of rows changed.
          "valuesChanged": 42, # The number of non-formula cells changed.
          "formulasChanged": 42, # The number of formula cells changed.
        },
        "addNamedRange": { # The result of adding a named range. # A reply from adding a named range.
          "namedRange": { # A named range. # The named range to add.
            "namedRangeId": "A String", # The ID of the named range.
            "range": { # A range on a sheet. # The range this represents.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "name": "A String", # The name of the named range.
          },
        },
        "addProtectedRange": { # The result of adding a new protected range. # A reply from adding a protected range.
          "protectedRange": { # A protected range. # The newly added protected range.
            "unprotectedRanges": [ # The list of unprotected ranges within a protected sheet.
                # Unprotected ranges are only supported on protected sheets.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
            ],
            "requestingUserCanEdit": True or False, # True if the user who requested this protected range can edit the
                # protected area.
                # This field is read-only.
            "description": "A String", # The description of this protected range.
            "namedRangeId": "A String", # The named range this protected range is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            "editors": { # The editors of a protected range. # The users and groups with edit access to the protected range.
                # This field is only visible to users with edit access to the protected
                # range and the document.
                # Editors are not supported with warning_only protection.
              "domainUsersCanEdit": True or False, # True if anyone in the document's domain has edit access to the protected
                  # range.  Domain protection is only supported on documents within a domain.
              "users": [ # The email addresses of users with edit access to the protected range.
                "A String",
              ],
              "groups": [ # The email addresses of groups with edit access to the protected range.
                "A String",
              ],
            },
            "protectedRangeId": 42, # The ID of the protected range.
                # This field is read-only.
            "warningOnly": True or False, # True if this protected range will show a warning when editing.
                # Warning-based protection means that every user can edit data in the
                # protected range, except editing will prompt a warning asking the user
                # to confirm the edit.
                #
                # When writing: if this field is true, then editors is ignored.
                # Additionally, if this field is changed from true to false and the
                # `editors` field is not set (nor included in the field mask), then
                # the editors will be set to all the editors in the document.
            "range": { # A range on a sheet. # The range that is being protected.
                # The range may be fully unbounded, in which case this is considered
                # a protected sheet.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
          },
        },
        "deleteConditionalFormatRule": { # The result of deleting a conditional format rule. # A reply from deleting a conditional format rule.
          "rule": { # A rule describing a conditional format. # The rule that was deleted.
            "ranges": [ # The ranges that will be formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
            ],
            "booleanRule": { # A rule that may or may not match, depending on the condition. # The formatting is either "on" or "off" according to the rule.
              "condition": { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format will be applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                "type": "A String", # The type of condition.
                "values": [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    "relativeDate": "A String", # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    "userEnteredValue": "A String", # A value the condition is based on.
                        # The value will be parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=`).
                  },
                ],
              },
              "format": { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &
                  # background color.
                "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                  "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user's locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                      # information about the supported patterns.
                  "type": "A String", # The type of the number format.
                      # When writing, this field must be set.
                },
                "textDirection": "A String", # The direction of the text in the cell.
                "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  "top": 42, # The top padding of the cell.
                  "right": 42, # The right padding of the cell.
                  "bottom": 42, # The bottom padding of the cell.
                  "left": 42, # The left padding of the cell.
                },
                "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn't specified.
                  "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "bold": True or False, # True if the text is bold.
                  "strikethrough": True or False, # True if the text has a strikethrough.
                  "fontFamily": "A String", # The font family.
                  "fontSize": 42, # The size of the font.
                  "italic": True or False, # True if the text is italicized.
                  "underline": True or False, # True if the text is underlined.
                },
                "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                "borders": { # The borders of the cell. # The borders of the cell.
                  "top": { # A border along a cell. # The top border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "right": { # A border along a cell. # The right border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "bottom": { # A border along a cell. # The bottom border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "left": { # A border along a cell. # The left border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                },
                "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
              },
            },
            "gradientRule": { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              "maxpoint": { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
              "midpoint": { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
              "minpoint": { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
            },
          },
        },
        "addBanding": { # The result of adding a banded range. # A reply from adding a banded range.
          "bandedRange": { # A banded (alternating colors) range in a sheet. # The banded range that was added.
            "range": { # A range on a sheet. # The range over which these properties are applied.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "columnProperties": { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties will be applied on a column-
                # by-column basis throughout all the columns in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              "secondBandColor": { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "headerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first
                  # row or column will be filled with this color and the colors will
                  # alternate between first_band_color and second_band_color starting
                  # from the second row or column. Otherwise, the first row or column will be
                  # filled with first_band_color and the colors will proceed to alternate
                  # as they normally would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "footerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column will be filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "firstBandColor": { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
            },
            "rowProperties": { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties will be applied on a row-by-row
                # basis throughout all the rows in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              "secondBandColor": { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "headerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first
                  # row or column will be filled with this color and the colors will
                  # alternate between first_band_color and second_band_color starting
                  # from the second row or column. Otherwise, the first row or column will be
                  # filled with first_band_color and the colors will proceed to alternate
                  # as they normally would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "footerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column will be filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "firstBandColor": { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
            },
            "bandedRangeId": 42, # The id of the banded range.
          },
        },
        "addFilterView": { # The result of adding a filter view. # A reply from adding a filter view.
          "filter": { # A filter view. # The newly added filter view.
            "title": "A String", # The name of the filter view.
            "namedRangeId": "A String", # The named range this filter view is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            "filterViewId": 42, # The ID of the filter view.
            "range": { # A range on a sheet. # The range this filter view covers.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "sortSpecs": [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                "sortOrder": "A String", # The order data should be sorted.
                "dimensionIndex": 42, # The dimension the sort should be applied to.
              },
            ],
            "criteria": { # The criteria for showing/hiding values per column.
                # The map's key is the column index, and the value is the criteria for
                # that column.
              "a_key": { # Criteria for showing/hiding rows in a filter or filter view.
                "hiddenValues": [ # Values that should be hidden.
                  "A String",
                ],
                "condition": { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hiddenValues -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  "type": "A String", # The type of condition.
                  "values": [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      "relativeDate": "A String", # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      "userEnteredValue": "A String", # A value the condition is based on.
                          # The value will be parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=`).
                    },
                  ],
                },
              },
            },
          },
        },
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="create">create(body, x__xgafv=None)</code>
  <pre>Creates a spreadsheet, returning the newly created spreadsheet.

Args:
  body: object, The request body. (required)
    The object takes the form of:

{ # Resource that represents a spreadsheet.
  "spreadsheetId": "A String", # The ID of the spreadsheet.
      # This field is read-only.
  "namedRanges": [ # The named ranges defined in a spreadsheet.
    { # A named range.
      "namedRangeId": "A String", # The ID of the named range.
      "range": { # A range on a sheet. # The range this represents.
          # All indexes are zero-based.
          # Indexes are half open, e.g the start index is inclusive
          # and the end index is exclusive -- [start_index, end_index).
          # Missing indexes indicate the range is unbounded on that side.
          #
          # For example, if `"Sheet1"` is sheet ID 0, then:
          #
          #   `Sheet1!A1:A1 == sheet_id: 0,
          #                   start_row_index: 0, end_row_index: 1,
          #                   start_column_index: 0, end_column_index: 1`
          #
          #   `Sheet1!A3:B4 == sheet_id: 0,
          #                   start_row_index: 2, end_row_index: 4,
          #                   start_column_index: 0, end_column_index: 2`
          #
          #   `Sheet1!A:B == sheet_id: 0,
          #                 start_column_index: 0, end_column_index: 2`
          #
          #   `Sheet1!A5:B == sheet_id: 0,
          #                  start_row_index: 4,
          #                  start_column_index: 0, end_column_index: 2`
          #
          #   `Sheet1 == sheet_id:0`
          #
          # The start index must always be less than or equal to the end index.
          # If the start index equals the end index, then the range is empty.
          # Empty ranges are typically not meaningful and are usually rendered in the
          # UI as `#REF!`.
        "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
        "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
        "sheetId": 42, # The sheet this range is on.
        "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
        "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
      },
      "name": "A String", # The name of the named range.
    },
  ],
  "properties": { # Properties of a spreadsheet. # Overall properties of a spreadsheet.
    "locale": "A String", # The locale of the spreadsheet in one of the following formats:
        #
        # * an ISO 639-1 language code such as `en`
        #
        # * an ISO 639-2 language code such as `fil`, if no 639-1 code exists
        #
        # * a combination of the ISO language code and country code, such as `en_US`
        #
        # Note: when updating this field, not all locales/languages are supported.
    "timeZone": "A String", # The time zone of the spreadsheet, in CLDR format such as
        # `America/New_York`. If the time zone isn't recognized, this may
        # be a custom time zone such as `GMT-07:00`.
    "autoRecalc": "A String", # The amount of time to wait before volatile functions are recalculated.
    "defaultFormat": { # The format of a cell. # The default format of all cells in the spreadsheet.
        # CellData.effectiveFormat will not be set if the
        # cell's format is equal to this default format.
        # This field is read-only.
      "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
        "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
            # the user's locale will be used if necessary for the given type.
            # See the [Date and Number Formats guide](/sheets/guides/formats) for more
            # information about the supported patterns.
        "type": "A String", # The type of the number format.
            # When writing, this field must be set.
      },
      "textDirection": "A String", # The direction of the text in the cell.
      "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
          # When updating padding, every field must be specified.
        "top": 42, # The top padding of the cell.
        "right": 42, # The right padding of the cell.
        "bottom": 42, # The bottom padding of the cell.
        "left": 42, # The left padding of the cell.
      },
      "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
      "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
          # for simplicity of conversion to/from color representations in various
          # languages over compactness; for example, the fields of this representation
          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
          # method in iOS; and, with just a little work, it can be easily formatted into
          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
          #
          # Example (Java):
          #
          #      import com.google.type.Color;
          #
          #      // ...
          #      public static java.awt.Color fromProto(Color protocolor) {
          #        float alpha = protocolor.hasAlpha()
          #            ? protocolor.getAlpha().getValue()
          #            : 1.0;
          #
          #        return new java.awt.Color(
          #            protocolor.getRed(),
          #            protocolor.getGreen(),
          #            protocolor.getBlue(),
          #            alpha);
          #      }
          #
          #      public static Color toProto(java.awt.Color color) {
          #        float red = (float) color.getRed();
          #        float green = (float) color.getGreen();
          #        float blue = (float) color.getBlue();
          #        float denominator = 255.0;
          #        Color.Builder resultBuilder =
          #            Color
          #                .newBuilder()
          #                .setRed(red / denominator)
          #                .setGreen(green / denominator)
          #                .setBlue(blue / denominator);
          #        int alpha = color.getAlpha();
          #        if (alpha != 255) {
          #          result.setAlpha(
          #              FloatValue
          #                  .newBuilder()
          #                  .setValue(((float) alpha) / denominator)
          #                  .build());
          #        }
          #        return resultBuilder.build();
          #      }
          #      // ...
          #
          # Example (iOS / Obj-C):
          #
          #      // ...
          #      static UIColor* fromProto(Color* protocolor) {
          #         float red = [protocolor red];
          #         float green = [protocolor green];
          #         float blue = [protocolor blue];
          #         FloatValue* alpha_wrapper = [protocolor alpha];
          #         float alpha = 1.0;
          #         if (alpha_wrapper != nil) {
          #           alpha = [alpha_wrapper value];
          #         }
          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
          #      }
          #
          #      static Color* toProto(UIColor* color) {
          #          CGFloat red, green, blue, alpha;
          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
          #            return nil;
          #          }
          #          Color* result = [Color alloc] init];
          #          [result setRed:red];
          #          [result setGreen:green];
          #          [result setBlue:blue];
          #          if (alpha <= 0.9999) {
          #            [result setAlpha:floatWrapperWithValue(alpha)];
          #          }
          #          [result autorelease];
          #          return result;
          #     }
          #     // ...
          #
          #  Example (JavaScript):
          #
          #     // ...
          #
          #     var protoToCssColor = function(rgb_color) {
          #        var redFrac = rgb_color.red || 0.0;
          #        var greenFrac = rgb_color.green || 0.0;
          #        var blueFrac = rgb_color.blue || 0.0;
          #        var red = Math.floor(redFrac * 255);
          #        var green = Math.floor(greenFrac * 255);
          #        var blue = Math.floor(blueFrac * 255);
          #
          #        if (!('alpha' in rgb_color)) {
          #           return rgbToCssColor_(red, green, blue);
          #        }
          #
          #        var alphaFrac = rgb_color.alpha.value || 0.0;
          #        var rgbParams = [red, green, blue].join(',');
          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
          #     };
          #
          #     var rgbToCssColor_ = function(red, green, blue) {
          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
          #       var hexString = rgbNumber.toString(16);
          #       var missingZeros = 6 - hexString.length;
          #       var resultBuilder = ['#'];
          #       for (var i = 0; i < missingZeros; i++) {
          #          resultBuilder.push('0');
          #       }
          #       resultBuilder.push(hexString);
          #       return resultBuilder.join('');
          #     };
          #
          #     // ...
        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
            # the final pixel color is defined by the equation:
            #
            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
            #
            # This means that a value of 1.0 corresponds to a solid color, whereas
            # a value of 0.0 corresponds to a completely transparent color. This
            # uses a wrapper message rather than a simple float scalar so that it is
            # possible to distinguish between a default value and the value being unset.
            # If omitted, this color object is to be rendered as a solid color
            # (as if the alpha value had been explicitly given with a value of 1.0).
        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
      },
      "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
      "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
          # Absent values indicate that the field isn't specified.
        "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
            # for simplicity of conversion to/from color representations in various
            # languages over compactness; for example, the fields of this representation
            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
            # method in iOS; and, with just a little work, it can be easily formatted into
            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
            #
            # Example (Java):
            #
            #      import com.google.type.Color;
            #
            #      // ...
            #      public static java.awt.Color fromProto(Color protocolor) {
            #        float alpha = protocolor.hasAlpha()
            #            ? protocolor.getAlpha().getValue()
            #            : 1.0;
            #
            #        return new java.awt.Color(
            #            protocolor.getRed(),
            #            protocolor.getGreen(),
            #            protocolor.getBlue(),
            #            alpha);
            #      }
            #
            #      public static Color toProto(java.awt.Color color) {
            #        float red = (float) color.getRed();
            #        float green = (float) color.getGreen();
            #        float blue = (float) color.getBlue();
            #        float denominator = 255.0;
            #        Color.Builder resultBuilder =
            #            Color
            #                .newBuilder()
            #                .setRed(red / denominator)
            #                .setGreen(green / denominator)
            #                .setBlue(blue / denominator);
            #        int alpha = color.getAlpha();
            #        if (alpha != 255) {
            #          result.setAlpha(
            #              FloatValue
            #                  .newBuilder()
            #                  .setValue(((float) alpha) / denominator)
            #                  .build());
            #        }
            #        return resultBuilder.build();
            #      }
            #      // ...
            #
            # Example (iOS / Obj-C):
            #
            #      // ...
            #      static UIColor* fromProto(Color* protocolor) {
            #         float red = [protocolor red];
            #         float green = [protocolor green];
            #         float blue = [protocolor blue];
            #         FloatValue* alpha_wrapper = [protocolor alpha];
            #         float alpha = 1.0;
            #         if (alpha_wrapper != nil) {
            #           alpha = [alpha_wrapper value];
            #         }
            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
            #      }
            #
            #      static Color* toProto(UIColor* color) {
            #          CGFloat red, green, blue, alpha;
            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
            #            return nil;
            #          }
            #          Color* result = [Color alloc] init];
            #          [result setRed:red];
            #          [result setGreen:green];
            #          [result setBlue:blue];
            #          if (alpha <= 0.9999) {
            #            [result setAlpha:floatWrapperWithValue(alpha)];
            #          }
            #          [result autorelease];
            #          return result;
            #     }
            #     // ...
            #
            #  Example (JavaScript):
            #
            #     // ...
            #
            #     var protoToCssColor = function(rgb_color) {
            #        var redFrac = rgb_color.red || 0.0;
            #        var greenFrac = rgb_color.green || 0.0;
            #        var blueFrac = rgb_color.blue || 0.0;
            #        var red = Math.floor(redFrac * 255);
            #        var green = Math.floor(greenFrac * 255);
            #        var blue = Math.floor(blueFrac * 255);
            #
            #        if (!('alpha' in rgb_color)) {
            #           return rgbToCssColor_(red, green, blue);
            #        }
            #
            #        var alphaFrac = rgb_color.alpha.value || 0.0;
            #        var rgbParams = [red, green, blue].join(',');
            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
            #     };
            #
            #     var rgbToCssColor_ = function(red, green, blue) {
            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
            #       var hexString = rgbNumber.toString(16);
            #       var missingZeros = 6 - hexString.length;
            #       var resultBuilder = ['#'];
            #       for (var i = 0; i < missingZeros; i++) {
            #          resultBuilder.push('0');
            #       }
            #       resultBuilder.push(hexString);
            #       return resultBuilder.join('');
            #     };
            #
            #     // ...
          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
              # the final pixel color is defined by the equation:
              #
              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
              #
              # This means that a value of 1.0 corresponds to a solid color, whereas
              # a value of 0.0 corresponds to a completely transparent color. This
              # uses a wrapper message rather than a simple float scalar so that it is
              # possible to distinguish between a default value and the value being unset.
              # If omitted, this color object is to be rendered as a solid color
              # (as if the alpha value had been explicitly given with a value of 1.0).
          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
        },
        "bold": True or False, # True if the text is bold.
        "strikethrough": True or False, # True if the text has a strikethrough.
        "fontFamily": "A String", # The font family.
        "fontSize": 42, # The size of the font.
        "italic": True or False, # True if the text is italicized.
        "underline": True or False, # True if the text is underlined.
      },
      "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
      "borders": { # The borders of the cell. # The borders of the cell.
        "top": { # A border along a cell. # The top border of the cell.
          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
              #            return nil;
              #          }
              #          Color* result = [Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha <= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!('alpha' in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(',');
              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = ['#'];
              #       for (var i = 0; i < missingZeros; i++) {
              #          resultBuilder.push('0');
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join('');
              #     };
              #
              #     // ...
            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
          },
          "width": 42, # The width of the border, in pixels.
              # Deprecated; the width is determined by the "style" field.
          "style": "A String", # The style of the border.
        },
        "right": { # A border along a cell. # The right border of the cell.
          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
              #            return nil;
              #          }
              #          Color* result = [Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha <= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!('alpha' in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(',');
              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = ['#'];
              #       for (var i = 0; i < missingZeros; i++) {
              #          resultBuilder.push('0');
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join('');
              #     };
              #
              #     // ...
            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
          },
          "width": 42, # The width of the border, in pixels.
              # Deprecated; the width is determined by the "style" field.
          "style": "A String", # The style of the border.
        },
        "bottom": { # A border along a cell. # The bottom border of the cell.
          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
              #            return nil;
              #          }
              #          Color* result = [Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha <= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!('alpha' in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(',');
              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = ['#'];
              #       for (var i = 0; i < missingZeros; i++) {
              #          resultBuilder.push('0');
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join('');
              #     };
              #
              #     // ...
            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
          },
          "width": 42, # The width of the border, in pixels.
              # Deprecated; the width is determined by the "style" field.
          "style": "A String", # The style of the border.
        },
        "left": { # A border along a cell. # The left border of the cell.
          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
              #            return nil;
              #          }
              #          Color* result = [Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha <= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!('alpha' in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(',');
              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = ['#'];
              #       for (var i = 0; i < missingZeros; i++) {
              #          resultBuilder.push('0');
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join('');
              #     };
              #
              #     // ...
            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
          },
          "width": 42, # The width of the border, in pixels.
              # Deprecated; the width is determined by the "style" field.
          "style": "A String", # The style of the border.
        },
      },
      "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
    },
    "title": "A String", # The title of the spreadsheet.
  },
  "sheets": [ # The sheets that are part of a spreadsheet.
    { # A sheet in a spreadsheet.
      "conditionalFormats": [ # The conditional format rules in this sheet.
        { # A rule describing a conditional format.
          "ranges": [ # The ranges that will be formatted if the condition is true.
              # All the ranges must be on the same grid.
            { # A range on a sheet.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
          ],
          "booleanRule": { # A rule that may or may not match, depending on the condition. # The formatting is either "on" or "off" according to the rule.
            "condition": { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                # the format will be applied.
                # BooleanConditions are used by conditional formatting,
                # data validation, and the criteria in filters.
              "type": "A String", # The type of condition.
              "values": [ # The values of the condition. The number of supported values depends
                  # on the condition type.  Some support zero values,
                  # others one or two values,
                  # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                { # The value of the condition.
                  "relativeDate": "A String", # A relative date (based on the current date).
                      # Valid only if the type is
                      # DATE_BEFORE,
                      # DATE_AFTER,
                      # DATE_ON_OR_BEFORE or
                      # DATE_ON_OR_AFTER.
                      #
                      # Relative dates are not supported in data validation.
                      # They are supported only in conditional formatting and
                      # conditional filters.
                  "userEnteredValue": "A String", # A value the condition is based on.
                      # The value will be parsed as if the user typed into a cell.
                      # Formulas are supported (and must begin with an `=`).
                },
              ],
            },
            "format": { # The format of a cell. # The format to apply.
                # Conditional formatting can only apply a subset of formatting:
                # bold, italic,
                # strikethrough,
                # foreground color &
                # background color.
              "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                    # the user's locale will be used if necessary for the given type.
                    # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                    # information about the supported patterns.
                "type": "A String", # The type of the number format.
                    # When writing, this field must be set.
              },
              "textDirection": "A String", # The direction of the text in the cell.
              "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                  # When updating padding, every field must be specified.
                "top": 42, # The top padding of the cell.
                "right": 42, # The right padding of the cell.
                "bottom": 42, # The bottom padding of the cell.
                "left": 42, # The left padding of the cell.
              },
              "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
              "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
              "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                  # Absent values indicate that the field isn't specified.
                "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "bold": True or False, # True if the text is bold.
                "strikethrough": True or False, # True if the text has a strikethrough.
                "fontFamily": "A String", # The font family.
                "fontSize": 42, # The size of the font.
                "italic": True or False, # True if the text is italicized.
                "underline": True or False, # True if the text is underlined.
              },
              "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
              "borders": { # The borders of the cell. # The borders of the cell.
                "top": { # A border along a cell. # The top border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
                "right": { # A border along a cell. # The right border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
                "bottom": { # A border along a cell. # The bottom border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
                "left": { # A border along a cell. # The left border of the cell.
                  "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "width": 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the "style" field.
                  "style": "A String", # The style of the border.
                },
              },
              "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
            },
          },
          "gradientRule": { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
              # the interpolation points listed. The format of a cell will vary
              # based on its contents as compared to the values of the interpolation
              # points.
            "maxpoint": { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                # These pin the gradient color scale according to the color,
                # type and value chosen.
              "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "type": "A String", # How the value should be interpreted.
              "value": "A String", # The value this interpolation point uses.  May be a formula.
                  # Unused if type is MIN or
                  # MAX.
            },
            "midpoint": { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                # These pin the gradient color scale according to the color,
                # type and value chosen.
              "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "type": "A String", # How the value should be interpreted.
              "value": "A String", # The value this interpolation point uses.  May be a formula.
                  # Unused if type is MIN or
                  # MAX.
            },
            "minpoint": { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                # These pin the gradient color scale according to the color,
                # type and value chosen.
              "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "type": "A String", # How the value should be interpreted.
              "value": "A String", # The value this interpolation point uses.  May be a formula.
                  # Unused if type is MIN or
                  # MAX.
            },
          },
        },
      ],
      "bandedRanges": [ # The banded (i.e. alternating colors) ranges on this sheet.
        { # A banded (alternating colors) range in a sheet.
          "range": { # A range on a sheet. # The range over which these properties are applied.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "columnProperties": { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties will be applied on a column-
              # by-column basis throughout all the columns in the range. At least one of
              # row_properties or column_properties must be specified.
              # BandedRange.row_properties and BandedRange.column_properties are
              # set, the fill colors are applied to cells according to the following rules:
              #
              # * header_color and footer_color take priority over band colors.
              # * first_band_color takes priority over second_band_color.
              # * row_properties takes priority over column_properties.
              #
              # For example, the first row color takes priority over the first column
              # color, but the first column color takes priority over the second row color.
              # Similarly, the row header takes priority over the column header in the
              # top left cell, but the column header takes priority over the first row
              # color if the row header is not set.
            "secondBandColor": { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "headerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first
                # row or column will be filled with this color and the colors will
                # alternate between first_band_color and second_band_color starting
                # from the second row or column. Otherwise, the first row or column will be
                # filled with first_band_color and the colors will proceed to alternate
                # as they normally would.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "footerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                # row or column will be filled with either first_band_color or
                # second_band_color, depending on the color of the previous row or
                # column.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "firstBandColor": { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
          },
          "rowProperties": { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties will be applied on a row-by-row
              # basis throughout all the rows in the range. At least one of
              # row_properties or column_properties must be specified.
              # BandedRange.row_properties and BandedRange.column_properties are
              # set, the fill colors are applied to cells according to the following rules:
              #
              # * header_color and footer_color take priority over band colors.
              # * first_band_color takes priority over second_band_color.
              # * row_properties takes priority over column_properties.
              #
              # For example, the first row color takes priority over the first column
              # color, but the first column color takes priority over the second row color.
              # Similarly, the row header takes priority over the column header in the
              # top left cell, but the column header takes priority over the first row
              # color if the row header is not set.
            "secondBandColor": { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "headerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first
                # row or column will be filled with this color and the colors will
                # alternate between first_band_color and second_band_color starting
                # from the second row or column. Otherwise, the first row or column will be
                # filled with first_band_color and the colors will proceed to alternate
                # as they normally would.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "footerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                # row or column will be filled with either first_band_color or
                # second_band_color, depending on the color of the previous row or
                # column.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "firstBandColor": { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
          },
          "bandedRangeId": 42, # The id of the banded range.
        },
      ],
      "merges": [ # The ranges that are merged together.
        { # A range on a sheet.
            # All indexes are zero-based.
            # Indexes are half open, e.g the start index is inclusive
            # and the end index is exclusive -- [start_index, end_index).
            # Missing indexes indicate the range is unbounded on that side.
            #
            # For example, if `"Sheet1"` is sheet ID 0, then:
            #
            #   `Sheet1!A1:A1 == sheet_id: 0,
            #                   start_row_index: 0, end_row_index: 1,
            #                   start_column_index: 0, end_column_index: 1`
            #
            #   `Sheet1!A3:B4 == sheet_id: 0,
            #                   start_row_index: 2, end_row_index: 4,
            #                   start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A:B == sheet_id: 0,
            #                 start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A5:B == sheet_id: 0,
            #                  start_row_index: 4,
            #                  start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1 == sheet_id:0`
            #
            # The start index must always be less than or equal to the end index.
            # If the start index equals the end index, then the range is empty.
            # Empty ranges are typically not meaningful and are usually rendered in the
            # UI as `#REF!`.
          "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
          "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
          "sheetId": 42, # The sheet this range is on.
          "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
          "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
        },
      ],
      "basicFilter": { # The default filter associated with a sheet. # The filter on this sheet, if any.
        "range": { # A range on a sheet. # The range the filter covers.
            # All indexes are zero-based.
            # Indexes are half open, e.g the start index is inclusive
            # and the end index is exclusive -- [start_index, end_index).
            # Missing indexes indicate the range is unbounded on that side.
            #
            # For example, if `"Sheet1"` is sheet ID 0, then:
            #
            #   `Sheet1!A1:A1 == sheet_id: 0,
            #                   start_row_index: 0, end_row_index: 1,
            #                   start_column_index: 0, end_column_index: 1`
            #
            #   `Sheet1!A3:B4 == sheet_id: 0,
            #                   start_row_index: 2, end_row_index: 4,
            #                   start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A:B == sheet_id: 0,
            #                 start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A5:B == sheet_id: 0,
            #                  start_row_index: 4,
            #                  start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1 == sheet_id:0`
            #
            # The start index must always be less than or equal to the end index.
            # If the start index equals the end index, then the range is empty.
            # Empty ranges are typically not meaningful and are usually rendered in the
            # UI as `#REF!`.
          "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
          "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
          "sheetId": 42, # The sheet this range is on.
          "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
          "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
        },
        "sortSpecs": [ # The sort order per column. Later specifications are used when values
            # are equal in the earlier specifications.
          { # A sort order associated with a specific column or row.
            "sortOrder": "A String", # The order data should be sorted.
            "dimensionIndex": 42, # The dimension the sort should be applied to.
          },
        ],
        "criteria": { # The criteria for showing/hiding values per column.
            # The map's key is the column index, and the value is the criteria for
            # that column.
          "a_key": { # Criteria for showing/hiding rows in a filter or filter view.
            "hiddenValues": [ # Values that should be hidden.
              "A String",
            ],
            "condition": { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                # (This does not override hiddenValues -- if a value is listed there,
                #  it will still be hidden.)
                # BooleanConditions are used by conditional formatting,
                # data validation, and the criteria in filters.
              "type": "A String", # The type of condition.
              "values": [ # The values of the condition. The number of supported values depends
                  # on the condition type.  Some support zero values,
                  # others one or two values,
                  # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                { # The value of the condition.
                  "relativeDate": "A String", # A relative date (based on the current date).
                      # Valid only if the type is
                      # DATE_BEFORE,
                      # DATE_AFTER,
                      # DATE_ON_OR_BEFORE or
                      # DATE_ON_OR_AFTER.
                      #
                      # Relative dates are not supported in data validation.
                      # They are supported only in conditional formatting and
                      # conditional filters.
                  "userEnteredValue": "A String", # A value the condition is based on.
                      # The value will be parsed as if the user typed into a cell.
                      # Formulas are supported (and must begin with an `=`).
                },
              ],
            },
          },
        },
      },
      "charts": [ # The specifications of every chart on this sheet.
        { # A chart embedded in a sheet.
          "chartId": 42, # The ID of the chart.
          "position": { # The position of an embedded object such as a chart. # The position of the chart.
            "newSheet": True or False, # If true, the embedded object will be put on a new sheet whose ID
                # is chosen for you. Used only when writing.
            "sheetId": 42, # The sheet this is on. Set only if the embedded object
                # is on its own sheet. Must be non-negative.
            "overlayPosition": { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
              "anchorCell": { # A coordinate in a sheet. # The cell the object is anchored to.
                  # All indexes are zero-based.
                "rowIndex": 42, # The row index of the coordinate.
                "columnIndex": 42, # The column index of the coordinate.
                "sheetId": 42, # The sheet this coordinate is on.
              },
              "offsetYPixels": 42, # The vertical offset, in pixels, that the object is offset
                  # from the anchor cell.
              "widthPixels": 42, # The width of the object, in pixels. Defaults to 600.
              "offsetXPixels": 42, # The horizontal offset, in pixels, that the object is offset
                  # from the anchor cell.
              "heightPixels": 42, # The height of the object, in pixels. Defaults to 371.
            },
          },
          "spec": { # The specifications of a chart. # The specification of the chart.
            "hiddenDimensionStrategy": "A String", # Determines how the charts will use hidden rows or columns.
            "pieChart": { # A <a href="/chart/interactive/docs/gallery/piechart">pie chart</a>. # A pie chart specification.
              "series": { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                  "sources": [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) & all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be contiguous across the domain and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `"Sheet1"` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                      "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                      "sheetId": 42, # The sheet this range is on.
                      "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                      "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              "domain": { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                  "sources": [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) & all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be contiguous across the domain and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `"Sheet1"` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                      "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                      "sheetId": 42, # The sheet this range is on.
                      "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                      "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              "threeDimensional": True or False, # True if the pie is three dimensional.
              "legendPosition": "A String", # Where the legend of the pie chart should be drawn.
              "pieHole": 3.14, # The size of the hole in the pie chart.
            },
            "basicChart": { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                # See BasicChartType for the list of all
                # charts this supports.
                # of charts this supports.
              "headerCount": 42, # The number of rows or columns in the data that are "headers".
                  # If not set, Google Sheets will guess how many rows are headers based
                  # on the data.
                  #
                  # (Note that BasicChartAxis.title may override the axis title
                  #  inferred from the header values.)
              "series": [ # The data this chart is visualizing.
                { # A single series of data in a chart.
                    # For example, if charting stock prices over time, multiple series may exist,
                    # one for the "Open Price", "High Price", "Low Price" and "Close Price".
                  "series": { # The data included in a domain or series. # The data being visualized in this chart series.
                    "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                      "sources": [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) & all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be contiguous across the domain and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `"Sheet1"` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                          "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                          "sheetId": 42, # The sheet this range is on.
                          "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                          "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  "targetAxis": "A String", # The minor axis that will specify the range of values for this series.
                      # For example, if charting stocks over time, the "Volume" series
                      # may want to be pinned to the right with the prices pinned to the left,
                      # because the scale of trading volume is different than the scale of
                      # prices.
                      # It is an error to specify an axis that isn't a valid minor axis
                      # for the chart's type.
                  "type": "A String", # The type of this series. Valid only if the
                      # chartType is
                      # COMBO.
                      # Different types will change the way the series is visualized.
                      # Only LINE, AREA,
                      # and COLUMN are supported.
                },
              ],
              "legendPosition": "A String", # The position of the chart legend.
              "domains": [ # The domain of data this is charting.
                  # Only a single domain is currently supported.
                { # The domain of a chart.
                    # For example, if charting stock prices over time, this would be the date.
                  "domain": { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                      # this is the data representing the dates.
                    "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                      "sources": [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) & all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be contiguous across the domain and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `"Sheet1"` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                          "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                          "sheetId": 42, # The sheet this range is on.
                          "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                          "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
              ],
              "chartType": "A String", # The type of the chart.
              "axis": [ # The axis on the chart.
                { # An axis of the chart.
                    # A chart may not have more than one axis per
                    # axis position.
                  "position": "A String", # The position of this axis.
                  "format": { # The format of a run of text in a cell. # The format of the title.
                      # Only valid if the axis is not associated with the domain.
                      # Absent values indicate that the field isn't specified.
                    "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "bold": True or False, # True if the text is bold.
                    "strikethrough": True or False, # True if the text has a strikethrough.
                    "fontFamily": "A String", # The font family.
                    "fontSize": 42, # The size of the font.
                    "italic": True or False, # True if the text is italicized.
                    "underline": True or False, # True if the text is underlined.
                  },
                  "title": "A String", # The title of this axis. If set, this overrides any title inferred
                      # from headers of the data.
                },
              ],
            },
            "title": "A String", # The title of the chart.
          },
        },
      ],
      "filterViews": [ # The filter views in this sheet.
        { # A filter view.
          "title": "A String", # The name of the filter view.
          "namedRangeId": "A String", # The named range this filter view is backed by, if any.
              #
              # When writing, only one of range or named_range_id
              # may be set.
          "filterViewId": 42, # The ID of the filter view.
          "range": { # A range on a sheet. # The range this filter view covers.
              #
              # When writing, only one of range or named_range_id
              # may be set.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "sortSpecs": [ # The sort order per column. Later specifications are used when values
              # are equal in the earlier specifications.
            { # A sort order associated with a specific column or row.
              "sortOrder": "A String", # The order data should be sorted.
              "dimensionIndex": 42, # The dimension the sort should be applied to.
            },
          ],
          "criteria": { # The criteria for showing/hiding values per column.
              # The map's key is the column index, and the value is the criteria for
              # that column.
            "a_key": { # Criteria for showing/hiding rows in a filter or filter view.
              "hiddenValues": [ # Values that should be hidden.
                "A String",
              ],
              "condition": { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                  # (This does not override hiddenValues -- if a value is listed there,
                  #  it will still be hidden.)
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                "type": "A String", # The type of condition.
                "values": [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    "relativeDate": "A String", # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    "userEnteredValue": "A String", # A value the condition is based on.
                        # The value will be parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=`).
                  },
                ],
              },
            },
          },
        },
      ],
      "protectedRanges": [ # The protected ranges in this sheet.
        { # A protected range.
          "unprotectedRanges": [ # The list of unprotected ranges within a protected sheet.
              # Unprotected ranges are only supported on protected sheets.
            { # A range on a sheet.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
          ],
          "requestingUserCanEdit": True or False, # True if the user who requested this protected range can edit the
              # protected area.
              # This field is read-only.
          "description": "A String", # The description of this protected range.
          "namedRangeId": "A String", # The named range this protected range is backed by, if any.
              #
              # When writing, only one of range or named_range_id
              # may be set.
          "editors": { # The editors of a protected range. # The users and groups with edit access to the protected range.
              # This field is only visible to users with edit access to the protected
              # range and the document.
              # Editors are not supported with warning_only protection.
            "domainUsersCanEdit": True or False, # True if anyone in the document's domain has edit access to the protected
                # range.  Domain protection is only supported on documents within a domain.
            "users": [ # The email addresses of users with edit access to the protected range.
              "A String",
            ],
            "groups": [ # The email addresses of groups with edit access to the protected range.
              "A String",
            ],
          },
          "protectedRangeId": 42, # The ID of the protected range.
              # This field is read-only.
          "warningOnly": True or False, # True if this protected range will show a warning when editing.
              # Warning-based protection means that every user can edit data in the
              # protected range, except editing will prompt a warning asking the user
              # to confirm the edit.
              #
              # When writing: if this field is true, then editors is ignored.
              # Additionally, if this field is changed from true to false and the
              # `editors` field is not set (nor included in the field mask), then
              # the editors will be set to all the editors in the document.
          "range": { # A range on a sheet. # The range that is being protected.
              # The range may be fully unbounded, in which case this is considered
              # a protected sheet.
              #
              # When writing, only one of range or named_range_id
              # may be set.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
        },
      ],
      "data": [ # Data in the grid, if this is a grid sheet.
          # The number of GridData objects returned is dependent on the number of
          # ranges requested on this sheet. For example, if this is representing
          # `Sheet1`, and the spreadsheet was requested with ranges
          # `Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a
          # startRow/startColumn of `0`,
          # while the second one will have `startRow 14` (zero-based row 15),
          # and `startColumn 3` (zero-based column D).
        { # Data in the grid, as well as metadata about the dimensions.
          "startRow": 42, # The first row this GridData refers to, zero-based.
          "rowMetadata": [ # Metadata about the requested rows in the grid, starting with the row
              # in start_row.
            { # Properties about a dimension.
              "pixelSize": 42, # The height (if a row) or width (if a column) of the dimension in pixels.
              "hiddenByUser": True or False, # True if this dimension is explicitly hidden.
              "hiddenByFilter": True or False, # True if this dimension is being filtered.
                  # This field is read-only.
            },
          ],
          "startColumn": 42, # The first column this GridData refers to, zero-based.
          "columnMetadata": [ # Metadata about the requested columns in the grid, starting with the column
              # in start_column.
            { # Properties about a dimension.
              "pixelSize": 42, # The height (if a row) or width (if a column) of the dimension in pixels.
              "hiddenByUser": True or False, # True if this dimension is explicitly hidden.
              "hiddenByFilter": True or False, # True if this dimension is being filtered.
                  # This field is read-only.
            },
          ],
          "rowData": [ # The data in the grid, one entry per row,
              # starting with the row in startRow.
              # The values in RowData will correspond to columns starting
              # at start_column.
            { # Data about each cell in a row.
              "values": [ # The values in the row, one per column.
                { # Data about a specific cell.
                  "pivotTable": { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                      # is computed dynamically based on its data, grouping, filters, values,
                      # etc. Only the top-left cell of the pivot table contains the pivot table
                      # definition. The other cells will contain the calculated values of the
                      # results of the pivot in their effective_value fields.
                    "valueLayout": "A String", # Whether values should be listed horizontally (as columns)
                        # or vertically (as rows).
                    "rows": [ # Each row grouping in the pivot table.
                      { # A single grouping (either row or column) in a pivot table.
                        "showTotals": True or False, # True if the pivot table should include the totals for this grouping.
                        "valueMetadata": [ # Metadata about values in the grouping.
                          { # Metadata about a value in a pivot grouping.
                            "collapsed": True or False, # True if the data corresponding to the value is collapsed.
                            "value": { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                # (Note that formulaValue is not valid,
                                #  because the values will be calculated.)
                              "numberValue": 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # "serial number" format.
                              "boolValue": True or False, # Represents a boolean value.
                              "formulaValue": "A String", # Represents a formula.
                              "stringValue": "A String", # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `'123` into the UI, this would be represented as a `stringValue` of
                                  # `"123"`.
                              "errorValue": { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                "message": "A String", # A message with more information about the error
                                    # (in the spreadsheet's locale).
                                "type": "A String", # The type of error.
                              },
                            },
                          },
                        ],
                        "valueBucket": { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                            # If not specified, sorting is alphabetical by this group's values.
                          "buckets": [ # Determines the bucket from which values are chosen to sort.
                              #
                              # For example, in a pivot table with one row group & two column groups,
                              # the row group can list up to two values. The first value corresponds
                              # to a value within the first column group, and the second value
                              # corresponds to a value in the second column group.  If no values
                              # are listed, this would indicate that the row should be sorted according
                              # to the "Grand Total" over the column groups. If a single value is listed,
                              # this would correspond to using the "Total" of that bucket.
                            { # The kinds of value that a cell in a spreadsheet can have.
                              "numberValue": 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # "serial number" format.
                              "boolValue": True or False, # Represents a boolean value.
                              "formulaValue": "A String", # Represents a formula.
                              "stringValue": "A String", # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `'123` into the UI, this would be represented as a `stringValue` of
                                  # `"123"`.
                              "errorValue": { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                "message": "A String", # A message with more information about the error
                                    # (in the spreadsheet's locale).
                                "type": "A String", # The type of error.
                              },
                            },
                          ],
                          "valuesIndex": 42, # The offset in the PivotTable.values list which the values in this
                              # grouping should be sorted by.
                        },
                        "sortOrder": "A String", # The order the values in this group should be sorted.
                        "sourceColumnOffset": 42, # The column offset of the source range that this grouping is based on.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this group refers to column `C`, whereas the offset `1` would refer
                            # to column `D`.
                      },
                    ],
                    "source": { # A range on a sheet. # The range the pivot table is reading data from.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `"Sheet1"` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                      "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                      "sheetId": 42, # The sheet this range is on.
                      "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                      "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                    },
                    "values": [ # A list of values to include in the pivot table.
                      { # The definition of how a value in a pivot table should be calculated.
                        "formula": "A String", # A custom formula to calculate the value.  The formula must start
                            # with an `=` character.
                        "summarizeFunction": "A String", # A function to summarize the value.
                            # If formula is set, the only supported values are
                            # SUM and
                            # CUSTOM.
                            # If sourceColumnOffset is set, then `CUSTOM`
                            # is not supported.
                        "sourceColumnOffset": 42, # The column offset of the source range that this value reads from.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this value refers to column `C`, whereas the offset `1` would
                            # refer to column `D`.
                        "name": "A String", # A name to use for the value. This is only used if formula was set.
                            # Otherwise, the column name is used.
                      },
                    ],
                    "criteria": { # An optional mapping of filters per source column offset.
                        #
                        # The filters will be applied before aggregating data into the pivot table.
                        # The map's key is the column offset of the source range that you want to
                        # filter, and the value is the criteria for that column.
                        #
                        # For example, if the source was `C10:E15`, a key of `0` will have the filter
                        # for column `C`, whereas the key `1` is for column `D`.
                      "a_key": { # Criteria for showing/hiding rows in a pivot table.
                        "visibleValues": [ # Values that should be included.  Values not listed here are excluded.
                          "A String",
                        ],
                      },
                    },
                    "columns": [ # Each column grouping in the pivot table.
                      { # A single grouping (either row or column) in a pivot table.
                        "showTotals": True or False, # True if the pivot table should include the totals for this grouping.
                        "valueMetadata": [ # Metadata about values in the grouping.
                          { # Metadata about a value in a pivot grouping.
                            "collapsed": True or False, # True if the data corresponding to the value is collapsed.
                            "value": { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                # (Note that formulaValue is not valid,
                                #  because the values will be calculated.)
                              "numberValue": 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # "serial number" format.
                              "boolValue": True or False, # Represents a boolean value.
                              "formulaValue": "A String", # Represents a formula.
                              "stringValue": "A String", # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `'123` into the UI, this would be represented as a `stringValue` of
                                  # `"123"`.
                              "errorValue": { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                "message": "A String", # A message with more information about the error
                                    # (in the spreadsheet's locale).
                                "type": "A String", # The type of error.
                              },
                            },
                          },
                        ],
                        "valueBucket": { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                            # If not specified, sorting is alphabetical by this group's values.
                          "buckets": [ # Determines the bucket from which values are chosen to sort.
                              #
                              # For example, in a pivot table with one row group & two column groups,
                              # the row group can list up to two values. The first value corresponds
                              # to a value within the first column group, and the second value
                              # corresponds to a value in the second column group.  If no values
                              # are listed, this would indicate that the row should be sorted according
                              # to the "Grand Total" over the column groups. If a single value is listed,
                              # this would correspond to using the "Total" of that bucket.
                            { # The kinds of value that a cell in a spreadsheet can have.
                              "numberValue": 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # "serial number" format.
                              "boolValue": True or False, # Represents a boolean value.
                              "formulaValue": "A String", # Represents a formula.
                              "stringValue": "A String", # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `'123` into the UI, this would be represented as a `stringValue` of
                                  # `"123"`.
                              "errorValue": { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                "message": "A String", # A message with more information about the error
                                    # (in the spreadsheet's locale).
                                "type": "A String", # The type of error.
                              },
                            },
                          ],
                          "valuesIndex": 42, # The offset in the PivotTable.values list which the values in this
                              # grouping should be sorted by.
                        },
                        "sortOrder": "A String", # The order the values in this group should be sorted.
                        "sourceColumnOffset": 42, # The column offset of the source range that this grouping is based on.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this group refers to column `C`, whereas the offset `1` would refer
                            # to column `D`.
                      },
                    ],
                  },
                  "hyperlink": "A String", # A hyperlink this cell points to, if any.
                      # This field is read-only.  (To set it, use a `=HYPERLINK` formula.)
                  "effectiveValue": { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this will be
                      # the calculated value.  For cells with literals, this will be
                      # the same as the user_entered_value.
                      # This field is read-only.
                    "numberValue": 3.14, # Represents a double value.
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # "serial number" format.
                    "boolValue": True or False, # Represents a boolean value.
                    "formulaValue": "A String", # Represents a formula.
                    "stringValue": "A String", # Represents a string value.
                        # Leading single quotes are not included. For example, if the user typed
                        # `'123` into the UI, this would be represented as a `stringValue` of
                        # `"123"`.
                    "errorValue": { # An error in a cell. # Represents an error.
                        # This field is read-only.
                      "message": "A String", # A message with more information about the error
                          # (in the spreadsheet's locale).
                      "type": "A String", # The type of error.
                    },
                  },
                  "formattedValue": "A String", # The formatted value of the cell.
                      # This is the value as it's shown to the user.
                      # This field is read-only.
                  "userEnteredValue": { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `'Hello'`, or `=NOW()`
                      # Note: Dates, Times and DateTimes are represented as doubles in
                      # serial number format.
                    "numberValue": 3.14, # Represents a double value.
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # "serial number" format.
                    "boolValue": True or False, # Represents a boolean value.
                    "formulaValue": "A String", # Represents a formula.
                    "stringValue": "A String", # Represents a string value.
                        # Leading single quotes are not included. For example, if the user typed
                        # `'123` into the UI, this would be represented as a `stringValue` of
                        # `"123"`.
                    "errorValue": { # An error in a cell. # Represents an error.
                        # This field is read-only.
                      "message": "A String", # A message with more information about the error
                          # (in the spreadsheet's locale).
                      "type": "A String", # The type of error.
                    },
                  },
                  "note": "A String", # Any note on the cell.
                  "effectiveFormat": { # The format of a cell. # The effective format being used by the cell.
                      # This includes the results of applying any conditional formatting and,
                      # if the cell contains a formula, the computed number format.
                      # If the effective format is the default format, effective format will
                      # not be written.
                      # This field is read-only.
                    "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                      "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                          # the user's locale will be used if necessary for the given type.
                          # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                          # information about the supported patterns.
                      "type": "A String", # The type of the number format.
                          # When writing, this field must be set.
                    },
                    "textDirection": "A String", # The direction of the text in the cell.
                    "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                        # When updating padding, every field must be specified.
                      "top": 42, # The top padding of the cell.
                      "right": 42, # The right padding of the cell.
                      "bottom": 42, # The bottom padding of the cell.
                      "left": 42, # The left padding of the cell.
                    },
                    "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                    "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                    "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                        # Absent values indicate that the field isn't specified.
                      "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "bold": True or False, # True if the text is bold.
                      "strikethrough": True or False, # True if the text has a strikethrough.
                      "fontFamily": "A String", # The font family.
                      "fontSize": 42, # The size of the font.
                      "italic": True or False, # True if the text is italicized.
                      "underline": True or False, # True if the text is underlined.
                    },
                    "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                    "borders": { # The borders of the cell. # The borders of the cell.
                      "top": { # A border along a cell. # The top border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "right": { # A border along a cell. # The right border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "bottom": { # A border along a cell. # The bottom border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "left": { # A border along a cell. # The left border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                    },
                    "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
                  },
                  "userEnteredFormat": { # The format of a cell. # The format the user entered for the cell.
                      #
                      # When writing, the new format will be merged with the existing format.
                    "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                      "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                          # the user's locale will be used if necessary for the given type.
                          # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                          # information about the supported patterns.
                      "type": "A String", # The type of the number format.
                          # When writing, this field must be set.
                    },
                    "textDirection": "A String", # The direction of the text in the cell.
                    "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                        # When updating padding, every field must be specified.
                      "top": 42, # The top padding of the cell.
                      "right": 42, # The right padding of the cell.
                      "bottom": 42, # The bottom padding of the cell.
                      "left": 42, # The left padding of the cell.
                    },
                    "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                    "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                    "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                        # Absent values indicate that the field isn't specified.
                      "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "bold": True or False, # True if the text is bold.
                      "strikethrough": True or False, # True if the text has a strikethrough.
                      "fontFamily": "A String", # The font family.
                      "fontSize": 42, # The size of the font.
                      "italic": True or False, # True if the text is italicized.
                      "underline": True or False, # True if the text is underlined.
                    },
                    "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                    "borders": { # The borders of the cell. # The borders of the cell.
                      "top": { # A border along a cell. # The top border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "right": { # A border along a cell. # The right border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "bottom": { # A border along a cell. # The bottom border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                      "left": { # A border along a cell. # The left border of the cell.
                        "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "width": 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the "style" field.
                        "style": "A String", # The style of the border.
                      },
                    },
                    "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
                  },
                  "dataValidation": { # A data validation rule. # A data validation rule on the cell, if any.
                      #
                      # When writing, the new data validation rule will overwrite any prior rule.
                    "showCustomUi": True or False, # True if the UI should be customized based on the kind of condition.
                        # If true, "List" conditions will show a dropdown.
                    "strict": True or False, # True if invalid data should be rejected.
                    "inputMessage": "A String", # A message to show the user when adding data to the cell.
                    "condition": { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                        # BooleanConditions are used by conditional formatting,
                        # data validation, and the criteria in filters.
                      "type": "A String", # The type of condition.
                      "values": [ # The values of the condition. The number of supported values depends
                          # on the condition type.  Some support zero values,
                          # others one or two values,
                          # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                        { # The value of the condition.
                          "relativeDate": "A String", # A relative date (based on the current date).
                              # Valid only if the type is
                              # DATE_BEFORE,
                              # DATE_AFTER,
                              # DATE_ON_OR_BEFORE or
                              # DATE_ON_OR_AFTER.
                              #
                              # Relative dates are not supported in data validation.
                              # They are supported only in conditional formatting and
                              # conditional filters.
                          "userEnteredValue": "A String", # A value the condition is based on.
                              # The value will be parsed as if the user typed into a cell.
                              # Formulas are supported (and must begin with an `=`).
                        },
                      ],
                    },
                  },
                  "textFormatRuns": [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                      # on user entered strings, not formulas, bools, or numbers.
                      # Runs start at specific indexes in the text and continue until the next
                      # run. Properties of a run will continue unless explicitly changed
                      # in a subsequent run (and properties of the first run will continue
                      # the properties of the cell unless explicitly changed).
                      #
                      # When writing, the new runs will overwrite any prior runs.  When writing a
                      # new user_entered_value, previous runs will be erased.
                    { # A run of a text format. The format of this run continues until the start
                        # index of the next run.
                        # When updating, all fields must be set.
                      "startIndex": 42, # The character index where this run starts.
                      "format": { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell's format.
                          # Absent values indicate that the field isn't specified.
                        "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "bold": True or False, # True if the text is bold.
                        "strikethrough": True or False, # True if the text has a strikethrough.
                        "fontFamily": "A String", # The font family.
                        "fontSize": 42, # The size of the font.
                        "italic": True or False, # True if the text is italicized.
                        "underline": True or False, # True if the text is underlined.
                      },
                    },
                  ],
                },
              ],
            },
          ],
        },
      ],
      "properties": { # Properties of a sheet. # The properties of the sheet.
        "sheetType": "A String", # The type of sheet. Defaults to GRID.
            # This field cannot be changed once set.
        "index": 42, # The index of the sheet within the spreadsheet.
            # When adding or updating sheet properties, if this field
            # is excluded then the sheet will be added or moved to the end
            # of the sheet list. When updating sheet indices or inserting
            # sheets, movement is considered in "before the move" indexes.
            # For example, if there were 3 sheets (S1, S2, S3) in order to
            # move S1 ahead of S2 the index would have to be set to 2. A sheet
            # index update request will be ignored if the requested index is
            # identical to the sheets current index or if the requested new
            # index is equal to the current sheet index + 1.
        "title": "A String", # The name of the sheet.
        "gridProperties": { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
            # (If the sheet is an object sheet, containing a chart or image, then
            # this field will be absent.)
            # When writing it is an error to set any grid properties on non-grid sheets.
          "columnCount": 42, # The number of columns in the grid.
          "rowCount": 42, # The number of rows in the grid.
          "frozenColumnCount": 42, # The number of columns that are frozen in the grid.
          "hideGridlines": True or False, # True if the grid isn't showing gridlines in the UI.
          "frozenRowCount": 42, # The number of rows that are frozen in the grid.
        },
        "rightToLeft": True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
        "tabColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
            # for simplicity of conversion to/from color representations in various
            # languages over compactness; for example, the fields of this representation
            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
            # method in iOS; and, with just a little work, it can be easily formatted into
            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
            #
            # Example (Java):
            #
            #      import com.google.type.Color;
            #
            #      // ...
            #      public static java.awt.Color fromProto(Color protocolor) {
            #        float alpha = protocolor.hasAlpha()
            #            ? protocolor.getAlpha().getValue()
            #            : 1.0;
            #
            #        return new java.awt.Color(
            #            protocolor.getRed(),
            #            protocolor.getGreen(),
            #            protocolor.getBlue(),
            #            alpha);
            #      }
            #
            #      public static Color toProto(java.awt.Color color) {
            #        float red = (float) color.getRed();
            #        float green = (float) color.getGreen();
            #        float blue = (float) color.getBlue();
            #        float denominator = 255.0;
            #        Color.Builder resultBuilder =
            #            Color
            #                .newBuilder()
            #                .setRed(red / denominator)
            #                .setGreen(green / denominator)
            #                .setBlue(blue / denominator);
            #        int alpha = color.getAlpha();
            #        if (alpha != 255) {
            #          result.setAlpha(
            #              FloatValue
            #                  .newBuilder()
            #                  .setValue(((float) alpha) / denominator)
            #                  .build());
            #        }
            #        return resultBuilder.build();
            #      }
            #      // ...
            #
            # Example (iOS / Obj-C):
            #
            #      // ...
            #      static UIColor* fromProto(Color* protocolor) {
            #         float red = [protocolor red];
            #         float green = [protocolor green];
            #         float blue = [protocolor blue];
            #         FloatValue* alpha_wrapper = [protocolor alpha];
            #         float alpha = 1.0;
            #         if (alpha_wrapper != nil) {
            #           alpha = [alpha_wrapper value];
            #         }
            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
            #      }
            #
            #      static Color* toProto(UIColor* color) {
            #          CGFloat red, green, blue, alpha;
            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
            #            return nil;
            #          }
            #          Color* result = [Color alloc] init];
            #          [result setRed:red];
            #          [result setGreen:green];
            #          [result setBlue:blue];
            #          if (alpha <= 0.9999) {
            #            [result setAlpha:floatWrapperWithValue(alpha)];
            #          }
            #          [result autorelease];
            #          return result;
            #     }
            #     // ...
            #
            #  Example (JavaScript):
            #
            #     // ...
            #
            #     var protoToCssColor = function(rgb_color) {
            #        var redFrac = rgb_color.red || 0.0;
            #        var greenFrac = rgb_color.green || 0.0;
            #        var blueFrac = rgb_color.blue || 0.0;
            #        var red = Math.floor(redFrac * 255);
            #        var green = Math.floor(greenFrac * 255);
            #        var blue = Math.floor(blueFrac * 255);
            #
            #        if (!('alpha' in rgb_color)) {
            #           return rgbToCssColor_(red, green, blue);
            #        }
            #
            #        var alphaFrac = rgb_color.alpha.value || 0.0;
            #        var rgbParams = [red, green, blue].join(',');
            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
            #     };
            #
            #     var rgbToCssColor_ = function(red, green, blue) {
            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
            #       var hexString = rgbNumber.toString(16);
            #       var missingZeros = 6 - hexString.length;
            #       var resultBuilder = ['#'];
            #       for (var i = 0; i < missingZeros; i++) {
            #          resultBuilder.push('0');
            #       }
            #       resultBuilder.push(hexString);
            #       return resultBuilder.join('');
            #     };
            #
            #     // ...
          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
              # the final pixel color is defined by the equation:
              #
              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
              #
              # This means that a value of 1.0 corresponds to a solid color, whereas
              # a value of 0.0 corresponds to a completely transparent color. This
              # uses a wrapper message rather than a simple float scalar so that it is
              # possible to distinguish between a default value and the value being unset.
              # If omitted, this color object is to be rendered as a solid color
              # (as if the alpha value had been explicitly given with a value of 1.0).
          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
        },
        "hidden": True or False, # True if the sheet is hidden in the UI, false if it's visible.
        "sheetId": 42, # The ID of the sheet. Must be non-negative.
            # This field cannot be changed once set.
      },
    },
  ],
  "spreadsheetUrl": "A String", # The url of the spreadsheet.
      # This field is read-only.
}

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Resource that represents a spreadsheet.
    "spreadsheetId": "A String", # The ID of the spreadsheet.
        # This field is read-only.
    "namedRanges": [ # The named ranges defined in a spreadsheet.
      { # A named range.
        "namedRangeId": "A String", # The ID of the named range.
        "range": { # A range on a sheet. # The range this represents.
            # All indexes are zero-based.
            # Indexes are half open, e.g the start index is inclusive
            # and the end index is exclusive -- [start_index, end_index).
            # Missing indexes indicate the range is unbounded on that side.
            #
            # For example, if `"Sheet1"` is sheet ID 0, then:
            #
            #   `Sheet1!A1:A1 == sheet_id: 0,
            #                   start_row_index: 0, end_row_index: 1,
            #                   start_column_index: 0, end_column_index: 1`
            #
            #   `Sheet1!A3:B4 == sheet_id: 0,
            #                   start_row_index: 2, end_row_index: 4,
            #                   start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A:B == sheet_id: 0,
            #                 start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A5:B == sheet_id: 0,
            #                  start_row_index: 4,
            #                  start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1 == sheet_id:0`
            #
            # The start index must always be less than or equal to the end index.
            # If the start index equals the end index, then the range is empty.
            # Empty ranges are typically not meaningful and are usually rendered in the
            # UI as `#REF!`.
          "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
          "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
          "sheetId": 42, # The sheet this range is on.
          "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
          "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
        },
        "name": "A String", # The name of the named range.
      },
    ],
    "properties": { # Properties of a spreadsheet. # Overall properties of a spreadsheet.
      "locale": "A String", # The locale of the spreadsheet in one of the following formats:
          #
          # * an ISO 639-1 language code such as `en`
          #
          # * an ISO 639-2 language code such as `fil`, if no 639-1 code exists
          #
          # * a combination of the ISO language code and country code, such as `en_US`
          #
          # Note: when updating this field, not all locales/languages are supported.
      "timeZone": "A String", # The time zone of the spreadsheet, in CLDR format such as
          # `America/New_York`. If the time zone isn't recognized, this may
          # be a custom time zone such as `GMT-07:00`.
      "autoRecalc": "A String", # The amount of time to wait before volatile functions are recalculated.
      "defaultFormat": { # The format of a cell. # The default format of all cells in the spreadsheet.
          # CellData.effectiveFormat will not be set if the
          # cell's format is equal to this default format.
          # This field is read-only.
        "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
          "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
              # the user's locale will be used if necessary for the given type.
              # See the [Date and Number Formats guide](/sheets/guides/formats) for more
              # information about the supported patterns.
          "type": "A String", # The type of the number format.
              # When writing, this field must be set.
        },
        "textDirection": "A String", # The direction of the text in the cell.
        "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
            # When updating padding, every field must be specified.
          "top": 42, # The top padding of the cell.
          "right": 42, # The right padding of the cell.
          "bottom": 42, # The bottom padding of the cell.
          "left": 42, # The left padding of the cell.
        },
        "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
        "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
            # for simplicity of conversion to/from color representations in various
            # languages over compactness; for example, the fields of this representation
            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
            # method in iOS; and, with just a little work, it can be easily formatted into
            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
            #
            # Example (Java):
            #
            #      import com.google.type.Color;
            #
            #      // ...
            #      public static java.awt.Color fromProto(Color protocolor) {
            #        float alpha = protocolor.hasAlpha()
            #            ? protocolor.getAlpha().getValue()
            #            : 1.0;
            #
            #        return new java.awt.Color(
            #            protocolor.getRed(),
            #            protocolor.getGreen(),
            #            protocolor.getBlue(),
            #            alpha);
            #      }
            #
            #      public static Color toProto(java.awt.Color color) {
            #        float red = (float) color.getRed();
            #        float green = (float) color.getGreen();
            #        float blue = (float) color.getBlue();
            #        float denominator = 255.0;
            #        Color.Builder resultBuilder =
            #            Color
            #                .newBuilder()
            #                .setRed(red / denominator)
            #                .setGreen(green / denominator)
            #                .setBlue(blue / denominator);
            #        int alpha = color.getAlpha();
            #        if (alpha != 255) {
            #          result.setAlpha(
            #              FloatValue
            #                  .newBuilder()
            #                  .setValue(((float) alpha) / denominator)
            #                  .build());
            #        }
            #        return resultBuilder.build();
            #      }
            #      // ...
            #
            # Example (iOS / Obj-C):
            #
            #      // ...
            #      static UIColor* fromProto(Color* protocolor) {
            #         float red = [protocolor red];
            #         float green = [protocolor green];
            #         float blue = [protocolor blue];
            #         FloatValue* alpha_wrapper = [protocolor alpha];
            #         float alpha = 1.0;
            #         if (alpha_wrapper != nil) {
            #           alpha = [alpha_wrapper value];
            #         }
            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
            #      }
            #
            #      static Color* toProto(UIColor* color) {
            #          CGFloat red, green, blue, alpha;
            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
            #            return nil;
            #          }
            #          Color* result = [Color alloc] init];
            #          [result setRed:red];
            #          [result setGreen:green];
            #          [result setBlue:blue];
            #          if (alpha <= 0.9999) {
            #            [result setAlpha:floatWrapperWithValue(alpha)];
            #          }
            #          [result autorelease];
            #          return result;
            #     }
            #     // ...
            #
            #  Example (JavaScript):
            #
            #     // ...
            #
            #     var protoToCssColor = function(rgb_color) {
            #        var redFrac = rgb_color.red || 0.0;
            #        var greenFrac = rgb_color.green || 0.0;
            #        var blueFrac = rgb_color.blue || 0.0;
            #        var red = Math.floor(redFrac * 255);
            #        var green = Math.floor(greenFrac * 255);
            #        var blue = Math.floor(blueFrac * 255);
            #
            #        if (!('alpha' in rgb_color)) {
            #           return rgbToCssColor_(red, green, blue);
            #        }
            #
            #        var alphaFrac = rgb_color.alpha.value || 0.0;
            #        var rgbParams = [red, green, blue].join(',');
            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
            #     };
            #
            #     var rgbToCssColor_ = function(red, green, blue) {
            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
            #       var hexString = rgbNumber.toString(16);
            #       var missingZeros = 6 - hexString.length;
            #       var resultBuilder = ['#'];
            #       for (var i = 0; i < missingZeros; i++) {
            #          resultBuilder.push('0');
            #       }
            #       resultBuilder.push(hexString);
            #       return resultBuilder.join('');
            #     };
            #
            #     // ...
          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
              # the final pixel color is defined by the equation:
              #
              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
              #
              # This means that a value of 1.0 corresponds to a solid color, whereas
              # a value of 0.0 corresponds to a completely transparent color. This
              # uses a wrapper message rather than a simple float scalar so that it is
              # possible to distinguish between a default value and the value being unset.
              # If omitted, this color object is to be rendered as a solid color
              # (as if the alpha value had been explicitly given with a value of 1.0).
          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
        },
        "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
        "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
            # Absent values indicate that the field isn't specified.
          "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
              #            return nil;
              #          }
              #          Color* result = [Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha <= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!('alpha' in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(',');
              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = ['#'];
              #       for (var i = 0; i < missingZeros; i++) {
              #          resultBuilder.push('0');
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join('');
              #     };
              #
              #     // ...
            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
          },
          "bold": True or False, # True if the text is bold.
          "strikethrough": True or False, # True if the text has a strikethrough.
          "fontFamily": "A String", # The font family.
          "fontSize": 42, # The size of the font.
          "italic": True or False, # True if the text is italicized.
          "underline": True or False, # True if the text is underlined.
        },
        "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
        "borders": { # The borders of the cell. # The borders of the cell.
          "top": { # A border along a cell. # The top border of the cell.
            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "width": 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the "style" field.
            "style": "A String", # The style of the border.
          },
          "right": { # A border along a cell. # The right border of the cell.
            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "width": 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the "style" field.
            "style": "A String", # The style of the border.
          },
          "bottom": { # A border along a cell. # The bottom border of the cell.
            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "width": 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the "style" field.
            "style": "A String", # The style of the border.
          },
          "left": { # A border along a cell. # The left border of the cell.
            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "width": 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the "style" field.
            "style": "A String", # The style of the border.
          },
        },
        "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
      },
      "title": "A String", # The title of the spreadsheet.
    },
    "sheets": [ # The sheets that are part of a spreadsheet.
      { # A sheet in a spreadsheet.
        "conditionalFormats": [ # The conditional format rules in this sheet.
          { # A rule describing a conditional format.
            "ranges": [ # The ranges that will be formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
            ],
            "booleanRule": { # A rule that may or may not match, depending on the condition. # The formatting is either "on" or "off" according to the rule.
              "condition": { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format will be applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                "type": "A String", # The type of condition.
                "values": [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    "relativeDate": "A String", # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    "userEnteredValue": "A String", # A value the condition is based on.
                        # The value will be parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=`).
                  },
                ],
              },
              "format": { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &
                  # background color.
                "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                  "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user's locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                      # information about the supported patterns.
                  "type": "A String", # The type of the number format.
                      # When writing, this field must be set.
                },
                "textDirection": "A String", # The direction of the text in the cell.
                "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  "top": 42, # The top padding of the cell.
                  "right": 42, # The right padding of the cell.
                  "bottom": 42, # The bottom padding of the cell.
                  "left": 42, # The left padding of the cell.
                },
                "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn't specified.
                  "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "bold": True or False, # True if the text is bold.
                  "strikethrough": True or False, # True if the text has a strikethrough.
                  "fontFamily": "A String", # The font family.
                  "fontSize": 42, # The size of the font.
                  "italic": True or False, # True if the text is italicized.
                  "underline": True or False, # True if the text is underlined.
                },
                "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                "borders": { # The borders of the cell. # The borders of the cell.
                  "top": { # A border along a cell. # The top border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "right": { # A border along a cell. # The right border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "bottom": { # A border along a cell. # The bottom border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "left": { # A border along a cell. # The left border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                },
                "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
              },
            },
            "gradientRule": { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              "maxpoint": { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
              "midpoint": { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
              "minpoint": { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
            },
          },
        ],
        "bandedRanges": [ # The banded (i.e. alternating colors) ranges on this sheet.
          { # A banded (alternating colors) range in a sheet.
            "range": { # A range on a sheet. # The range over which these properties are applied.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "columnProperties": { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties will be applied on a column-
                # by-column basis throughout all the columns in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              "secondBandColor": { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "headerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first
                  # row or column will be filled with this color and the colors will
                  # alternate between first_band_color and second_band_color starting
                  # from the second row or column. Otherwise, the first row or column will be
                  # filled with first_band_color and the colors will proceed to alternate
                  # as they normally would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "footerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column will be filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "firstBandColor": { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
            },
            "rowProperties": { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties will be applied on a row-by-row
                # basis throughout all the rows in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              "secondBandColor": { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "headerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first
                  # row or column will be filled with this color and the colors will
                  # alternate between first_band_color and second_band_color starting
                  # from the second row or column. Otherwise, the first row or column will be
                  # filled with first_band_color and the colors will proceed to alternate
                  # as they normally would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "footerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column will be filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "firstBandColor": { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
            },
            "bandedRangeId": 42, # The id of the banded range.
          },
        ],
        "merges": [ # The ranges that are merged together.
          { # A range on a sheet.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
        ],
        "basicFilter": { # The default filter associated with a sheet. # The filter on this sheet, if any.
          "range": { # A range on a sheet. # The range the filter covers.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "sortSpecs": [ # The sort order per column. Later specifications are used when values
              # are equal in the earlier specifications.
            { # A sort order associated with a specific column or row.
              "sortOrder": "A String", # The order data should be sorted.
              "dimensionIndex": 42, # The dimension the sort should be applied to.
            },
          ],
          "criteria": { # The criteria for showing/hiding values per column.
              # The map's key is the column index, and the value is the criteria for
              # that column.
            "a_key": { # Criteria for showing/hiding rows in a filter or filter view.
              "hiddenValues": [ # Values that should be hidden.
                "A String",
              ],
              "condition": { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                  # (This does not override hiddenValues -- if a value is listed there,
                  #  it will still be hidden.)
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                "type": "A String", # The type of condition.
                "values": [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    "relativeDate": "A String", # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    "userEnteredValue": "A String", # A value the condition is based on.
                        # The value will be parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=`).
                  },
                ],
              },
            },
          },
        },
        "charts": [ # The specifications of every chart on this sheet.
          { # A chart embedded in a sheet.
            "chartId": 42, # The ID of the chart.
            "position": { # The position of an embedded object such as a chart. # The position of the chart.
              "newSheet": True or False, # If true, the embedded object will be put on a new sheet whose ID
                  # is chosen for you. Used only when writing.
              "sheetId": 42, # The sheet this is on. Set only if the embedded object
                  # is on its own sheet. Must be non-negative.
              "overlayPosition": { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                "anchorCell": { # A coordinate in a sheet. # The cell the object is anchored to.
                    # All indexes are zero-based.
                  "rowIndex": 42, # The row index of the coordinate.
                  "columnIndex": 42, # The column index of the coordinate.
                  "sheetId": 42, # The sheet this coordinate is on.
                },
                "offsetYPixels": 42, # The vertical offset, in pixels, that the object is offset
                    # from the anchor cell.
                "widthPixels": 42, # The width of the object, in pixels. Defaults to 600.
                "offsetXPixels": 42, # The horizontal offset, in pixels, that the object is offset
                    # from the anchor cell.
                "heightPixels": 42, # The height of the object, in pixels. Defaults to 371.
              },
            },
            "spec": { # The specifications of a chart. # The specification of the chart.
              "hiddenDimensionStrategy": "A String", # Determines how the charts will use hidden rows or columns.
              "pieChart": { # A <a href="/chart/interactive/docs/gallery/piechart">pie chart</a>. # A pie chart specification.
                "series": { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                  "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                    "sources": [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) & all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be contiguous across the domain and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `"Sheet1"` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                        "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                        "sheetId": 42, # The sheet this range is on.
                        "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                        "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                "domain": { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                  "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                    "sources": [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) & all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be contiguous across the domain and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `"Sheet1"` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                        "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                        "sheetId": 42, # The sheet this range is on.
                        "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                        "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                "threeDimensional": True or False, # True if the pie is three dimensional.
                "legendPosition": "A String", # Where the legend of the pie chart should be drawn.
                "pieHole": 3.14, # The size of the hole in the pie chart.
              },
              "basicChart": { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                  # See BasicChartType for the list of all
                  # charts this supports.
                  # of charts this supports.
                "headerCount": 42, # The number of rows or columns in the data that are "headers".
                    # If not set, Google Sheets will guess how many rows are headers based
                    # on the data.
                    #
                    # (Note that BasicChartAxis.title may override the axis title
                    #  inferred from the header values.)
                "series": [ # The data this chart is visualizing.
                  { # A single series of data in a chart.
                      # For example, if charting stock prices over time, multiple series may exist,
                      # one for the "Open Price", "High Price", "Low Price" and "Close Price".
                    "series": { # The data included in a domain or series. # The data being visualized in this chart series.
                      "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                        "sources": [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) & all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be contiguous across the domain and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `"Sheet1"` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                            "sheetId": 42, # The sheet this range is on.
                            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    "targetAxis": "A String", # The minor axis that will specify the range of values for this series.
                        # For example, if charting stocks over time, the "Volume" series
                        # may want to be pinned to the right with the prices pinned to the left,
                        # because the scale of trading volume is different than the scale of
                        # prices.
                        # It is an error to specify an axis that isn't a valid minor axis
                        # for the chart's type.
                    "type": "A String", # The type of this series. Valid only if the
                        # chartType is
                        # COMBO.
                        # Different types will change the way the series is visualized.
                        # Only LINE, AREA,
                        # and COLUMN are supported.
                  },
                ],
                "legendPosition": "A String", # The position of the chart legend.
                "domains": [ # The domain of data this is charting.
                    # Only a single domain is currently supported.
                  { # The domain of a chart.
                      # For example, if charting stock prices over time, this would be the date.
                    "domain": { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                        # this is the data representing the dates.
                      "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                        "sources": [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) & all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be contiguous across the domain and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `"Sheet1"` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                            "sheetId": 42, # The sheet this range is on.
                            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                  },
                ],
                "chartType": "A String", # The type of the chart.
                "axis": [ # The axis on the chart.
                  { # An axis of the chart.
                      # A chart may not have more than one axis per
                      # axis position.
                    "position": "A String", # The position of this axis.
                    "format": { # The format of a run of text in a cell. # The format of the title.
                        # Only valid if the axis is not associated with the domain.
                        # Absent values indicate that the field isn't specified.
                      "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "bold": True or False, # True if the text is bold.
                      "strikethrough": True or False, # True if the text has a strikethrough.
                      "fontFamily": "A String", # The font family.
                      "fontSize": 42, # The size of the font.
                      "italic": True or False, # True if the text is italicized.
                      "underline": True or False, # True if the text is underlined.
                    },
                    "title": "A String", # The title of this axis. If set, this overrides any title inferred
                        # from headers of the data.
                  },
                ],
              },
              "title": "A String", # The title of the chart.
            },
          },
        ],
        "filterViews": [ # The filter views in this sheet.
          { # A filter view.
            "title": "A String", # The name of the filter view.
            "namedRangeId": "A String", # The named range this filter view is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            "filterViewId": 42, # The ID of the filter view.
            "range": { # A range on a sheet. # The range this filter view covers.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "sortSpecs": [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                "sortOrder": "A String", # The order data should be sorted.
                "dimensionIndex": 42, # The dimension the sort should be applied to.
              },
            ],
            "criteria": { # The criteria for showing/hiding values per column.
                # The map's key is the column index, and the value is the criteria for
                # that column.
              "a_key": { # Criteria for showing/hiding rows in a filter or filter view.
                "hiddenValues": [ # Values that should be hidden.
                  "A String",
                ],
                "condition": { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hiddenValues -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  "type": "A String", # The type of condition.
                  "values": [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      "relativeDate": "A String", # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      "userEnteredValue": "A String", # A value the condition is based on.
                          # The value will be parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=`).
                    },
                  ],
                },
              },
            },
          },
        ],
        "protectedRanges": [ # The protected ranges in this sheet.
          { # A protected range.
            "unprotectedRanges": [ # The list of unprotected ranges within a protected sheet.
                # Unprotected ranges are only supported on protected sheets.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
            ],
            "requestingUserCanEdit": True or False, # True if the user who requested this protected range can edit the
                # protected area.
                # This field is read-only.
            "description": "A String", # The description of this protected range.
            "namedRangeId": "A String", # The named range this protected range is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            "editors": { # The editors of a protected range. # The users and groups with edit access to the protected range.
                # This field is only visible to users with edit access to the protected
                # range and the document.
                # Editors are not supported with warning_only protection.
              "domainUsersCanEdit": True or False, # True if anyone in the document's domain has edit access to the protected
                  # range.  Domain protection is only supported on documents within a domain.
              "users": [ # The email addresses of users with edit access to the protected range.
                "A String",
              ],
              "groups": [ # The email addresses of groups with edit access to the protected range.
                "A String",
              ],
            },
            "protectedRangeId": 42, # The ID of the protected range.
                # This field is read-only.
            "warningOnly": True or False, # True if this protected range will show a warning when editing.
                # Warning-based protection means that every user can edit data in the
                # protected range, except editing will prompt a warning asking the user
                # to confirm the edit.
                #
                # When writing: if this field is true, then editors is ignored.
                # Additionally, if this field is changed from true to false and the
                # `editors` field is not set (nor included in the field mask), then
                # the editors will be set to all the editors in the document.
            "range": { # A range on a sheet. # The range that is being protected.
                # The range may be fully unbounded, in which case this is considered
                # a protected sheet.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
          },
        ],
        "data": [ # Data in the grid, if this is a grid sheet.
            # The number of GridData objects returned is dependent on the number of
            # ranges requested on this sheet. For example, if this is representing
            # `Sheet1`, and the spreadsheet was requested with ranges
            # `Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a
            # startRow/startColumn of `0`,
            # while the second one will have `startRow 14` (zero-based row 15),
            # and `startColumn 3` (zero-based column D).
          { # Data in the grid, as well as metadata about the dimensions.
            "startRow": 42, # The first row this GridData refers to, zero-based.
            "rowMetadata": [ # Metadata about the requested rows in the grid, starting with the row
                # in start_row.
              { # Properties about a dimension.
                "pixelSize": 42, # The height (if a row) or width (if a column) of the dimension in pixels.
                "hiddenByUser": True or False, # True if this dimension is explicitly hidden.
                "hiddenByFilter": True or False, # True if this dimension is being filtered.
                    # This field is read-only.
              },
            ],
            "startColumn": 42, # The first column this GridData refers to, zero-based.
            "columnMetadata": [ # Metadata about the requested columns in the grid, starting with the column
                # in start_column.
              { # Properties about a dimension.
                "pixelSize": 42, # The height (if a row) or width (if a column) of the dimension in pixels.
                "hiddenByUser": True or False, # True if this dimension is explicitly hidden.
                "hiddenByFilter": True or False, # True if this dimension is being filtered.
                    # This field is read-only.
              },
            ],
            "rowData": [ # The data in the grid, one entry per row,
                # starting with the row in startRow.
                # The values in RowData will correspond to columns starting
                # at start_column.
              { # Data about each cell in a row.
                "values": [ # The values in the row, one per column.
                  { # Data about a specific cell.
                    "pivotTable": { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                        # is computed dynamically based on its data, grouping, filters, values,
                        # etc. Only the top-left cell of the pivot table contains the pivot table
                        # definition. The other cells will contain the calculated values of the
                        # results of the pivot in their effective_value fields.
                      "valueLayout": "A String", # Whether values should be listed horizontally (as columns)
                          # or vertically (as rows).
                      "rows": [ # Each row grouping in the pivot table.
                        { # A single grouping (either row or column) in a pivot table.
                          "showTotals": True or False, # True if the pivot table should include the totals for this grouping.
                          "valueMetadata": [ # Metadata about values in the grouping.
                            { # Metadata about a value in a pivot grouping.
                              "collapsed": True or False, # True if the data corresponding to the value is collapsed.
                              "value": { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                  # (Note that formulaValue is not valid,
                                  #  because the values will be calculated.)
                                "numberValue": 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # "serial number" format.
                                "boolValue": True or False, # Represents a boolean value.
                                "formulaValue": "A String", # Represents a formula.
                                "stringValue": "A String", # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `'123` into the UI, this would be represented as a `stringValue` of
                                    # `"123"`.
                                "errorValue": { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  "message": "A String", # A message with more information about the error
                                      # (in the spreadsheet's locale).
                                  "type": "A String", # The type of error.
                                },
                              },
                            },
                          ],
                          "valueBucket": { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                              # If not specified, sorting is alphabetical by this group's values.
                            "buckets": [ # Determines the bucket from which values are chosen to sort.
                                #
                                # For example, in a pivot table with one row group & two column groups,
                                # the row group can list up to two values. The first value corresponds
                                # to a value within the first column group, and the second value
                                # corresponds to a value in the second column group.  If no values
                                # are listed, this would indicate that the row should be sorted according
                                # to the "Grand Total" over the column groups. If a single value is listed,
                                # this would correspond to using the "Total" of that bucket.
                              { # The kinds of value that a cell in a spreadsheet can have.
                                "numberValue": 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # "serial number" format.
                                "boolValue": True or False, # Represents a boolean value.
                                "formulaValue": "A String", # Represents a formula.
                                "stringValue": "A String", # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `'123` into the UI, this would be represented as a `stringValue` of
                                    # `"123"`.
                                "errorValue": { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  "message": "A String", # A message with more information about the error
                                      # (in the spreadsheet's locale).
                                  "type": "A String", # The type of error.
                                },
                              },
                            ],
                            "valuesIndex": 42, # The offset in the PivotTable.values list which the values in this
                                # grouping should be sorted by.
                          },
                          "sortOrder": "A String", # The order the values in this group should be sorted.
                          "sourceColumnOffset": 42, # The column offset of the source range that this grouping is based on.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this group refers to column `C`, whereas the offset `1` would refer
                              # to column `D`.
                        },
                      ],
                      "source": { # A range on a sheet. # The range the pivot table is reading data from.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `"Sheet1"` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                        "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                        "sheetId": 42, # The sheet this range is on.
                        "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                        "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                      },
                      "values": [ # A list of values to include in the pivot table.
                        { # The definition of how a value in a pivot table should be calculated.
                          "formula": "A String", # A custom formula to calculate the value.  The formula must start
                              # with an `=` character.
                          "summarizeFunction": "A String", # A function to summarize the value.
                              # If formula is set, the only supported values are
                              # SUM and
                              # CUSTOM.
                              # If sourceColumnOffset is set, then `CUSTOM`
                              # is not supported.
                          "sourceColumnOffset": 42, # The column offset of the source range that this value reads from.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this value refers to column `C`, whereas the offset `1` would
                              # refer to column `D`.
                          "name": "A String", # A name to use for the value. This is only used if formula was set.
                              # Otherwise, the column name is used.
                        },
                      ],
                      "criteria": { # An optional mapping of filters per source column offset.
                          #
                          # The filters will be applied before aggregating data into the pivot table.
                          # The map's key is the column offset of the source range that you want to
                          # filter, and the value is the criteria for that column.
                          #
                          # For example, if the source was `C10:E15`, a key of `0` will have the filter
                          # for column `C`, whereas the key `1` is for column `D`.
                        "a_key": { # Criteria for showing/hiding rows in a pivot table.
                          "visibleValues": [ # Values that should be included.  Values not listed here are excluded.
                            "A String",
                          ],
                        },
                      },
                      "columns": [ # Each column grouping in the pivot table.
                        { # A single grouping (either row or column) in a pivot table.
                          "showTotals": True or False, # True if the pivot table should include the totals for this grouping.
                          "valueMetadata": [ # Metadata about values in the grouping.
                            { # Metadata about a value in a pivot grouping.
                              "collapsed": True or False, # True if the data corresponding to the value is collapsed.
                              "value": { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                  # (Note that formulaValue is not valid,
                                  #  because the values will be calculated.)
                                "numberValue": 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # "serial number" format.
                                "boolValue": True or False, # Represents a boolean value.
                                "formulaValue": "A String", # Represents a formula.
                                "stringValue": "A String", # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `'123` into the UI, this would be represented as a `stringValue` of
                                    # `"123"`.
                                "errorValue": { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  "message": "A String", # A message with more information about the error
                                      # (in the spreadsheet's locale).
                                  "type": "A String", # The type of error.
                                },
                              },
                            },
                          ],
                          "valueBucket": { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                              # If not specified, sorting is alphabetical by this group's values.
                            "buckets": [ # Determines the bucket from which values are chosen to sort.
                                #
                                # For example, in a pivot table with one row group & two column groups,
                                # the row group can list up to two values. The first value corresponds
                                # to a value within the first column group, and the second value
                                # corresponds to a value in the second column group.  If no values
                                # are listed, this would indicate that the row should be sorted according
                                # to the "Grand Total" over the column groups. If a single value is listed,
                                # this would correspond to using the "Total" of that bucket.
                              { # The kinds of value that a cell in a spreadsheet can have.
                                "numberValue": 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # "serial number" format.
                                "boolValue": True or False, # Represents a boolean value.
                                "formulaValue": "A String", # Represents a formula.
                                "stringValue": "A String", # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `'123` into the UI, this would be represented as a `stringValue` of
                                    # `"123"`.
                                "errorValue": { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  "message": "A String", # A message with more information about the error
                                      # (in the spreadsheet's locale).
                                  "type": "A String", # The type of error.
                                },
                              },
                            ],
                            "valuesIndex": 42, # The offset in the PivotTable.values list which the values in this
                                # grouping should be sorted by.
                          },
                          "sortOrder": "A String", # The order the values in this group should be sorted.
                          "sourceColumnOffset": 42, # The column offset of the source range that this grouping is based on.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this group refers to column `C`, whereas the offset `1` would refer
                              # to column `D`.
                        },
                      ],
                    },
                    "hyperlink": "A String", # A hyperlink this cell points to, if any.
                        # This field is read-only.  (To set it, use a `=HYPERLINK` formula.)
                    "effectiveValue": { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this will be
                        # the calculated value.  For cells with literals, this will be
                        # the same as the user_entered_value.
                        # This field is read-only.
                      "numberValue": 3.14, # Represents a double value.
                          # Note: Dates, Times and DateTimes are represented as doubles in
                          # "serial number" format.
                      "boolValue": True or False, # Represents a boolean value.
                      "formulaValue": "A String", # Represents a formula.
                      "stringValue": "A String", # Represents a string value.
                          # Leading single quotes are not included. For example, if the user typed
                          # `'123` into the UI, this would be represented as a `stringValue` of
                          # `"123"`.
                      "errorValue": { # An error in a cell. # Represents an error.
                          # This field is read-only.
                        "message": "A String", # A message with more information about the error
                            # (in the spreadsheet's locale).
                        "type": "A String", # The type of error.
                      },
                    },
                    "formattedValue": "A String", # The formatted value of the cell.
                        # This is the value as it's shown to the user.
                        # This field is read-only.
                    "userEnteredValue": { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `'Hello'`, or `=NOW()`
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # serial number format.
                      "numberValue": 3.14, # Represents a double value.
                          # Note: Dates, Times and DateTimes are represented as doubles in
                          # "serial number" format.
                      "boolValue": True or False, # Represents a boolean value.
                      "formulaValue": "A String", # Represents a formula.
                      "stringValue": "A String", # Represents a string value.
                          # Leading single quotes are not included. For example, if the user typed
                          # `'123` into the UI, this would be represented as a `stringValue` of
                          # `"123"`.
                      "errorValue": { # An error in a cell. # Represents an error.
                          # This field is read-only.
                        "message": "A String", # A message with more information about the error
                            # (in the spreadsheet's locale).
                        "type": "A String", # The type of error.
                      },
                    },
                    "note": "A String", # Any note on the cell.
                    "effectiveFormat": { # The format of a cell. # The effective format being used by the cell.
                        # This includes the results of applying any conditional formatting and,
                        # if the cell contains a formula, the computed number format.
                        # If the effective format is the default format, effective format will
                        # not be written.
                        # This field is read-only.
                      "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                        "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                            # the user's locale will be used if necessary for the given type.
                            # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                            # information about the supported patterns.
                        "type": "A String", # The type of the number format.
                            # When writing, this field must be set.
                      },
                      "textDirection": "A String", # The direction of the text in the cell.
                      "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                          # When updating padding, every field must be specified.
                        "top": 42, # The top padding of the cell.
                        "right": 42, # The right padding of the cell.
                        "bottom": 42, # The bottom padding of the cell.
                        "left": 42, # The left padding of the cell.
                      },
                      "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                      "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                      "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                          # Absent values indicate that the field isn't specified.
                        "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "bold": True or False, # True if the text is bold.
                        "strikethrough": True or False, # True if the text has a strikethrough.
                        "fontFamily": "A String", # The font family.
                        "fontSize": 42, # The size of the font.
                        "italic": True or False, # True if the text is italicized.
                        "underline": True or False, # True if the text is underlined.
                      },
                      "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                      "borders": { # The borders of the cell. # The borders of the cell.
                        "top": { # A border along a cell. # The top border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                        "right": { # A border along a cell. # The right border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                        "bottom": { # A border along a cell. # The bottom border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                        "left": { # A border along a cell. # The left border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                      },
                      "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
                    },
                    "userEnteredFormat": { # The format of a cell. # The format the user entered for the cell.
                        #
                        # When writing, the new format will be merged with the existing format.
                      "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                        "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                            # the user's locale will be used if necessary for the given type.
                            # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                            # information about the supported patterns.
                        "type": "A String", # The type of the number format.
                            # When writing, this field must be set.
                      },
                      "textDirection": "A String", # The direction of the text in the cell.
                      "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                          # When updating padding, every field must be specified.
                        "top": 42, # The top padding of the cell.
                        "right": 42, # The right padding of the cell.
                        "bottom": 42, # The bottom padding of the cell.
                        "left": 42, # The left padding of the cell.
                      },
                      "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                      "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                      "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                          # Absent values indicate that the field isn't specified.
                        "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "bold": True or False, # True if the text is bold.
                        "strikethrough": True or False, # True if the text has a strikethrough.
                        "fontFamily": "A String", # The font family.
                        "fontSize": 42, # The size of the font.
                        "italic": True or False, # True if the text is italicized.
                        "underline": True or False, # True if the text is underlined.
                      },
                      "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                      "borders": { # The borders of the cell. # The borders of the cell.
                        "top": { # A border along a cell. # The top border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                        "right": { # A border along a cell. # The right border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                        "bottom": { # A border along a cell. # The bottom border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                        "left": { # A border along a cell. # The left border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                      },
                      "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
                    },
                    "dataValidation": { # A data validation rule. # A data validation rule on the cell, if any.
                        #
                        # When writing, the new data validation rule will overwrite any prior rule.
                      "showCustomUi": True or False, # True if the UI should be customized based on the kind of condition.
                          # If true, "List" conditions will show a dropdown.
                      "strict": True or False, # True if invalid data should be rejected.
                      "inputMessage": "A String", # A message to show the user when adding data to the cell.
                      "condition": { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                          # BooleanConditions are used by conditional formatting,
                          # data validation, and the criteria in filters.
                        "type": "A String", # The type of condition.
                        "values": [ # The values of the condition. The number of supported values depends
                            # on the condition type.  Some support zero values,
                            # others one or two values,
                            # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                          { # The value of the condition.
                            "relativeDate": "A String", # A relative date (based on the current date).
                                # Valid only if the type is
                                # DATE_BEFORE,
                                # DATE_AFTER,
                                # DATE_ON_OR_BEFORE or
                                # DATE_ON_OR_AFTER.
                                #
                                # Relative dates are not supported in data validation.
                                # They are supported only in conditional formatting and
                                # conditional filters.
                            "userEnteredValue": "A String", # A value the condition is based on.
                                # The value will be parsed as if the user typed into a cell.
                                # Formulas are supported (and must begin with an `=`).
                          },
                        ],
                      },
                    },
                    "textFormatRuns": [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                        # on user entered strings, not formulas, bools, or numbers.
                        # Runs start at specific indexes in the text and continue until the next
                        # run. Properties of a run will continue unless explicitly changed
                        # in a subsequent run (and properties of the first run will continue
                        # the properties of the cell unless explicitly changed).
                        #
                        # When writing, the new runs will overwrite any prior runs.  When writing a
                        # new user_entered_value, previous runs will be erased.
                      { # A run of a text format. The format of this run continues until the start
                          # index of the next run.
                          # When updating, all fields must be set.
                        "startIndex": 42, # The character index where this run starts.
                        "format": { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell's format.
                            # Absent values indicate that the field isn't specified.
                          "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "bold": True or False, # True if the text is bold.
                          "strikethrough": True or False, # True if the text has a strikethrough.
                          "fontFamily": "A String", # The font family.
                          "fontSize": 42, # The size of the font.
                          "italic": True or False, # True if the text is italicized.
                          "underline": True or False, # True if the text is underlined.
                        },
                      },
                    ],
                  },
                ],
              },
            ],
          },
        ],
        "properties": { # Properties of a sheet. # The properties of the sheet.
          "sheetType": "A String", # The type of sheet. Defaults to GRID.
              # This field cannot be changed once set.
          "index": 42, # The index of the sheet within the spreadsheet.
              # When adding or updating sheet properties, if this field
              # is excluded then the sheet will be added or moved to the end
              # of the sheet list. When updating sheet indices or inserting
              # sheets, movement is considered in "before the move" indexes.
              # For example, if there were 3 sheets (S1, S2, S3) in order to
              # move S1 ahead of S2 the index would have to be set to 2. A sheet
              # index update request will be ignored if the requested index is
              # identical to the sheets current index or if the requested new
              # index is equal to the current sheet index + 1.
          "title": "A String", # The name of the sheet.
          "gridProperties": { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
              # (If the sheet is an object sheet, containing a chart or image, then
              # this field will be absent.)
              # When writing it is an error to set any grid properties on non-grid sheets.
            "columnCount": 42, # The number of columns in the grid.
            "rowCount": 42, # The number of rows in the grid.
            "frozenColumnCount": 42, # The number of columns that are frozen in the grid.
            "hideGridlines": True or False, # True if the grid isn't showing gridlines in the UI.
            "frozenRowCount": 42, # The number of rows that are frozen in the grid.
          },
          "rightToLeft": True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
          "tabColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
              #            return nil;
              #          }
              #          Color* result = [Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha <= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!('alpha' in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(',');
              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = ['#'];
              #       for (var i = 0; i < missingZeros; i++) {
              #          resultBuilder.push('0');
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join('');
              #     };
              #
              #     // ...
            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
          },
          "hidden": True or False, # True if the sheet is hidden in the UI, false if it's visible.
          "sheetId": 42, # The ID of the sheet. Must be non-negative.
              # This field cannot be changed once set.
        },
      },
    ],
    "spreadsheetUrl": "A String", # The url of the spreadsheet.
        # This field is read-only.
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(spreadsheetId, ranges=None, x__xgafv=None, includeGridData=None)</code>
  <pre>Returns the spreadsheet at the given ID.
The caller must specify the spreadsheet ID.

By default, data within grids will not be returned.
You can include grid data one of two ways:

* Specify a field mask listing your desired fields using the `fields` URL
parameter in HTTP

* Set the includeGridData
URL parameter to true.  If a field mask is set, the `includeGridData`
parameter is ignored

For large spreadsheets, it is recommended to retrieve only the specific
fields of the spreadsheet that you want.

To retrieve only subsets of the spreadsheet, use the
ranges URL parameter.
Multiple ranges can be specified.  Limiting the range will
return only the portions of the spreadsheet that intersect the requested
ranges. Ranges are specified using A1 notation.

Args:
  spreadsheetId: string, The spreadsheet to request. (required)
  ranges: string, The ranges to retrieve from the spreadsheet. (repeated)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format
  includeGridData: boolean, True if grid data should be returned.
This parameter is ignored if a field mask was set in the request.

Returns:
  An object of the form:

    { # Resource that represents a spreadsheet.
    "spreadsheetId": "A String", # The ID of the spreadsheet.
        # This field is read-only.
    "namedRanges": [ # The named ranges defined in a spreadsheet.
      { # A named range.
        "namedRangeId": "A String", # The ID of the named range.
        "range": { # A range on a sheet. # The range this represents.
            # All indexes are zero-based.
            # Indexes are half open, e.g the start index is inclusive
            # and the end index is exclusive -- [start_index, end_index).
            # Missing indexes indicate the range is unbounded on that side.
            #
            # For example, if `"Sheet1"` is sheet ID 0, then:
            #
            #   `Sheet1!A1:A1 == sheet_id: 0,
            #                   start_row_index: 0, end_row_index: 1,
            #                   start_column_index: 0, end_column_index: 1`
            #
            #   `Sheet1!A3:B4 == sheet_id: 0,
            #                   start_row_index: 2, end_row_index: 4,
            #                   start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A:B == sheet_id: 0,
            #                 start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A5:B == sheet_id: 0,
            #                  start_row_index: 4,
            #                  start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1 == sheet_id:0`
            #
            # The start index must always be less than or equal to the end index.
            # If the start index equals the end index, then the range is empty.
            # Empty ranges are typically not meaningful and are usually rendered in the
            # UI as `#REF!`.
          "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
          "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
          "sheetId": 42, # The sheet this range is on.
          "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
          "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
        },
        "name": "A String", # The name of the named range.
      },
    ],
    "properties": { # Properties of a spreadsheet. # Overall properties of a spreadsheet.
      "locale": "A String", # The locale of the spreadsheet in one of the following formats:
          #
          # * an ISO 639-1 language code such as `en`
          #
          # * an ISO 639-2 language code such as `fil`, if no 639-1 code exists
          #
          # * a combination of the ISO language code and country code, such as `en_US`
          #
          # Note: when updating this field, not all locales/languages are supported.
      "timeZone": "A String", # The time zone of the spreadsheet, in CLDR format such as
          # `America/New_York`. If the time zone isn't recognized, this may
          # be a custom time zone such as `GMT-07:00`.
      "autoRecalc": "A String", # The amount of time to wait before volatile functions are recalculated.
      "defaultFormat": { # The format of a cell. # The default format of all cells in the spreadsheet.
          # CellData.effectiveFormat will not be set if the
          # cell's format is equal to this default format.
          # This field is read-only.
        "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
          "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
              # the user's locale will be used if necessary for the given type.
              # See the [Date and Number Formats guide](/sheets/guides/formats) for more
              # information about the supported patterns.
          "type": "A String", # The type of the number format.
              # When writing, this field must be set.
        },
        "textDirection": "A String", # The direction of the text in the cell.
        "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
            # When updating padding, every field must be specified.
          "top": 42, # The top padding of the cell.
          "right": 42, # The right padding of the cell.
          "bottom": 42, # The bottom padding of the cell.
          "left": 42, # The left padding of the cell.
        },
        "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
        "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
            # for simplicity of conversion to/from color representations in various
            # languages over compactness; for example, the fields of this representation
            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
            # method in iOS; and, with just a little work, it can be easily formatted into
            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
            #
            # Example (Java):
            #
            #      import com.google.type.Color;
            #
            #      // ...
            #      public static java.awt.Color fromProto(Color protocolor) {
            #        float alpha = protocolor.hasAlpha()
            #            ? protocolor.getAlpha().getValue()
            #            : 1.0;
            #
            #        return new java.awt.Color(
            #            protocolor.getRed(),
            #            protocolor.getGreen(),
            #            protocolor.getBlue(),
            #            alpha);
            #      }
            #
            #      public static Color toProto(java.awt.Color color) {
            #        float red = (float) color.getRed();
            #        float green = (float) color.getGreen();
            #        float blue = (float) color.getBlue();
            #        float denominator = 255.0;
            #        Color.Builder resultBuilder =
            #            Color
            #                .newBuilder()
            #                .setRed(red / denominator)
            #                .setGreen(green / denominator)
            #                .setBlue(blue / denominator);
            #        int alpha = color.getAlpha();
            #        if (alpha != 255) {
            #          result.setAlpha(
            #              FloatValue
            #                  .newBuilder()
            #                  .setValue(((float) alpha) / denominator)
            #                  .build());
            #        }
            #        return resultBuilder.build();
            #      }
            #      // ...
            #
            # Example (iOS / Obj-C):
            #
            #      // ...
            #      static UIColor* fromProto(Color* protocolor) {
            #         float red = [protocolor red];
            #         float green = [protocolor green];
            #         float blue = [protocolor blue];
            #         FloatValue* alpha_wrapper = [protocolor alpha];
            #         float alpha = 1.0;
            #         if (alpha_wrapper != nil) {
            #           alpha = [alpha_wrapper value];
            #         }
            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
            #      }
            #
            #      static Color* toProto(UIColor* color) {
            #          CGFloat red, green, blue, alpha;
            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
            #            return nil;
            #          }
            #          Color* result = [Color alloc] init];
            #          [result setRed:red];
            #          [result setGreen:green];
            #          [result setBlue:blue];
            #          if (alpha <= 0.9999) {
            #            [result setAlpha:floatWrapperWithValue(alpha)];
            #          }
            #          [result autorelease];
            #          return result;
            #     }
            #     // ...
            #
            #  Example (JavaScript):
            #
            #     // ...
            #
            #     var protoToCssColor = function(rgb_color) {
            #        var redFrac = rgb_color.red || 0.0;
            #        var greenFrac = rgb_color.green || 0.0;
            #        var blueFrac = rgb_color.blue || 0.0;
            #        var red = Math.floor(redFrac * 255);
            #        var green = Math.floor(greenFrac * 255);
            #        var blue = Math.floor(blueFrac * 255);
            #
            #        if (!('alpha' in rgb_color)) {
            #           return rgbToCssColor_(red, green, blue);
            #        }
            #
            #        var alphaFrac = rgb_color.alpha.value || 0.0;
            #        var rgbParams = [red, green, blue].join(',');
            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
            #     };
            #
            #     var rgbToCssColor_ = function(red, green, blue) {
            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
            #       var hexString = rgbNumber.toString(16);
            #       var missingZeros = 6 - hexString.length;
            #       var resultBuilder = ['#'];
            #       for (var i = 0; i < missingZeros; i++) {
            #          resultBuilder.push('0');
            #       }
            #       resultBuilder.push(hexString);
            #       return resultBuilder.join('');
            #     };
            #
            #     // ...
          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
              # the final pixel color is defined by the equation:
              #
              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
              #
              # This means that a value of 1.0 corresponds to a solid color, whereas
              # a value of 0.0 corresponds to a completely transparent color. This
              # uses a wrapper message rather than a simple float scalar so that it is
              # possible to distinguish between a default value and the value being unset.
              # If omitted, this color object is to be rendered as a solid color
              # (as if the alpha value had been explicitly given with a value of 1.0).
          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
        },
        "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
        "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
            # Absent values indicate that the field isn't specified.
          "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
              #            return nil;
              #          }
              #          Color* result = [Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha <= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!('alpha' in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(',');
              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = ['#'];
              #       for (var i = 0; i < missingZeros; i++) {
              #          resultBuilder.push('0');
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join('');
              #     };
              #
              #     // ...
            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
          },
          "bold": True or False, # True if the text is bold.
          "strikethrough": True or False, # True if the text has a strikethrough.
          "fontFamily": "A String", # The font family.
          "fontSize": 42, # The size of the font.
          "italic": True or False, # True if the text is italicized.
          "underline": True or False, # True if the text is underlined.
        },
        "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
        "borders": { # The borders of the cell. # The borders of the cell.
          "top": { # A border along a cell. # The top border of the cell.
            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "width": 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the "style" field.
            "style": "A String", # The style of the border.
          },
          "right": { # A border along a cell. # The right border of the cell.
            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "width": 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the "style" field.
            "style": "A String", # The style of the border.
          },
          "bottom": { # A border along a cell. # The bottom border of the cell.
            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "width": 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the "style" field.
            "style": "A String", # The style of the border.
          },
          "left": { # A border along a cell. # The left border of the cell.
            "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                #            return nil;
                #          }
                #          Color* result = [Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha <= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!('alpha' in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(',');
                #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = ['#'];
                #       for (var i = 0; i < missingZeros; i++) {
                #          resultBuilder.push('0');
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join('');
                #     };
                #
                #     // ...
              "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
              "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
            },
            "width": 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the "style" field.
            "style": "A String", # The style of the border.
          },
        },
        "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
      },
      "title": "A String", # The title of the spreadsheet.
    },
    "sheets": [ # The sheets that are part of a spreadsheet.
      { # A sheet in a spreadsheet.
        "conditionalFormats": [ # The conditional format rules in this sheet.
          { # A rule describing a conditional format.
            "ranges": [ # The ranges that will be formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
            ],
            "booleanRule": { # A rule that may or may not match, depending on the condition. # The formatting is either "on" or "off" according to the rule.
              "condition": { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format will be applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                "type": "A String", # The type of condition.
                "values": [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    "relativeDate": "A String", # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    "userEnteredValue": "A String", # A value the condition is based on.
                        # The value will be parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=`).
                  },
                ],
              },
              "format": { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &
                  # background color.
                "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                  "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user's locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                      # information about the supported patterns.
                  "type": "A String", # The type of the number format.
                      # When writing, this field must be set.
                },
                "textDirection": "A String", # The direction of the text in the cell.
                "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  "top": 42, # The top padding of the cell.
                  "right": 42, # The right padding of the cell.
                  "bottom": 42, # The bottom padding of the cell.
                  "left": 42, # The left padding of the cell.
                },
                "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn't specified.
                  "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                      # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha <= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!('alpha' in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(',');
                      #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = ['#'];
                      #       for (var i = 0; i < missingZeros; i++) {
                      #          resultBuilder.push('0');
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join('');
                      #     };
                      #
                      #     // ...
                    "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  },
                  "bold": True or False, # True if the text is bold.
                  "strikethrough": True or False, # True if the text has a strikethrough.
                  "fontFamily": "A String", # The font family.
                  "fontSize": 42, # The size of the font.
                  "italic": True or False, # True if the text is italicized.
                  "underline": True or False, # True if the text is underlined.
                },
                "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                "borders": { # The borders of the cell. # The borders of the cell.
                  "top": { # A border along a cell. # The top border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "right": { # A border along a cell. # The right border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "bottom": { # A border along a cell. # The bottom border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                  "left": { # A border along a cell. # The left border of the cell.
                    "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                        # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha <= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!('alpha' in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(',');
                        #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = ['#'];
                        #       for (var i = 0; i < missingZeros; i++) {
                        #          resultBuilder.push('0');
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join('');
                        #     };
                        #
                        #     // ...
                      "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    },
                    "width": 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the "style" field.
                    "style": "A String", # The style of the border.
                  },
                },
                "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
              },
            },
            "gradientRule": { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              "maxpoint": { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
              "midpoint": { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
              "minpoint": { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                "color": { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                    # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha <= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!('alpha' in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(',');
                    #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = ['#'];
                    #       for (var i = 0; i < missingZeros; i++) {
                    #          resultBuilder.push('0');
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join('');
                    #     };
                    #
                    #     // ...
                  "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                },
                "type": "A String", # How the value should be interpreted.
                "value": "A String", # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
              },
            },
          },
        ],
        "bandedRanges": [ # The banded (i.e. alternating colors) ranges on this sheet.
          { # A banded (alternating colors) range in a sheet.
            "range": { # A range on a sheet. # The range over which these properties are applied.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "columnProperties": { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties will be applied on a column-
                # by-column basis throughout all the columns in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              "secondBandColor": { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "headerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first
                  # row or column will be filled with this color and the colors will
                  # alternate between first_band_color and second_band_color starting
                  # from the second row or column. Otherwise, the first row or column will be
                  # filled with first_band_color and the colors will proceed to alternate
                  # as they normally would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "footerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column will be filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "firstBandColor": { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
            },
            "rowProperties": { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties will be applied on a row-by-row
                # basis throughout all the rows in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              "secondBandColor": { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "headerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first
                  # row or column will be filled with this color and the colors will
                  # alternate between first_band_color and second_band_color starting
                  # from the second row or column. Otherwise, the first row or column will be
                  # filled with first_band_color and the colors will proceed to alternate
                  # as they normally would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "footerColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column will be filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
              "firstBandColor": { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                  # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha <= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!('alpha' in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(',');
                  #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = ['#'];
                  #       for (var i = 0; i < missingZeros; i++) {
                  #          resultBuilder.push('0');
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join('');
                  #     };
                  #
                  #     // ...
                "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
              },
            },
            "bandedRangeId": 42, # The id of the banded range.
          },
        ],
        "merges": [ # The ranges that are merged together.
          { # A range on a sheet.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
        ],
        "basicFilter": { # The default filter associated with a sheet. # The filter on this sheet, if any.
          "range": { # A range on a sheet. # The range the filter covers.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `"Sheet1"` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
            "sheetId": 42, # The sheet this range is on.
            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
          },
          "sortSpecs": [ # The sort order per column. Later specifications are used when values
              # are equal in the earlier specifications.
            { # A sort order associated with a specific column or row.
              "sortOrder": "A String", # The order data should be sorted.
              "dimensionIndex": 42, # The dimension the sort should be applied to.
            },
          ],
          "criteria": { # The criteria for showing/hiding values per column.
              # The map's key is the column index, and the value is the criteria for
              # that column.
            "a_key": { # Criteria for showing/hiding rows in a filter or filter view.
              "hiddenValues": [ # Values that should be hidden.
                "A String",
              ],
              "condition": { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                  # (This does not override hiddenValues -- if a value is listed there,
                  #  it will still be hidden.)
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                "type": "A String", # The type of condition.
                "values": [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    "relativeDate": "A String", # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    "userEnteredValue": "A String", # A value the condition is based on.
                        # The value will be parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=`).
                  },
                ],
              },
            },
          },
        },
        "charts": [ # The specifications of every chart on this sheet.
          { # A chart embedded in a sheet.
            "chartId": 42, # The ID of the chart.
            "position": { # The position of an embedded object such as a chart. # The position of the chart.
              "newSheet": True or False, # If true, the embedded object will be put on a new sheet whose ID
                  # is chosen for you. Used only when writing.
              "sheetId": 42, # The sheet this is on. Set only if the embedded object
                  # is on its own sheet. Must be non-negative.
              "overlayPosition": { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                "anchorCell": { # A coordinate in a sheet. # The cell the object is anchored to.
                    # All indexes are zero-based.
                  "rowIndex": 42, # The row index of the coordinate.
                  "columnIndex": 42, # The column index of the coordinate.
                  "sheetId": 42, # The sheet this coordinate is on.
                },
                "offsetYPixels": 42, # The vertical offset, in pixels, that the object is offset
                    # from the anchor cell.
                "widthPixels": 42, # The width of the object, in pixels. Defaults to 600.
                "offsetXPixels": 42, # The horizontal offset, in pixels, that the object is offset
                    # from the anchor cell.
                "heightPixels": 42, # The height of the object, in pixels. Defaults to 371.
              },
            },
            "spec": { # The specifications of a chart. # The specification of the chart.
              "hiddenDimensionStrategy": "A String", # Determines how the charts will use hidden rows or columns.
              "pieChart": { # A <a href="/chart/interactive/docs/gallery/piechart">pie chart</a>. # A pie chart specification.
                "series": { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                  "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                    "sources": [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) & all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be contiguous across the domain and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `"Sheet1"` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                        "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                        "sheetId": 42, # The sheet this range is on.
                        "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                        "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                "domain": { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                  "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                    "sources": [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) & all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be contiguous across the domain and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `"Sheet1"` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                        "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                        "sheetId": 42, # The sheet this range is on.
                        "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                        "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                "threeDimensional": True or False, # True if the pie is three dimensional.
                "legendPosition": "A String", # Where the legend of the pie chart should be drawn.
                "pieHole": 3.14, # The size of the hole in the pie chart.
              },
              "basicChart": { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                  # See BasicChartType for the list of all
                  # charts this supports.
                  # of charts this supports.
                "headerCount": 42, # The number of rows or columns in the data that are "headers".
                    # If not set, Google Sheets will guess how many rows are headers based
                    # on the data.
                    #
                    # (Note that BasicChartAxis.title may override the axis title
                    #  inferred from the header values.)
                "series": [ # The data this chart is visualizing.
                  { # A single series of data in a chart.
                      # For example, if charting stock prices over time, multiple series may exist,
                      # one for the "Open Price", "High Price", "Low Price" and "Close Price".
                    "series": { # The data included in a domain or series. # The data being visualized in this chart series.
                      "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                        "sources": [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) & all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be contiguous across the domain and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `"Sheet1"` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                            "sheetId": 42, # The sheet this range is on.
                            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    "targetAxis": "A String", # The minor axis that will specify the range of values for this series.
                        # For example, if charting stocks over time, the "Volume" series
                        # may want to be pinned to the right with the prices pinned to the left,
                        # because the scale of trading volume is different than the scale of
                        # prices.
                        # It is an error to specify an axis that isn't a valid minor axis
                        # for the chart's type.
                    "type": "A String", # The type of this series. Valid only if the
                        # chartType is
                        # COMBO.
                        # Different types will change the way the series is visualized.
                        # Only LINE, AREA,
                        # and COLUMN are supported.
                  },
                ],
                "legendPosition": "A String", # The position of the chart legend.
                "domains": [ # The domain of data this is charting.
                    # Only a single domain is currently supported.
                  { # The domain of a chart.
                      # For example, if charting stock prices over time, this would be the date.
                    "domain": { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                        # this is the data representing the dates.
                      "sourceRange": { # Source ranges for a chart. # The source ranges of the data.
                        "sources": [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) & all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be contiguous across the domain and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `"Sheet1"` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                            "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                            "sheetId": 42, # The sheet this range is on.
                            "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                            "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                  },
                ],
                "chartType": "A String", # The type of the chart.
                "axis": [ # The axis on the chart.
                  { # An axis of the chart.
                      # A chart may not have more than one axis per
                      # axis position.
                    "position": "A String", # The position of this axis.
                    "format": { # The format of a run of text in a cell. # The format of the title.
                        # Only valid if the axis is not associated with the domain.
                        # Absent values indicate that the field isn't specified.
                      "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "bold": True or False, # True if the text is bold.
                      "strikethrough": True or False, # True if the text has a strikethrough.
                      "fontFamily": "A String", # The font family.
                      "fontSize": 42, # The size of the font.
                      "italic": True or False, # True if the text is italicized.
                      "underline": True or False, # True if the text is underlined.
                    },
                    "title": "A String", # The title of this axis. If set, this overrides any title inferred
                        # from headers of the data.
                  },
                ],
              },
              "title": "A String", # The title of the chart.
            },
          },
        ],
        "filterViews": [ # The filter views in this sheet.
          { # A filter view.
            "title": "A String", # The name of the filter view.
            "namedRangeId": "A String", # The named range this filter view is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            "filterViewId": 42, # The ID of the filter view.
            "range": { # A range on a sheet. # The range this filter view covers.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
            "sortSpecs": [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                "sortOrder": "A String", # The order data should be sorted.
                "dimensionIndex": 42, # The dimension the sort should be applied to.
              },
            ],
            "criteria": { # The criteria for showing/hiding values per column.
                # The map's key is the column index, and the value is the criteria for
                # that column.
              "a_key": { # Criteria for showing/hiding rows in a filter or filter view.
                "hiddenValues": [ # Values that should be hidden.
                  "A String",
                ],
                "condition": { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hiddenValues -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  "type": "A String", # The type of condition.
                  "values": [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      "relativeDate": "A String", # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      "userEnteredValue": "A String", # A value the condition is based on.
                          # The value will be parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=`).
                    },
                  ],
                },
              },
            },
          },
        ],
        "protectedRanges": [ # The protected ranges in this sheet.
          { # A protected range.
            "unprotectedRanges": [ # The list of unprotected ranges within a protected sheet.
                # Unprotected ranges are only supported on protected sheets.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `"Sheet1"` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                "sheetId": 42, # The sheet this range is on.
                "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
              },
            ],
            "requestingUserCanEdit": True or False, # True if the user who requested this protected range can edit the
                # protected area.
                # This field is read-only.
            "description": "A String", # The description of this protected range.
            "namedRangeId": "A String", # The named range this protected range is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            "editors": { # The editors of a protected range. # The users and groups with edit access to the protected range.
                # This field is only visible to users with edit access to the protected
                # range and the document.
                # Editors are not supported with warning_only protection.
              "domainUsersCanEdit": True or False, # True if anyone in the document's domain has edit access to the protected
                  # range.  Domain protection is only supported on documents within a domain.
              "users": [ # The email addresses of users with edit access to the protected range.
                "A String",
              ],
              "groups": [ # The email addresses of groups with edit access to the protected range.
                "A String",
              ],
            },
            "protectedRangeId": 42, # The ID of the protected range.
                # This field is read-only.
            "warningOnly": True or False, # True if this protected range will show a warning when editing.
                # Warning-based protection means that every user can edit data in the
                # protected range, except editing will prompt a warning asking the user
                # to confirm the edit.
                #
                # When writing: if this field is true, then editors is ignored.
                # Additionally, if this field is changed from true to false and the
                # `editors` field is not set (nor included in the field mask), then
                # the editors will be set to all the editors in the document.
            "range": { # A range on a sheet. # The range that is being protected.
                # The range may be fully unbounded, in which case this is considered
                # a protected sheet.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `"Sheet1"` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
              "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
              "sheetId": 42, # The sheet this range is on.
              "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
              "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
            },
          },
        ],
        "data": [ # Data in the grid, if this is a grid sheet.
            # The number of GridData objects returned is dependent on the number of
            # ranges requested on this sheet. For example, if this is representing
            # `Sheet1`, and the spreadsheet was requested with ranges
            # `Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a
            # startRow/startColumn of `0`,
            # while the second one will have `startRow 14` (zero-based row 15),
            # and `startColumn 3` (zero-based column D).
          { # Data in the grid, as well as metadata about the dimensions.
            "startRow": 42, # The first row this GridData refers to, zero-based.
            "rowMetadata": [ # Metadata about the requested rows in the grid, starting with the row
                # in start_row.
              { # Properties about a dimension.
                "pixelSize": 42, # The height (if a row) or width (if a column) of the dimension in pixels.
                "hiddenByUser": True or False, # True if this dimension is explicitly hidden.
                "hiddenByFilter": True or False, # True if this dimension is being filtered.
                    # This field is read-only.
              },
            ],
            "startColumn": 42, # The first column this GridData refers to, zero-based.
            "columnMetadata": [ # Metadata about the requested columns in the grid, starting with the column
                # in start_column.
              { # Properties about a dimension.
                "pixelSize": 42, # The height (if a row) or width (if a column) of the dimension in pixels.
                "hiddenByUser": True or False, # True if this dimension is explicitly hidden.
                "hiddenByFilter": True or False, # True if this dimension is being filtered.
                    # This field is read-only.
              },
            ],
            "rowData": [ # The data in the grid, one entry per row,
                # starting with the row in startRow.
                # The values in RowData will correspond to columns starting
                # at start_column.
              { # Data about each cell in a row.
                "values": [ # The values in the row, one per column.
                  { # Data about a specific cell.
                    "pivotTable": { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                        # is computed dynamically based on its data, grouping, filters, values,
                        # etc. Only the top-left cell of the pivot table contains the pivot table
                        # definition. The other cells will contain the calculated values of the
                        # results of the pivot in their effective_value fields.
                      "valueLayout": "A String", # Whether values should be listed horizontally (as columns)
                          # or vertically (as rows).
                      "rows": [ # Each row grouping in the pivot table.
                        { # A single grouping (either row or column) in a pivot table.
                          "showTotals": True or False, # True if the pivot table should include the totals for this grouping.
                          "valueMetadata": [ # Metadata about values in the grouping.
                            { # Metadata about a value in a pivot grouping.
                              "collapsed": True or False, # True if the data corresponding to the value is collapsed.
                              "value": { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                  # (Note that formulaValue is not valid,
                                  #  because the values will be calculated.)
                                "numberValue": 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # "serial number" format.
                                "boolValue": True or False, # Represents a boolean value.
                                "formulaValue": "A String", # Represents a formula.
                                "stringValue": "A String", # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `'123` into the UI, this would be represented as a `stringValue` of
                                    # `"123"`.
                                "errorValue": { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  "message": "A String", # A message with more information about the error
                                      # (in the spreadsheet's locale).
                                  "type": "A String", # The type of error.
                                },
                              },
                            },
                          ],
                          "valueBucket": { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                              # If not specified, sorting is alphabetical by this group's values.
                            "buckets": [ # Determines the bucket from which values are chosen to sort.
                                #
                                # For example, in a pivot table with one row group & two column groups,
                                # the row group can list up to two values. The first value corresponds
                                # to a value within the first column group, and the second value
                                # corresponds to a value in the second column group.  If no values
                                # are listed, this would indicate that the row should be sorted according
                                # to the "Grand Total" over the column groups. If a single value is listed,
                                # this would correspond to using the "Total" of that bucket.
                              { # The kinds of value that a cell in a spreadsheet can have.
                                "numberValue": 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # "serial number" format.
                                "boolValue": True or False, # Represents a boolean value.
                                "formulaValue": "A String", # Represents a formula.
                                "stringValue": "A String", # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `'123` into the UI, this would be represented as a `stringValue` of
                                    # `"123"`.
                                "errorValue": { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  "message": "A String", # A message with more information about the error
                                      # (in the spreadsheet's locale).
                                  "type": "A String", # The type of error.
                                },
                              },
                            ],
                            "valuesIndex": 42, # The offset in the PivotTable.values list which the values in this
                                # grouping should be sorted by.
                          },
                          "sortOrder": "A String", # The order the values in this group should be sorted.
                          "sourceColumnOffset": 42, # The column offset of the source range that this grouping is based on.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this group refers to column `C`, whereas the offset `1` would refer
                              # to column `D`.
                        },
                      ],
                      "source": { # A range on a sheet. # The range the pivot table is reading data from.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `"Sheet1"` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        "endRowIndex": 42, # The end row (exclusive) of the range, or not set if unbounded.
                        "startRowIndex": 42, # The start row (inclusive) of the range, or not set if unbounded.
                        "sheetId": 42, # The sheet this range is on.
                        "startColumnIndex": 42, # The start column (inclusive) of the range, or not set if unbounded.
                        "endColumnIndex": 42, # The end column (exclusive) of the range, or not set if unbounded.
                      },
                      "values": [ # A list of values to include in the pivot table.
                        { # The definition of how a value in a pivot table should be calculated.
                          "formula": "A String", # A custom formula to calculate the value.  The formula must start
                              # with an `=` character.
                          "summarizeFunction": "A String", # A function to summarize the value.
                              # If formula is set, the only supported values are
                              # SUM and
                              # CUSTOM.
                              # If sourceColumnOffset is set, then `CUSTOM`
                              # is not supported.
                          "sourceColumnOffset": 42, # The column offset of the source range that this value reads from.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this value refers to column `C`, whereas the offset `1` would
                              # refer to column `D`.
                          "name": "A String", # A name to use for the value. This is only used if formula was set.
                              # Otherwise, the column name is used.
                        },
                      ],
                      "criteria": { # An optional mapping of filters per source column offset.
                          #
                          # The filters will be applied before aggregating data into the pivot table.
                          # The map's key is the column offset of the source range that you want to
                          # filter, and the value is the criteria for that column.
                          #
                          # For example, if the source was `C10:E15`, a key of `0` will have the filter
                          # for column `C`, whereas the key `1` is for column `D`.
                        "a_key": { # Criteria for showing/hiding rows in a pivot table.
                          "visibleValues": [ # Values that should be included.  Values not listed here are excluded.
                            "A String",
                          ],
                        },
                      },
                      "columns": [ # Each column grouping in the pivot table.
                        { # A single grouping (either row or column) in a pivot table.
                          "showTotals": True or False, # True if the pivot table should include the totals for this grouping.
                          "valueMetadata": [ # Metadata about values in the grouping.
                            { # Metadata about a value in a pivot grouping.
                              "collapsed": True or False, # True if the data corresponding to the value is collapsed.
                              "value": { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                  # (Note that formulaValue is not valid,
                                  #  because the values will be calculated.)
                                "numberValue": 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # "serial number" format.
                                "boolValue": True or False, # Represents a boolean value.
                                "formulaValue": "A String", # Represents a formula.
                                "stringValue": "A String", # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `'123` into the UI, this would be represented as a `stringValue` of
                                    # `"123"`.
                                "errorValue": { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  "message": "A String", # A message with more information about the error
                                      # (in the spreadsheet's locale).
                                  "type": "A String", # The type of error.
                                },
                              },
                            },
                          ],
                          "valueBucket": { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                              # If not specified, sorting is alphabetical by this group's values.
                            "buckets": [ # Determines the bucket from which values are chosen to sort.
                                #
                                # For example, in a pivot table with one row group & two column groups,
                                # the row group can list up to two values. The first value corresponds
                                # to a value within the first column group, and the second value
                                # corresponds to a value in the second column group.  If no values
                                # are listed, this would indicate that the row should be sorted according
                                # to the "Grand Total" over the column groups. If a single value is listed,
                                # this would correspond to using the "Total" of that bucket.
                              { # The kinds of value that a cell in a spreadsheet can have.
                                "numberValue": 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # "serial number" format.
                                "boolValue": True or False, # Represents a boolean value.
                                "formulaValue": "A String", # Represents a formula.
                                "stringValue": "A String", # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `'123` into the UI, this would be represented as a `stringValue` of
                                    # `"123"`.
                                "errorValue": { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  "message": "A String", # A message with more information about the error
                                      # (in the spreadsheet's locale).
                                  "type": "A String", # The type of error.
                                },
                              },
                            ],
                            "valuesIndex": 42, # The offset in the PivotTable.values list which the values in this
                                # grouping should be sorted by.
                          },
                          "sortOrder": "A String", # The order the values in this group should be sorted.
                          "sourceColumnOffset": 42, # The column offset of the source range that this grouping is based on.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this group refers to column `C`, whereas the offset `1` would refer
                              # to column `D`.
                        },
                      ],
                    },
                    "hyperlink": "A String", # A hyperlink this cell points to, if any.
                        # This field is read-only.  (To set it, use a `=HYPERLINK` formula.)
                    "effectiveValue": { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this will be
                        # the calculated value.  For cells with literals, this will be
                        # the same as the user_entered_value.
                        # This field is read-only.
                      "numberValue": 3.14, # Represents a double value.
                          # Note: Dates, Times and DateTimes are represented as doubles in
                          # "serial number" format.
                      "boolValue": True or False, # Represents a boolean value.
                      "formulaValue": "A String", # Represents a formula.
                      "stringValue": "A String", # Represents a string value.
                          # Leading single quotes are not included. For example, if the user typed
                          # `'123` into the UI, this would be represented as a `stringValue` of
                          # `"123"`.
                      "errorValue": { # An error in a cell. # Represents an error.
                          # This field is read-only.
                        "message": "A String", # A message with more information about the error
                            # (in the spreadsheet's locale).
                        "type": "A String", # The type of error.
                      },
                    },
                    "formattedValue": "A String", # The formatted value of the cell.
                        # This is the value as it's shown to the user.
                        # This field is read-only.
                    "userEnteredValue": { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `'Hello'`, or `=NOW()`
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # serial number format.
                      "numberValue": 3.14, # Represents a double value.
                          # Note: Dates, Times and DateTimes are represented as doubles in
                          # "serial number" format.
                      "boolValue": True or False, # Represents a boolean value.
                      "formulaValue": "A String", # Represents a formula.
                      "stringValue": "A String", # Represents a string value.
                          # Leading single quotes are not included. For example, if the user typed
                          # `'123` into the UI, this would be represented as a `stringValue` of
                          # `"123"`.
                      "errorValue": { # An error in a cell. # Represents an error.
                          # This field is read-only.
                        "message": "A String", # A message with more information about the error
                            # (in the spreadsheet's locale).
                        "type": "A String", # The type of error.
                      },
                    },
                    "note": "A String", # Any note on the cell.
                    "effectiveFormat": { # The format of a cell. # The effective format being used by the cell.
                        # This includes the results of applying any conditional formatting and,
                        # if the cell contains a formula, the computed number format.
                        # If the effective format is the default format, effective format will
                        # not be written.
                        # This field is read-only.
                      "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                        "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                            # the user's locale will be used if necessary for the given type.
                            # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                            # information about the supported patterns.
                        "type": "A String", # The type of the number format.
                            # When writing, this field must be set.
                      },
                      "textDirection": "A String", # The direction of the text in the cell.
                      "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                          # When updating padding, every field must be specified.
                        "top": 42, # The top padding of the cell.
                        "right": 42, # The right padding of the cell.
                        "bottom": 42, # The bottom padding of the cell.
                        "left": 42, # The left padding of the cell.
                      },
                      "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                      "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                      "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                          # Absent values indicate that the field isn't specified.
                        "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "bold": True or False, # True if the text is bold.
                        "strikethrough": True or False, # True if the text has a strikethrough.
                        "fontFamily": "A String", # The font family.
                        "fontSize": 42, # The size of the font.
                        "italic": True or False, # True if the text is italicized.
                        "underline": True or False, # True if the text is underlined.
                      },
                      "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                      "borders": { # The borders of the cell. # The borders of the cell.
                        "top": { # A border along a cell. # The top border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                        "right": { # A border along a cell. # The right border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                        "bottom": { # A border along a cell. # The bottom border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                        "left": { # A border along a cell. # The left border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                      },
                      "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
                    },
                    "userEnteredFormat": { # The format of a cell. # The format the user entered for the cell.
                        #
                        # When writing, the new format will be merged with the existing format.
                      "numberFormat": { # The number format of a cell. # A format describing how number values should be represented to the user.
                        "pattern": "A String", # Pattern string used for formatting.  If not set, a default pattern based on
                            # the user's locale will be used if necessary for the given type.
                            # See the [Date and Number Formats guide](/sheets/guides/formats) for more
                            # information about the supported patterns.
                        "type": "A String", # The type of the number format.
                            # When writing, this field must be set.
                      },
                      "textDirection": "A String", # The direction of the text in the cell.
                      "padding": { # The amount of padding around the cell, in pixels. # The padding of the cell.
                          # When updating padding, every field must be specified.
                        "top": 42, # The top padding of the cell.
                        "right": 42, # The right padding of the cell.
                        "bottom": 42, # The bottom padding of the cell.
                        "left": 42, # The left padding of the cell.
                      },
                      "horizontalAlignment": "A String", # The horizontal alignment of the value in the cell.
                      "backgroundColor": { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                          # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha <= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!('alpha' in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(',');
                          #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = ['#'];
                          #       for (var i = 0; i < missingZeros; i++) {
                          #          resultBuilder.push('0');
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join('');
                          #     };
                          #
                          #     // ...
                        "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      },
                      "verticalAlignment": "A String", # The vertical alignment of the value in the cell.
                      "textFormat": { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                          # Absent values indicate that the field isn't specified.
                        "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                            # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha <= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!('alpha' in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(',');
                            #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = ['#'];
                            #       for (var i = 0; i < missingZeros; i++) {
                            #          resultBuilder.push('0');
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join('');
                            #     };
                            #
                            #     // ...
                          "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        },
                        "bold": True or False, # True if the text is bold.
                        "strikethrough": True or False, # True if the text has a strikethrough.
                        "fontFamily": "A String", # The font family.
                        "fontSize": 42, # The size of the font.
                        "italic": True or False, # True if the text is italicized.
                        "underline": True or False, # True if the text is underlined.
                      },
                      "hyperlinkDisplayType": "A String", # How a hyperlink, if it exists, should be displayed in the cell.
                      "borders": { # The borders of the cell. # The borders of the cell.
                        "top": { # A border along a cell. # The top border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                        "right": { # A border along a cell. # The right border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                        "bottom": { # A border along a cell. # The bottom border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                        "left": { # A border along a cell. # The left border of the cell.
                          "color": { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "width": 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the "style" field.
                          "style": "A String", # The style of the border.
                        },
                      },
                      "wrapStrategy": "A String", # The wrap strategy for the value in the cell.
                    },
                    "dataValidation": { # A data validation rule. # A data validation rule on the cell, if any.
                        #
                        # When writing, the new data validation rule will overwrite any prior rule.
                      "showCustomUi": True or False, # True if the UI should be customized based on the kind of condition.
                          # If true, "List" conditions will show a dropdown.
                      "strict": True or False, # True if invalid data should be rejected.
                      "inputMessage": "A String", # A message to show the user when adding data to the cell.
                      "condition": { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                          # BooleanConditions are used by conditional formatting,
                          # data validation, and the criteria in filters.
                        "type": "A String", # The type of condition.
                        "values": [ # The values of the condition. The number of supported values depends
                            # on the condition type.  Some support zero values,
                            # others one or two values,
                            # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                          { # The value of the condition.
                            "relativeDate": "A String", # A relative date (based on the current date).
                                # Valid only if the type is
                                # DATE_BEFORE,
                                # DATE_AFTER,
                                # DATE_ON_OR_BEFORE or
                                # DATE_ON_OR_AFTER.
                                #
                                # Relative dates are not supported in data validation.
                                # They are supported only in conditional formatting and
                                # conditional filters.
                            "userEnteredValue": "A String", # A value the condition is based on.
                                # The value will be parsed as if the user typed into a cell.
                                # Formulas are supported (and must begin with an `=`).
                          },
                        ],
                      },
                    },
                    "textFormatRuns": [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                        # on user entered strings, not formulas, bools, or numbers.
                        # Runs start at specific indexes in the text and continue until the next
                        # run. Properties of a run will continue unless explicitly changed
                        # in a subsequent run (and properties of the first run will continue
                        # the properties of the cell unless explicitly changed).
                        #
                        # When writing, the new runs will overwrite any prior runs.  When writing a
                        # new user_entered_value, previous runs will be erased.
                      { # A run of a text format. The format of this run continues until the start
                          # index of the next run.
                          # When updating, all fields must be set.
                        "startIndex": 42, # The character index where this run starts.
                        "format": { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell's format.
                            # Absent values indicate that the field isn't specified.
                          "foregroundColor": { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
                              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha <= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!('alpha' in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(',');
                              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = ['#'];
                              #       for (var i = 0; i < missingZeros; i++) {
                              #          resultBuilder.push('0');
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join('');
                              #     };
                              #
                              #     // ...
                            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          },
                          "bold": True or False, # True if the text is bold.
                          "strikethrough": True or False, # True if the text has a strikethrough.
                          "fontFamily": "A String", # The font family.
                          "fontSize": 42, # The size of the font.
                          "italic": True or False, # True if the text is italicized.
                          "underline": True or False, # True if the text is underlined.
                        },
                      },
                    ],
                  },
                ],
              },
            ],
          },
        ],
        "properties": { # Properties of a sheet. # The properties of the sheet.
          "sheetType": "A String", # The type of sheet. Defaults to GRID.
              # This field cannot be changed once set.
          "index": 42, # The index of the sheet within the spreadsheet.
              # When adding or updating sheet properties, if this field
              # is excluded then the sheet will be added or moved to the end
              # of the sheet list. When updating sheet indices or inserting
              # sheets, movement is considered in "before the move" indexes.
              # For example, if there were 3 sheets (S1, S2, S3) in order to
              # move S1 ahead of S2 the index would have to be set to 2. A sheet
              # index update request will be ignored if the requested index is
              # identical to the sheets current index or if the requested new
              # index is equal to the current sheet index + 1.
          "title": "A String", # The name of the sheet.
          "gridProperties": { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
              # (If the sheet is an object sheet, containing a chart or image, then
              # this field will be absent.)
              # When writing it is an error to set any grid properties on non-grid sheets.
            "columnCount": 42, # The number of columns in the grid.
            "rowCount": 42, # The number of rows in the grid.
            "frozenColumnCount": 42, # The number of columns that are frozen in the grid.
            "hideGridlines": True or False, # True if the grid isn't showing gridlines in the UI.
            "frozenRowCount": 42, # The number of rows that are frozen in the grid.
          },
          "rightToLeft": True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
          "tabColor": { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of "java.awt.Color" in Java; it
              # can also be trivially provided to UIColor's "+colorWithRed:green:blue:alpha"
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS "rgba()" string in JavaScript, as well. Here are some examples:
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&red green:&green blue:&blue alpha:&alpha]) {
              #            return nil;
              #          }
              #          Color* result = [Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha <= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!('alpha' in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(',');
              #        return ['rgba(', rgbParams, ',', alphaFrac, ')'].join('');
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red << 16) | (green << 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = ['#'];
              #       for (var i = 0; i < missingZeros; i++) {
              #          resultBuilder.push('0');
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join('');
              #     };
              #
              #     // ...
            "blue": 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            "alpha": 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            "green": 3.14, # The amount of green in the color as a value in the interval [0, 1].
            "red": 3.14, # The amount of red in the color as a value in the interval [0, 1].
          },
          "hidden": True or False, # True if the sheet is hidden in the UI, false if it's visible.
          "sheetId": 42, # The ID of the sheet. Must be non-negative.
              # This field cannot be changed once set.
        },
      },
    ],
    "spreadsheetUrl": "A String", # The url of the spreadsheet.
        # This field is read-only.
  }</pre>
</div>

</body></html>