Skip to main content
Glama

sheets_update_borders

Modify cell borders in Google Sheets by specifying the spreadsheet ID, range, and border styles. Streamline formatting tasks programmatically with structured input.

Instructions

Update borders of cells in a Google Sheet

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
bordersYes
rangeYes
spreadsheetIdYes

Implementation Reference

  • The main handler function that validates input, parses the range, builds the UpdateBordersRequest for the Google Sheets API batchUpdate, converts border properties, and executes the update.
    export async function updateBordersHandler(input: any): Promise<ToolResponse> {
      try {
        // Handle case where borders comes as JSON string
        input.borders = parseJsonInput(input.borders, 'borders');
    
        const validatedInput = updateBordersInputSchema.parse(input) as UpdateBordersInput;
        const sheets = await getAuthenticatedClient();
    
        // Extract sheet name and get sheet ID
        const { sheetName, range: cleanRange } = extractSheetName(validatedInput.range);
        const sheetId = await getSheetId(sheets, validatedInput.spreadsheetId, sheetName);
    
        // Parse range to GridRange
        const gridRange = parseRange(cleanRange, sheetId);
    
        // Build the border update request
        const updateBordersRequest: sheets_v4.Schema$UpdateBordersRequest = {
          range: gridRange,
        };
    
        // Helper function to convert our border format to Google's format
        const convertBorder = (border?: any): sheets_v4.Schema$Border | undefined => {
          if (!border) {
            return undefined;
          }
          return {
            style: border.style,
            color: border.color,
            width: border.width,
          };
        };
    
        const topBorder = convertBorder(validatedInput.borders.top);
        if (topBorder) {
          updateBordersRequest.top = topBorder;
        }
    
        const bottomBorder = convertBorder(validatedInput.borders.bottom);
        if (bottomBorder) {
          updateBordersRequest.bottom = bottomBorder;
        }
    
        const leftBorder = convertBorder(validatedInput.borders.left);
        if (leftBorder) {
          updateBordersRequest.left = leftBorder;
        }
    
        const rightBorder = convertBorder(validatedInput.borders.right);
        if (rightBorder) {
          updateBordersRequest.right = rightBorder;
        }
    
        const innerHorizontalBorder = convertBorder(validatedInput.borders.innerHorizontal);
        if (innerHorizontalBorder) {
          updateBordersRequest.innerHorizontal = innerHorizontalBorder;
        }
    
        const innerVerticalBorder = convertBorder(validatedInput.borders.innerVertical);
        if (innerVerticalBorder) {
          updateBordersRequest.innerVertical = innerVerticalBorder;
        }
    
        // Execute the border update
        const response = await sheets.spreadsheets.batchUpdate({
          spreadsheetId: validatedInput.spreadsheetId,
          requestBody: {
            requests: [
              {
                updateBorders: updateBordersRequest,
              },
            ],
          },
        });
    
        return formatToolResponse(`Successfully updated borders for range ${validatedInput.range}`, {
          spreadsheetId: response.data.spreadsheetId,
        });
      } catch (error) {
        return handleError(error);
      }
    }
  • Zod schemas for color, border, borders objects, and the main input schema. Also the Tool object definition with name, description, and inputSchema for MCP.
    // Schema definitions
    const colorSchema = z
      .object({
        red: z.number().min(0).max(1).optional(),
        green: z.number().min(0).max(1).optional(),
        blue: z.number().min(0).max(1).optional(),
        alpha: z.number().min(0).max(1).optional(),
      })
      .optional();
    
    const borderSchema = z
      .object({
        style: z.enum(['NONE', 'SOLID', 'DASHED', 'DOTTED', 'SOLID_MEDIUM', 'SOLID_THICK', 'DOUBLE']),
        color: colorSchema,
        width: z.number().positive().optional(),
      })
      .optional();
    
    const bordersSchema = z.object({
      top: borderSchema,
      bottom: borderSchema,
      left: borderSchema,
      right: borderSchema,
      innerHorizontal: borderSchema,
      innerVertical: borderSchema,
    });
    
    const updateBordersInputSchema = z.object({
      spreadsheetId: z.string(),
      range: z.string(),
      borders: bordersSchema,
    });
    
    export const updateBordersTool: Tool = {
      name: 'sheets_update_borders',
      description: 'Update borders of cells in a Google Sheet',
      inputSchema: {
        type: 'object',
        properties: updateBordersInputSchema.shape,
        required: ['spreadsheetId', 'range', 'borders'],
      },
    };
  • src/index.ts:32-64 (registration)
    Registration of the updateBordersHandler in the toolHandlers Map used by the MCP server to dispatch tool calls.
    const toolHandlers = new Map<string, (input: any) => Promise<any>>([
      ['sheets_check_access', tools.handleCheckAccess],
      ['sheets_get_values', tools.handleGetValues],
      ['sheets_batch_get_values', tools.handleBatchGetValues],
      ['sheets_get_metadata', tools.handleGetMetadata],
      ['sheets_update_values', tools.handleUpdateValues],
      ['sheets_batch_update_values', tools.handleBatchUpdateValues],
      ['sheets_append_values', tools.handleAppendValues],
      ['sheets_clear_values', tools.handleClearValues],
      ['sheets_create_spreadsheet', tools.handleCreateSpreadsheet],
      ['sheets_insert_sheet', tools.handleInsertSheet],
      ['sheets_delete_sheet', tools.handleDeleteSheet],
      ['sheets_duplicate_sheet', tools.handleDuplicateSheet],
      ['sheets_copy_to', tools.handleCopyTo],
      ['sheets_update_sheet_properties', tools.handleUpdateSheetProperties],
      ['sheets_format_cells', tools.formatCellsHandler],
      ['sheets_update_borders', tools.updateBordersHandler],
      ['sheets_merge_cells', tools.mergeCellsHandler],
      ['sheets_unmerge_cells', tools.unmergeCellsHandler],
      ['sheets_add_conditional_formatting', tools.addConditionalFormattingHandler],
      // Batch operations
      ['sheets_batch_delete_sheets', tools.handleBatchDeleteSheets],
      ['sheets_batch_format_cells', tools.handleBatchFormatCells],
      // Chart operations
      ['sheets_create_chart', tools.handleCreateChart],
      ['sheets_update_chart', tools.handleUpdateChart],
      ['sheets_delete_chart', tools.handleDeleteChart],
      // Link and date operations
      ['sheets_insert_link', tools.handleInsertLink],
      ['sheets_insert_date', tools.handleInsertDate],
      // Row operations
      ['sheets_insert_rows', tools.handleInsertRows],
    ]);
  • src/index.ts:67-99 (registration)
    Inclusion of the updateBordersTool in the allTools array returned by ListToolsRequestHandler.
    const allTools = [
      tools.checkAccessTool,
      tools.getValuesTool,
      tools.batchGetValuesTool,
      tools.getMetadataTool,
      tools.updateValuesTool,
      tools.batchUpdateValuesTool,
      tools.appendValuesTool,
      tools.clearValuesTool,
      tools.createSpreadsheetTool,
      tools.insertSheetTool,
      tools.deleteSheetTool,
      tools.duplicateSheetTool,
      tools.copyToTool,
      tools.updateSheetPropertiesTool,
      tools.formatCellsTool,
      tools.updateBordersTool,
      tools.mergeCellsTool,
      tools.unmergeCellsTool,
      tools.addConditionalFormattingTool,
      // Batch operations
      tools.batchDeleteSheetsTool,
      tools.batchFormatCellsTool,
      // Chart operations
      tools.createChartTool,
      tools.updateChartTool,
      tools.deleteChartTool,
      // Link and date operations
      tools.insertLinkTool,
      tools.insertDateTool,
      // Row operations
      tools.insertRowsTool,
    ];
  • Re-export of updateBordersTool and updateBordersHandler from the individual tool file to make them available for import in src/index.ts.
    export * from './update-borders.js';

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/freema/mcp-gsheets'

If you have feedback or need assistance with the MCP directory API, please join our Discord server