@alanse/mcp-server-google-workspace 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +173 -0
- package/dist/auth.js +135 -0
- package/dist/index.js +116 -0
- package/dist/tools/basic/gsheets_add_sheet.js +65 -0
- package/dist/tools/basic/gsheets_copy_sheet.js +56 -0
- package/dist/tools/basic/gsheets_copy_to.js +113 -0
- package/dist/tools/basic/gsheets_create_spreadsheet.js +88 -0
- package/dist/tools/basic/gsheets_delete_columns.js +69 -0
- package/dist/tools/basic/gsheets_delete_rows.js +69 -0
- package/dist/tools/basic/gsheets_delete_sheet.js +56 -0
- package/dist/tools/basic/gsheets_duplicate_sheet.js +72 -0
- package/dist/tools/basic/gsheets_insert_columns.js +69 -0
- package/dist/tools/basic/gsheets_insert_rows.js +69 -0
- package/dist/tools/basic/gsheets_list_sheets.js +53 -0
- package/dist/tools/basic/gsheets_read.js +120 -0
- package/dist/tools/basic/gsheets_rename_sheet.js +64 -0
- package/dist/tools/charts/gsheets_add_bubble.js +176 -0
- package/dist/tools/charts/gsheets_add_candlestick.js +192 -0
- package/dist/tools/charts/gsheets_add_chart.js +162 -0
- package/dist/tools/charts/gsheets_add_combo.js +169 -0
- package/dist/tools/charts/gsheets_add_histogram.js +143 -0
- package/dist/tools/charts/gsheets_add_org_chart.js +160 -0
- package/dist/tools/charts/gsheets_add_treemap.js +177 -0
- package/dist/tools/charts/gsheets_add_waterfall.js +155 -0
- package/dist/tools/charts/gsheets_delete_chart.js +56 -0
- package/dist/tools/charts/gsheets_update_chart.js +118 -0
- package/dist/tools/data/gsheets_append_data.js +68 -0
- package/dist/tools/data/gsheets_batch_clear.js +53 -0
- package/dist/tools/data/gsheets_batch_update.js +81 -0
- package/dist/tools/data/gsheets_clear_data.js +53 -0
- package/dist/tools/data/gsheets_create_filter.js +81 -0
- package/dist/tools/data/gsheets_find_replace.js +124 -0
- package/dist/tools/data/gsheets_set_data_validation.js +153 -0
- package/dist/tools/data/gsheets_sort_range.js +102 -0
- package/dist/tools/data/gsheets_update_cell.js +44 -0
- package/dist/tools/formatting/gsheets_auto_resize.js +75 -0
- package/dist/tools/formatting/gsheets_format_cells.js +161 -0
- package/dist/tools/formatting/gsheets_freeze_columns.js +67 -0
- package/dist/tools/formatting/gsheets_freeze_rows.js +67 -0
- package/dist/tools/formatting/gsheets_merge_cells.js +85 -0
- package/dist/tools/formatting/gsheets_set_number_format.js +116 -0
- package/dist/tools/formatting/gsheets_unmerge_cells.js +79 -0
- package/dist/tools/formatting/gsheets_update_borders.js +212 -0
- package/dist/tools/gdrive/gdrive_read_file.js +77 -0
- package/dist/tools/gdrive/gdrive_search.js +71 -0
- package/dist/tools/gdrive_read_file.js +77 -0
- package/dist/tools/gdrive_search.js +71 -0
- package/dist/tools/gsheets_add_bubble.js +176 -0
- package/dist/tools/gsheets_add_candlestick.js +192 -0
- package/dist/tools/gsheets_add_chart.js +162 -0
- package/dist/tools/gsheets_add_combo.js +169 -0
- package/dist/tools/gsheets_add_conditional_format.js +175 -0
- package/dist/tools/gsheets_add_histogram.js +143 -0
- package/dist/tools/gsheets_add_named_range.js +87 -0
- package/dist/tools/gsheets_add_org_chart.js +160 -0
- package/dist/tools/gsheets_add_protected_range.js +127 -0
- package/dist/tools/gsheets_add_sheet.js +65 -0
- package/dist/tools/gsheets_add_treemap.js +177 -0
- package/dist/tools/gsheets_add_waterfall.js +155 -0
- package/dist/tools/gsheets_append_data.js +68 -0
- package/dist/tools/gsheets_auto_resize.js +75 -0
- package/dist/tools/gsheets_batch_clear.js +53 -0
- package/dist/tools/gsheets_batch_update.js +81 -0
- package/dist/tools/gsheets_clear_data.js +53 -0
- package/dist/tools/gsheets_copy_sheet.js +56 -0
- package/dist/tools/gsheets_copy_to.js +113 -0
- package/dist/tools/gsheets_create_filter.js +81 -0
- package/dist/tools/gsheets_create_spreadsheet.js +88 -0
- package/dist/tools/gsheets_delete_chart.js +56 -0
- package/dist/tools/gsheets_delete_columns.js +69 -0
- package/dist/tools/gsheets_delete_named_range.js +56 -0
- package/dist/tools/gsheets_delete_protected_range.js +56 -0
- package/dist/tools/gsheets_delete_rows.js +69 -0
- package/dist/tools/gsheets_delete_sheet.js +56 -0
- package/dist/tools/gsheets_duplicate_sheet.js +72 -0
- package/dist/tools/gsheets_find_replace.js +124 -0
- package/dist/tools/gsheets_format_cells.js +161 -0
- package/dist/tools/gsheets_freeze_columns.js +67 -0
- package/dist/tools/gsheets_freeze_rows.js +67 -0
- package/dist/tools/gsheets_insert_columns.js +69 -0
- package/dist/tools/gsheets_insert_rows.js +69 -0
- package/dist/tools/gsheets_list_sheets.js +53 -0
- package/dist/tools/gsheets_merge_cells.js +85 -0
- package/dist/tools/gsheets_read.js +120 -0
- package/dist/tools/gsheets_rename_sheet.js +64 -0
- package/dist/tools/gsheets_set_data_validation.js +153 -0
- package/dist/tools/gsheets_set_number_format.js +116 -0
- package/dist/tools/gsheets_sort_range.js +102 -0
- package/dist/tools/gsheets_unmerge_cells.js +79 -0
- package/dist/tools/gsheets_update_borders.js +212 -0
- package/dist/tools/gsheets_update_cell.js +44 -0
- package/dist/tools/gsheets_update_chart.js +118 -0
- package/dist/tools/gsheets_update_named_range.js +112 -0
- package/dist/tools/gsheets_update_protected_range.js +110 -0
- package/dist/tools/index.js +294 -0
- package/dist/tools/protection/gsheets_add_conditional_format.js +175 -0
- package/dist/tools/protection/gsheets_add_named_range.js +87 -0
- package/dist/tools/protection/gsheets_add_protected_range.js +127 -0
- package/dist/tools/protection/gsheets_delete_named_range.js +56 -0
- package/dist/tools/protection/gsheets_delete_protected_range.js +56 -0
- package/dist/tools/protection/gsheets_update_named_range.js +112 -0
- package/dist/tools/protection/gsheets_update_protected_range.js +110 -0
- package/dist/tools/sheets/advanced/gsheets_add_dimension_group.js +75 -0
- package/dist/tools/sheets/advanced/gsheets_add_filter_view.js +86 -0
- package/dist/tools/sheets/advanced/gsheets_add_pivot_table.js +188 -0
- package/dist/tools/sheets/advanced/gsheets_create_developer_metadata.js +121 -0
- package/dist/tools/sheets/advanced/gsheets_delete_developer_metadata.js +61 -0
- package/dist/tools/sheets/advanced/gsheets_delete_dimension_group.js +75 -0
- package/dist/tools/sheets/advanced/gsheets_update_developer_metadata.js +94 -0
- package/dist/tools/sheets/advanced/gsheets_update_dimension_group.js +83 -0
- package/dist/tools/sheets/basic/gsheets_add_sheet.js +65 -0
- package/dist/tools/sheets/basic/gsheets_copy_sheet.js +56 -0
- package/dist/tools/sheets/basic/gsheets_copy_to.js +113 -0
- package/dist/tools/sheets/basic/gsheets_create_spreadsheet.js +88 -0
- package/dist/tools/sheets/basic/gsheets_delete_columns.js +69 -0
- package/dist/tools/sheets/basic/gsheets_delete_rows.js +69 -0
- package/dist/tools/sheets/basic/gsheets_delete_sheet.js +56 -0
- package/dist/tools/sheets/basic/gsheets_duplicate_sheet.js +72 -0
- package/dist/tools/sheets/basic/gsheets_insert_columns.js +69 -0
- package/dist/tools/sheets/basic/gsheets_insert_rows.js +69 -0
- package/dist/tools/sheets/basic/gsheets_list_sheets.js +53 -0
- package/dist/tools/sheets/basic/gsheets_read.js +120 -0
- package/dist/tools/sheets/basic/gsheets_rename_sheet.js +64 -0
- package/dist/tools/sheets/charts/gsheets_add_bubble.js +176 -0
- package/dist/tools/sheets/charts/gsheets_add_candlestick.js +192 -0
- package/dist/tools/sheets/charts/gsheets_add_chart.js +162 -0
- package/dist/tools/sheets/charts/gsheets_add_combo.js +169 -0
- package/dist/tools/sheets/charts/gsheets_add_histogram.js +143 -0
- package/dist/tools/sheets/charts/gsheets_add_org_chart.js +160 -0
- package/dist/tools/sheets/charts/gsheets_add_treemap.js +177 -0
- package/dist/tools/sheets/charts/gsheets_add_waterfall.js +155 -0
- package/dist/tools/sheets/charts/gsheets_delete_chart.js +56 -0
- package/dist/tools/sheets/charts/gsheets_update_chart.js +118 -0
- package/dist/tools/sheets/data/gsheets_append_data.js +68 -0
- package/dist/tools/sheets/data/gsheets_batch_clear.js +53 -0
- package/dist/tools/sheets/data/gsheets_batch_update.js +81 -0
- package/dist/tools/sheets/data/gsheets_clear_data.js +53 -0
- package/dist/tools/sheets/data/gsheets_create_filter.js +81 -0
- package/dist/tools/sheets/data/gsheets_find_replace.js +124 -0
- package/dist/tools/sheets/data/gsheets_set_data_validation.js +153 -0
- package/dist/tools/sheets/data/gsheets_sort_range.js +102 -0
- package/dist/tools/sheets/data/gsheets_update_cell.js +44 -0
- package/dist/tools/sheets/formatting/gsheets_auto_resize.js +75 -0
- package/dist/tools/sheets/formatting/gsheets_format_cells.js +161 -0
- package/dist/tools/sheets/formatting/gsheets_freeze_columns.js +67 -0
- package/dist/tools/sheets/formatting/gsheets_freeze_rows.js +67 -0
- package/dist/tools/sheets/formatting/gsheets_merge_cells.js +85 -0
- package/dist/tools/sheets/formatting/gsheets_set_number_format.js +116 -0
- package/dist/tools/sheets/formatting/gsheets_unmerge_cells.js +79 -0
- package/dist/tools/sheets/formatting/gsheets_update_borders.js +212 -0
- package/dist/tools/sheets/protection/gsheets_add_conditional_format.js +175 -0
- package/dist/tools/sheets/protection/gsheets_add_named_range.js +87 -0
- package/dist/tools/sheets/protection/gsheets_add_protected_range.js +127 -0
- package/dist/tools/sheets/protection/gsheets_delete_named_range.js +56 -0
- package/dist/tools/sheets/protection/gsheets_delete_protected_range.js +56 -0
- package/dist/tools/sheets/protection/gsheets_update_named_range.js +112 -0
- package/dist/tools/sheets/protection/gsheets_update_protected_range.js +110 -0
- package/dist/tools/types.js +1 -0
- package/dist/vitest.config.js +18 -0
- package/package.json +57 -0
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_add_combo",
|
|
4
|
+
description: "Add a combo chart to a spreadsheet (combines multiple chart types like column and line)",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
spreadsheetId: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "The ID of the spreadsheet",
|
|
11
|
+
},
|
|
12
|
+
sheetId: {
|
|
13
|
+
type: "number",
|
|
14
|
+
description: "The ID of the sheet where the chart will be placed",
|
|
15
|
+
},
|
|
16
|
+
title: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Chart title (optional)",
|
|
19
|
+
},
|
|
20
|
+
dataSheetId: {
|
|
21
|
+
type: "number",
|
|
22
|
+
description: "The sheet ID containing the data",
|
|
23
|
+
},
|
|
24
|
+
dataStartRow: {
|
|
25
|
+
type: "number",
|
|
26
|
+
description: "Starting row of data range (0-based)",
|
|
27
|
+
},
|
|
28
|
+
dataEndRow: {
|
|
29
|
+
type: "number",
|
|
30
|
+
description: "Ending row of data range (exclusive, 0-based)",
|
|
31
|
+
},
|
|
32
|
+
dataStartColumn: {
|
|
33
|
+
type: "number",
|
|
34
|
+
description: "Starting column of data range (0-based)",
|
|
35
|
+
},
|
|
36
|
+
dataEndColumn: {
|
|
37
|
+
type: "number",
|
|
38
|
+
description: "Ending column of data range (exclusive, 0-based)",
|
|
39
|
+
},
|
|
40
|
+
seriesTypes: {
|
|
41
|
+
type: "array",
|
|
42
|
+
items: {
|
|
43
|
+
type: "string",
|
|
44
|
+
enum: ["COLUMN", "BAR", "LINE", "AREA"],
|
|
45
|
+
},
|
|
46
|
+
description: "Array of chart types for each series (optional, defaults to COLUMN for all)",
|
|
47
|
+
},
|
|
48
|
+
position: {
|
|
49
|
+
type: "object",
|
|
50
|
+
properties: {
|
|
51
|
+
overlayRow: {
|
|
52
|
+
type: "number",
|
|
53
|
+
description: "Row position for chart overlay (0-based)",
|
|
54
|
+
},
|
|
55
|
+
overlayColumn: {
|
|
56
|
+
type: "number",
|
|
57
|
+
description: "Column position for chart overlay (0-based)",
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
description: "Chart position (optional)",
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
required: ["spreadsheetId", "sheetId", "dataSheetId", "dataStartRow", "dataEndRow", "dataStartColumn", "dataEndColumn"],
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
export async function addCombo(args) {
|
|
67
|
+
try {
|
|
68
|
+
const sheets = google.sheets("v4");
|
|
69
|
+
const series = [];
|
|
70
|
+
const numSeries = args.dataEndColumn - args.dataStartColumn - 1;
|
|
71
|
+
for (let i = 0; i < numSeries; i++) {
|
|
72
|
+
const seriesSpec = {
|
|
73
|
+
series: {
|
|
74
|
+
sourceRange: {
|
|
75
|
+
sources: [
|
|
76
|
+
{
|
|
77
|
+
sheetId: args.dataSheetId,
|
|
78
|
+
startRowIndex: args.dataStartRow,
|
|
79
|
+
endRowIndex: args.dataEndRow,
|
|
80
|
+
startColumnIndex: args.dataStartColumn + 1 + i,
|
|
81
|
+
endColumnIndex: args.dataStartColumn + 2 + i,
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
if (args.seriesTypes && args.seriesTypes[i]) {
|
|
88
|
+
seriesSpec.type = args.seriesTypes[i];
|
|
89
|
+
}
|
|
90
|
+
series.push(seriesSpec);
|
|
91
|
+
}
|
|
92
|
+
const basicChart = {
|
|
93
|
+
chartType: "COMBO",
|
|
94
|
+
legendPosition: "BOTTOM_LEGEND",
|
|
95
|
+
axis: [
|
|
96
|
+
{ position: "BOTTOM_AXIS" },
|
|
97
|
+
{ position: "LEFT_AXIS" },
|
|
98
|
+
],
|
|
99
|
+
domains: [
|
|
100
|
+
{
|
|
101
|
+
domain: {
|
|
102
|
+
sourceRange: {
|
|
103
|
+
sources: [
|
|
104
|
+
{
|
|
105
|
+
sheetId: args.dataSheetId,
|
|
106
|
+
startRowIndex: args.dataStartRow,
|
|
107
|
+
endRowIndex: args.dataEndRow,
|
|
108
|
+
startColumnIndex: args.dataStartColumn,
|
|
109
|
+
endColumnIndex: args.dataStartColumn + 1,
|
|
110
|
+
},
|
|
111
|
+
],
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
series,
|
|
117
|
+
headerCount: 1,
|
|
118
|
+
};
|
|
119
|
+
const chartSpec = {
|
|
120
|
+
title: args.title || "Combo Chart",
|
|
121
|
+
basicChart,
|
|
122
|
+
};
|
|
123
|
+
const position = {
|
|
124
|
+
overlayPosition: {
|
|
125
|
+
anchorCell: {
|
|
126
|
+
sheetId: args.sheetId,
|
|
127
|
+
rowIndex: args.position?.overlayRow || 0,
|
|
128
|
+
columnIndex: args.position?.overlayColumn || 0,
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
const response = await sheets.spreadsheets.batchUpdate({
|
|
133
|
+
spreadsheetId: args.spreadsheetId,
|
|
134
|
+
requestBody: {
|
|
135
|
+
requests: [
|
|
136
|
+
{
|
|
137
|
+
addChart: {
|
|
138
|
+
chart: {
|
|
139
|
+
spec: chartSpec,
|
|
140
|
+
position,
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
},
|
|
146
|
+
});
|
|
147
|
+
const chartId = response.data.replies?.[0]?.addChart?.chart?.chartId;
|
|
148
|
+
return {
|
|
149
|
+
content: [
|
|
150
|
+
{
|
|
151
|
+
type: "text",
|
|
152
|
+
text: `Successfully created combo chart. Chart ID: ${chartId}`,
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
isError: false,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
return {
|
|
160
|
+
content: [
|
|
161
|
+
{
|
|
162
|
+
type: "text",
|
|
163
|
+
text: `Error creating combo chart: ${error.message}`,
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
isError: true,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_add_histogram",
|
|
4
|
+
description: "Add a histogram chart to a spreadsheet",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
spreadsheetId: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "The ID of the spreadsheet",
|
|
11
|
+
},
|
|
12
|
+
sheetId: {
|
|
13
|
+
type: "number",
|
|
14
|
+
description: "The ID of the sheet where the chart will be placed",
|
|
15
|
+
},
|
|
16
|
+
title: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Chart title (optional)",
|
|
19
|
+
},
|
|
20
|
+
dataSheetId: {
|
|
21
|
+
type: "number",
|
|
22
|
+
description: "The sheet ID containing the data",
|
|
23
|
+
},
|
|
24
|
+
dataStartRow: {
|
|
25
|
+
type: "number",
|
|
26
|
+
description: "Starting row of data range (0-based)",
|
|
27
|
+
},
|
|
28
|
+
dataEndRow: {
|
|
29
|
+
type: "number",
|
|
30
|
+
description: "Ending row of data range (exclusive, 0-based)",
|
|
31
|
+
},
|
|
32
|
+
dataStartColumn: {
|
|
33
|
+
type: "number",
|
|
34
|
+
description: "Starting column of data range (0-based)",
|
|
35
|
+
},
|
|
36
|
+
dataEndColumn: {
|
|
37
|
+
type: "number",
|
|
38
|
+
description: "Ending column of data range (exclusive, 0-based)",
|
|
39
|
+
},
|
|
40
|
+
bucketSize: {
|
|
41
|
+
type: "number",
|
|
42
|
+
description: "The size of histogram buckets (optional)",
|
|
43
|
+
},
|
|
44
|
+
outlierPercentile: {
|
|
45
|
+
type: "number",
|
|
46
|
+
description: "Percentile to use for outlier detection (optional, 0-1)",
|
|
47
|
+
},
|
|
48
|
+
position: {
|
|
49
|
+
type: "object",
|
|
50
|
+
properties: {
|
|
51
|
+
overlayRow: {
|
|
52
|
+
type: "number",
|
|
53
|
+
description: "Row position for chart overlay (0-based)",
|
|
54
|
+
},
|
|
55
|
+
overlayColumn: {
|
|
56
|
+
type: "number",
|
|
57
|
+
description: "Column position for chart overlay (0-based)",
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
description: "Chart position (optional)",
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
required: ["spreadsheetId", "sheetId", "dataSheetId", "dataStartRow", "dataEndRow", "dataStartColumn", "dataEndColumn"],
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
export async function addHistogram(args) {
|
|
67
|
+
try {
|
|
68
|
+
const sheets = google.sheets("v4");
|
|
69
|
+
const histogramChart = {
|
|
70
|
+
legendPosition: "BOTTOM_LEGEND",
|
|
71
|
+
series: [
|
|
72
|
+
{
|
|
73
|
+
sourceRange: {
|
|
74
|
+
sources: [
|
|
75
|
+
{
|
|
76
|
+
sheetId: args.dataSheetId,
|
|
77
|
+
startRowIndex: args.dataStartRow,
|
|
78
|
+
endRowIndex: args.dataEndRow,
|
|
79
|
+
startColumnIndex: args.dataStartColumn,
|
|
80
|
+
endColumnIndex: args.dataEndColumn,
|
|
81
|
+
},
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
};
|
|
87
|
+
if (args.bucketSize !== undefined) {
|
|
88
|
+
histogramChart.bucketSize = args.bucketSize;
|
|
89
|
+
}
|
|
90
|
+
if (args.outlierPercentile !== undefined) {
|
|
91
|
+
histogramChart.outlierPercentile = args.outlierPercentile;
|
|
92
|
+
}
|
|
93
|
+
const chartSpec = {
|
|
94
|
+
title: args.title || "Histogram",
|
|
95
|
+
histogramChart,
|
|
96
|
+
};
|
|
97
|
+
const position = {
|
|
98
|
+
overlayPosition: {
|
|
99
|
+
anchorCell: {
|
|
100
|
+
sheetId: args.sheetId,
|
|
101
|
+
rowIndex: args.position?.overlayRow || 0,
|
|
102
|
+
columnIndex: args.position?.overlayColumn || 0,
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
const response = await sheets.spreadsheets.batchUpdate({
|
|
107
|
+
spreadsheetId: args.spreadsheetId,
|
|
108
|
+
requestBody: {
|
|
109
|
+
requests: [
|
|
110
|
+
{
|
|
111
|
+
addChart: {
|
|
112
|
+
chart: {
|
|
113
|
+
spec: chartSpec,
|
|
114
|
+
position,
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
const chartId = response.data.replies?.[0]?.addChart?.chart?.chartId;
|
|
122
|
+
return {
|
|
123
|
+
content: [
|
|
124
|
+
{
|
|
125
|
+
type: "text",
|
|
126
|
+
text: `Successfully created histogram chart. Chart ID: ${chartId}`,
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
isError: false,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
return {
|
|
134
|
+
content: [
|
|
135
|
+
{
|
|
136
|
+
type: "text",
|
|
137
|
+
text: `Error creating histogram: ${error.message}`,
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
isError: true,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_add_org_chart",
|
|
4
|
+
description: "Add an organizational chart to a spreadsheet (displays hierarchical relationships)",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
spreadsheetId: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "The ID of the spreadsheet",
|
|
11
|
+
},
|
|
12
|
+
sheetId: {
|
|
13
|
+
type: "number",
|
|
14
|
+
description: "The ID of the sheet where the chart will be placed",
|
|
15
|
+
},
|
|
16
|
+
title: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Chart title (optional)",
|
|
19
|
+
},
|
|
20
|
+
dataSheetId: {
|
|
21
|
+
type: "number",
|
|
22
|
+
description: "The sheet ID containing the data",
|
|
23
|
+
},
|
|
24
|
+
dataStartRow: {
|
|
25
|
+
type: "number",
|
|
26
|
+
description: "Starting row of data range (0-based)",
|
|
27
|
+
},
|
|
28
|
+
dataEndRow: {
|
|
29
|
+
type: "number",
|
|
30
|
+
description: "Ending row of data range (exclusive, 0-based)",
|
|
31
|
+
},
|
|
32
|
+
labelsColumn: {
|
|
33
|
+
type: "number",
|
|
34
|
+
description: "Column index for node labels (0-based)",
|
|
35
|
+
},
|
|
36
|
+
parentLabelsColumn: {
|
|
37
|
+
type: "number",
|
|
38
|
+
description: "Column index for parent labels (0-based, optional for root nodes)",
|
|
39
|
+
},
|
|
40
|
+
tooltipsColumn: {
|
|
41
|
+
type: "number",
|
|
42
|
+
description: "Column index for tooltips (0-based, optional)",
|
|
43
|
+
},
|
|
44
|
+
position: {
|
|
45
|
+
type: "object",
|
|
46
|
+
properties: {
|
|
47
|
+
overlayRow: {
|
|
48
|
+
type: "number",
|
|
49
|
+
description: "Row position for chart overlay (0-based)",
|
|
50
|
+
},
|
|
51
|
+
overlayColumn: {
|
|
52
|
+
type: "number",
|
|
53
|
+
description: "Column position for chart overlay (0-based)",
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
description: "Chart position (optional)",
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
required: ["spreadsheetId", "sheetId", "dataSheetId", "dataStartRow", "dataEndRow", "labelsColumn"],
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
export async function addOrgChart(args) {
|
|
63
|
+
try {
|
|
64
|
+
const sheets = google.sheets("v4");
|
|
65
|
+
const orgChart = {
|
|
66
|
+
labels: {
|
|
67
|
+
sourceRange: {
|
|
68
|
+
sources: [
|
|
69
|
+
{
|
|
70
|
+
sheetId: args.dataSheetId,
|
|
71
|
+
startRowIndex: args.dataStartRow,
|
|
72
|
+
endRowIndex: args.dataEndRow,
|
|
73
|
+
startColumnIndex: args.labelsColumn,
|
|
74
|
+
endColumnIndex: args.labelsColumn + 1,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
if (args.parentLabelsColumn !== undefined) {
|
|
81
|
+
orgChart.parentLabels = {
|
|
82
|
+
sourceRange: {
|
|
83
|
+
sources: [
|
|
84
|
+
{
|
|
85
|
+
sheetId: args.dataSheetId,
|
|
86
|
+
startRowIndex: args.dataStartRow,
|
|
87
|
+
endRowIndex: args.dataEndRow,
|
|
88
|
+
startColumnIndex: args.parentLabelsColumn,
|
|
89
|
+
endColumnIndex: args.parentLabelsColumn + 1,
|
|
90
|
+
},
|
|
91
|
+
],
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (args.tooltipsColumn !== undefined) {
|
|
96
|
+
orgChart.tooltips = {
|
|
97
|
+
sourceRange: {
|
|
98
|
+
sources: [
|
|
99
|
+
{
|
|
100
|
+
sheetId: args.dataSheetId,
|
|
101
|
+
startRowIndex: args.dataStartRow,
|
|
102
|
+
endRowIndex: args.dataEndRow,
|
|
103
|
+
startColumnIndex: args.tooltipsColumn,
|
|
104
|
+
endColumnIndex: args.tooltipsColumn + 1,
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const chartSpec = {
|
|
111
|
+
title: args.title || "Organizational Chart",
|
|
112
|
+
orgChart,
|
|
113
|
+
};
|
|
114
|
+
const position = {
|
|
115
|
+
overlayPosition: {
|
|
116
|
+
anchorCell: {
|
|
117
|
+
sheetId: args.sheetId,
|
|
118
|
+
rowIndex: args.position?.overlayRow || 0,
|
|
119
|
+
columnIndex: args.position?.overlayColumn || 0,
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
const response = await sheets.spreadsheets.batchUpdate({
|
|
124
|
+
spreadsheetId: args.spreadsheetId,
|
|
125
|
+
requestBody: {
|
|
126
|
+
requests: [
|
|
127
|
+
{
|
|
128
|
+
addChart: {
|
|
129
|
+
chart: {
|
|
130
|
+
spec: chartSpec,
|
|
131
|
+
position,
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
const chartId = response.data.replies?.[0]?.addChart?.chart?.chartId;
|
|
139
|
+
return {
|
|
140
|
+
content: [
|
|
141
|
+
{
|
|
142
|
+
type: "text",
|
|
143
|
+
text: `Successfully created organizational chart. Chart ID: ${chartId}`,
|
|
144
|
+
},
|
|
145
|
+
],
|
|
146
|
+
isError: false,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
return {
|
|
151
|
+
content: [
|
|
152
|
+
{
|
|
153
|
+
type: "text",
|
|
154
|
+
text: `Error creating organizational chart: ${error.message}`,
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
isError: true,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_add_treemap",
|
|
4
|
+
description: "Add a treemap chart to a spreadsheet (displays hierarchical data as nested rectangles)",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
spreadsheetId: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "The ID of the spreadsheet",
|
|
11
|
+
},
|
|
12
|
+
sheetId: {
|
|
13
|
+
type: "number",
|
|
14
|
+
description: "The ID of the sheet where the chart will be placed",
|
|
15
|
+
},
|
|
16
|
+
title: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "Chart title (optional)",
|
|
19
|
+
},
|
|
20
|
+
dataSheetId: {
|
|
21
|
+
type: "number",
|
|
22
|
+
description: "The sheet ID containing the data",
|
|
23
|
+
},
|
|
24
|
+
dataStartRow: {
|
|
25
|
+
type: "number",
|
|
26
|
+
description: "Starting row of data range (0-based)",
|
|
27
|
+
},
|
|
28
|
+
dataEndRow: {
|
|
29
|
+
type: "number",
|
|
30
|
+
description: "Ending row of data range (exclusive, 0-based)",
|
|
31
|
+
},
|
|
32
|
+
labelsColumn: {
|
|
33
|
+
type: "number",
|
|
34
|
+
description: "Column index for labels (0-based)",
|
|
35
|
+
},
|
|
36
|
+
parentLabelsColumn: {
|
|
37
|
+
type: "number",
|
|
38
|
+
description: "Column index for parent labels (0-based, optional)",
|
|
39
|
+
},
|
|
40
|
+
sizeColumn: {
|
|
41
|
+
type: "number",
|
|
42
|
+
description: "Column index for size values (0-based)",
|
|
43
|
+
},
|
|
44
|
+
colorColumn: {
|
|
45
|
+
type: "number",
|
|
46
|
+
description: "Column index for color values (0-based, optional)",
|
|
47
|
+
},
|
|
48
|
+
position: {
|
|
49
|
+
type: "object",
|
|
50
|
+
properties: {
|
|
51
|
+
overlayRow: {
|
|
52
|
+
type: "number",
|
|
53
|
+
description: "Row position for chart overlay (0-based)",
|
|
54
|
+
},
|
|
55
|
+
overlayColumn: {
|
|
56
|
+
type: "number",
|
|
57
|
+
description: "Column position for chart overlay (0-based)",
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
description: "Chart position (optional)",
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
required: ["spreadsheetId", "sheetId", "dataSheetId", "dataStartRow", "dataEndRow", "labelsColumn", "sizeColumn"],
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
export async function addTreemap(args) {
|
|
67
|
+
try {
|
|
68
|
+
const sheets = google.sheets("v4");
|
|
69
|
+
const treemapChart = {
|
|
70
|
+
labels: {
|
|
71
|
+
sourceRange: {
|
|
72
|
+
sources: [
|
|
73
|
+
{
|
|
74
|
+
sheetId: args.dataSheetId,
|
|
75
|
+
startRowIndex: args.dataStartRow,
|
|
76
|
+
endRowIndex: args.dataEndRow,
|
|
77
|
+
startColumnIndex: args.labelsColumn,
|
|
78
|
+
endColumnIndex: args.labelsColumn + 1,
|
|
79
|
+
},
|
|
80
|
+
],
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
sizeData: {
|
|
84
|
+
sourceRange: {
|
|
85
|
+
sources: [
|
|
86
|
+
{
|
|
87
|
+
sheetId: args.dataSheetId,
|
|
88
|
+
startRowIndex: args.dataStartRow,
|
|
89
|
+
endRowIndex: args.dataEndRow,
|
|
90
|
+
startColumnIndex: args.sizeColumn,
|
|
91
|
+
endColumnIndex: args.sizeColumn + 1,
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
if (args.parentLabelsColumn !== undefined) {
|
|
98
|
+
treemapChart.parentLabels = {
|
|
99
|
+
sourceRange: {
|
|
100
|
+
sources: [
|
|
101
|
+
{
|
|
102
|
+
sheetId: args.dataSheetId,
|
|
103
|
+
startRowIndex: args.dataStartRow,
|
|
104
|
+
endRowIndex: args.dataEndRow,
|
|
105
|
+
startColumnIndex: args.parentLabelsColumn,
|
|
106
|
+
endColumnIndex: args.parentLabelsColumn + 1,
|
|
107
|
+
},
|
|
108
|
+
],
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
if (args.colorColumn !== undefined) {
|
|
113
|
+
treemapChart.colorData = {
|
|
114
|
+
sourceRange: {
|
|
115
|
+
sources: [
|
|
116
|
+
{
|
|
117
|
+
sheetId: args.dataSheetId,
|
|
118
|
+
startRowIndex: args.dataStartRow,
|
|
119
|
+
endRowIndex: args.dataEndRow,
|
|
120
|
+
startColumnIndex: args.colorColumn,
|
|
121
|
+
endColumnIndex: args.colorColumn + 1,
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const chartSpec = {
|
|
128
|
+
title: args.title || "Treemap Chart",
|
|
129
|
+
treemapChart,
|
|
130
|
+
};
|
|
131
|
+
const position = {
|
|
132
|
+
overlayPosition: {
|
|
133
|
+
anchorCell: {
|
|
134
|
+
sheetId: args.sheetId,
|
|
135
|
+
rowIndex: args.position?.overlayRow || 0,
|
|
136
|
+
columnIndex: args.position?.overlayColumn || 0,
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
};
|
|
140
|
+
const response = await sheets.spreadsheets.batchUpdate({
|
|
141
|
+
spreadsheetId: args.spreadsheetId,
|
|
142
|
+
requestBody: {
|
|
143
|
+
requests: [
|
|
144
|
+
{
|
|
145
|
+
addChart: {
|
|
146
|
+
chart: {
|
|
147
|
+
spec: chartSpec,
|
|
148
|
+
position,
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
],
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
const chartId = response.data.replies?.[0]?.addChart?.chart?.chartId;
|
|
156
|
+
return {
|
|
157
|
+
content: [
|
|
158
|
+
{
|
|
159
|
+
type: "text",
|
|
160
|
+
text: `Successfully created treemap chart. Chart ID: ${chartId}`,
|
|
161
|
+
},
|
|
162
|
+
],
|
|
163
|
+
isError: false,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
return {
|
|
168
|
+
content: [
|
|
169
|
+
{
|
|
170
|
+
type: "text",
|
|
171
|
+
text: `Error creating treemap chart: ${error.message}`,
|
|
172
|
+
},
|
|
173
|
+
],
|
|
174
|
+
isError: true,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
}
|