@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,121 @@
|
|
|
1
|
+
import { google } from 'googleapis';
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_create_developer_metadata",
|
|
4
|
+
description: "Create developer metadata for a spreadsheet, sheet, row, or column. Allows storing custom key-value metadata.",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
spreadsheetId: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "The ID of the spreadsheet"
|
|
11
|
+
},
|
|
12
|
+
location: {
|
|
13
|
+
type: "object",
|
|
14
|
+
description: "The location where the metadata should be attached",
|
|
15
|
+
properties: {
|
|
16
|
+
type: {
|
|
17
|
+
type: "string",
|
|
18
|
+
enum: ["SPREADSHEET", "SHEET", "ROW", "COLUMN"],
|
|
19
|
+
description: "The type of location"
|
|
20
|
+
},
|
|
21
|
+
sheetId: {
|
|
22
|
+
type: "number",
|
|
23
|
+
description: "The sheet ID (required for SHEET, ROW, COLUMN)"
|
|
24
|
+
},
|
|
25
|
+
dimensionRange: {
|
|
26
|
+
type: "object",
|
|
27
|
+
description: "The dimension range (required for ROW, COLUMN)",
|
|
28
|
+
properties: {
|
|
29
|
+
dimension: {
|
|
30
|
+
type: "string",
|
|
31
|
+
enum: ["ROWS", "COLUMNS"]
|
|
32
|
+
},
|
|
33
|
+
startIndex: {
|
|
34
|
+
type: "number"
|
|
35
|
+
},
|
|
36
|
+
endIndex: {
|
|
37
|
+
type: "number"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
required: ["type"]
|
|
43
|
+
},
|
|
44
|
+
metadataKey: {
|
|
45
|
+
type: "string",
|
|
46
|
+
description: "The metadata key"
|
|
47
|
+
},
|
|
48
|
+
metadataValue: {
|
|
49
|
+
type: "string",
|
|
50
|
+
description: "The metadata value"
|
|
51
|
+
},
|
|
52
|
+
visibility: {
|
|
53
|
+
type: "string",
|
|
54
|
+
enum: ["DOCUMENT", "PROJECT"],
|
|
55
|
+
description: "The visibility of the metadata (DOCUMENT or PROJECT)"
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
required: ["spreadsheetId", "location", "metadataKey", "metadataValue", "visibility"]
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
export async function createDeveloperMetadata(args) {
|
|
62
|
+
try {
|
|
63
|
+
const sheets = google.sheets("v4");
|
|
64
|
+
const metadataLocation = {};
|
|
65
|
+
if (args.location.type === "SPREADSHEET") {
|
|
66
|
+
metadataLocation.spreadsheet = true;
|
|
67
|
+
}
|
|
68
|
+
else if (args.location.type === "SHEET" && args.location.sheetId !== undefined) {
|
|
69
|
+
metadataLocation.sheetId = args.location.sheetId;
|
|
70
|
+
}
|
|
71
|
+
else if ((args.location.type === "ROW" || args.location.type === "COLUMN") &&
|
|
72
|
+
args.location.sheetId !== undefined &&
|
|
73
|
+
args.location.dimensionRange) {
|
|
74
|
+
metadataLocation.dimensionRange = {
|
|
75
|
+
sheetId: args.location.sheetId,
|
|
76
|
+
dimension: args.location.dimensionRange.dimension,
|
|
77
|
+
startIndex: args.location.dimensionRange.startIndex,
|
|
78
|
+
endIndex: args.location.dimensionRange.endIndex,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const response = await sheets.spreadsheets.batchUpdate({
|
|
82
|
+
spreadsheetId: args.spreadsheetId,
|
|
83
|
+
requestBody: {
|
|
84
|
+
requests: [
|
|
85
|
+
{
|
|
86
|
+
createDeveloperMetadata: {
|
|
87
|
+
developerMetadata: {
|
|
88
|
+
location: metadataLocation,
|
|
89
|
+
metadataKey: args.metadataKey,
|
|
90
|
+
metadataValue: args.metadataValue,
|
|
91
|
+
visibility: args.visibility,
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
const metadataId = response.data.replies?.[0]?.createDeveloperMetadata?.developerMetadata?.metadataId;
|
|
99
|
+
return {
|
|
100
|
+
content: [
|
|
101
|
+
{
|
|
102
|
+
type: "text",
|
|
103
|
+
text: `Successfully created developer metadata with key "${args.metadataKey}" and value "${args.metadataValue}". Metadata ID: ${metadataId}.`,
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
isError: false,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
111
|
+
return {
|
|
112
|
+
content: [
|
|
113
|
+
{
|
|
114
|
+
type: "text",
|
|
115
|
+
text: `Error creating developer metadata: ${errorMessage}`,
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
isError: true,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { google } from 'googleapis';
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_delete_developer_metadata",
|
|
4
|
+
description: "Delete developer metadata by metadata ID.",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
spreadsheetId: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "The ID of the spreadsheet"
|
|
11
|
+
},
|
|
12
|
+
metadataId: {
|
|
13
|
+
type: "number",
|
|
14
|
+
description: "The ID of the metadata to delete"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
required: ["spreadsheetId", "metadataId"]
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
export async function deleteDeveloperMetadata(args) {
|
|
21
|
+
try {
|
|
22
|
+
const sheets = google.sheets("v4");
|
|
23
|
+
await sheets.spreadsheets.batchUpdate({
|
|
24
|
+
spreadsheetId: args.spreadsheetId,
|
|
25
|
+
requestBody: {
|
|
26
|
+
requests: [
|
|
27
|
+
{
|
|
28
|
+
deleteDeveloperMetadata: {
|
|
29
|
+
dataFilter: {
|
|
30
|
+
developerMetadataLookup: {
|
|
31
|
+
metadataId: args.metadataId,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
return {
|
|
40
|
+
content: [
|
|
41
|
+
{
|
|
42
|
+
type: "text",
|
|
43
|
+
text: `Successfully deleted developer metadata with ID ${args.metadataId}.`,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
isError: false,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
51
|
+
return {
|
|
52
|
+
content: [
|
|
53
|
+
{
|
|
54
|
+
type: "text",
|
|
55
|
+
text: `Error deleting developer metadata: ${errorMessage}`,
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
isError: true,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { google } from 'googleapis';
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_delete_dimension_group",
|
|
4
|
+
description: "Delete a dimension group (row or column group) from a Google Sheet.",
|
|
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"
|
|
15
|
+
},
|
|
16
|
+
dimension: {
|
|
17
|
+
type: "string",
|
|
18
|
+
enum: ["ROWS", "COLUMNS"],
|
|
19
|
+
description: "The dimension of the group to delete (ROWS or COLUMNS)"
|
|
20
|
+
},
|
|
21
|
+
startIndex: {
|
|
22
|
+
type: "number",
|
|
23
|
+
description: "The start index of the dimension group to delete (inclusive)"
|
|
24
|
+
},
|
|
25
|
+
endIndex: {
|
|
26
|
+
type: "number",
|
|
27
|
+
description: "The end index of the dimension group to delete (exclusive)"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
required: ["spreadsheetId", "sheetId", "dimension", "startIndex", "endIndex"]
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
export async function deleteDimensionGroup(args) {
|
|
34
|
+
try {
|
|
35
|
+
const sheets = google.sheets("v4");
|
|
36
|
+
await sheets.spreadsheets.batchUpdate({
|
|
37
|
+
spreadsheetId: args.spreadsheetId,
|
|
38
|
+
requestBody: {
|
|
39
|
+
requests: [
|
|
40
|
+
{
|
|
41
|
+
deleteDimensionGroup: {
|
|
42
|
+
range: {
|
|
43
|
+
sheetId: args.sheetId,
|
|
44
|
+
dimension: args.dimension,
|
|
45
|
+
startIndex: args.startIndex,
|
|
46
|
+
endIndex: args.endIndex,
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
content: [
|
|
55
|
+
{
|
|
56
|
+
type: "text",
|
|
57
|
+
text: `Successfully deleted ${args.dimension.toLowerCase()} group from index ${args.startIndex} to ${args.endIndex} on sheet ${args.sheetId}.`,
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
isError: false,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
65
|
+
return {
|
|
66
|
+
content: [
|
|
67
|
+
{
|
|
68
|
+
type: "text",
|
|
69
|
+
text: `Error deleting dimension group: ${errorMessage}`,
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
isError: true,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { google } from 'googleapis';
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_update_developer_metadata",
|
|
4
|
+
description: "Update existing developer metadata by metadata ID.",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
spreadsheetId: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "The ID of the spreadsheet"
|
|
11
|
+
},
|
|
12
|
+
metadataId: {
|
|
13
|
+
type: "number",
|
|
14
|
+
description: "The ID of the metadata to update"
|
|
15
|
+
},
|
|
16
|
+
metadataKey: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "The new metadata key (optional)"
|
|
19
|
+
},
|
|
20
|
+
metadataValue: {
|
|
21
|
+
type: "string",
|
|
22
|
+
description: "The new metadata value (optional)"
|
|
23
|
+
},
|
|
24
|
+
visibility: {
|
|
25
|
+
type: "string",
|
|
26
|
+
enum: ["DOCUMENT", "PROJECT"],
|
|
27
|
+
description: "The new visibility (optional)"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
required: ["spreadsheetId", "metadataId"]
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
export async function updateDeveloperMetadata(args) {
|
|
34
|
+
try {
|
|
35
|
+
const sheets = google.sheets("v4");
|
|
36
|
+
const fields = [];
|
|
37
|
+
const developerMetadata = {
|
|
38
|
+
metadataId: args.metadataId,
|
|
39
|
+
};
|
|
40
|
+
if (args.metadataKey !== undefined) {
|
|
41
|
+
developerMetadata.metadataKey = args.metadataKey;
|
|
42
|
+
fields.push("metadataKey");
|
|
43
|
+
}
|
|
44
|
+
if (args.metadataValue !== undefined) {
|
|
45
|
+
developerMetadata.metadataValue = args.metadataValue;
|
|
46
|
+
fields.push("metadataValue");
|
|
47
|
+
}
|
|
48
|
+
if (args.visibility !== undefined) {
|
|
49
|
+
developerMetadata.visibility = args.visibility;
|
|
50
|
+
fields.push("visibility");
|
|
51
|
+
}
|
|
52
|
+
await sheets.spreadsheets.batchUpdate({
|
|
53
|
+
spreadsheetId: args.spreadsheetId,
|
|
54
|
+
requestBody: {
|
|
55
|
+
requests: [
|
|
56
|
+
{
|
|
57
|
+
updateDeveloperMetadata: {
|
|
58
|
+
dataFilters: [
|
|
59
|
+
{
|
|
60
|
+
developerMetadataLookup: {
|
|
61
|
+
metadataId: args.metadataId,
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
],
|
|
65
|
+
developerMetadata,
|
|
66
|
+
fields: fields.join(","),
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
return {
|
|
73
|
+
content: [
|
|
74
|
+
{
|
|
75
|
+
type: "text",
|
|
76
|
+
text: `Successfully updated developer metadata with ID ${args.metadataId}.`,
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
isError: false,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
84
|
+
return {
|
|
85
|
+
content: [
|
|
86
|
+
{
|
|
87
|
+
type: "text",
|
|
88
|
+
text: `Error updating developer metadata: ${errorMessage}`,
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
isError: true,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { google } from 'googleapis';
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_update_dimension_group",
|
|
4
|
+
description: "Update properties of a dimension group (row or column group) such as collapse state or depth.",
|
|
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"
|
|
15
|
+
},
|
|
16
|
+
dimension: {
|
|
17
|
+
type: "string",
|
|
18
|
+
enum: ["ROWS", "COLUMNS"],
|
|
19
|
+
description: "The dimension of the group (ROWS or COLUMNS)"
|
|
20
|
+
},
|
|
21
|
+
startIndex: {
|
|
22
|
+
type: "number",
|
|
23
|
+
description: "The start index of the dimension group (inclusive)"
|
|
24
|
+
},
|
|
25
|
+
endIndex: {
|
|
26
|
+
type: "number",
|
|
27
|
+
description: "The end index of the dimension group (exclusive)"
|
|
28
|
+
},
|
|
29
|
+
collapsed: {
|
|
30
|
+
type: "boolean",
|
|
31
|
+
description: "Whether the group should be collapsed"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
required: ["spreadsheetId", "sheetId", "dimension", "startIndex", "endIndex", "collapsed"]
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
export async function updateDimensionGroup(args) {
|
|
38
|
+
try {
|
|
39
|
+
const sheets = google.sheets("v4");
|
|
40
|
+
await sheets.spreadsheets.batchUpdate({
|
|
41
|
+
spreadsheetId: args.spreadsheetId,
|
|
42
|
+
requestBody: {
|
|
43
|
+
requests: [
|
|
44
|
+
{
|
|
45
|
+
updateDimensionGroup: {
|
|
46
|
+
dimensionGroup: {
|
|
47
|
+
range: {
|
|
48
|
+
sheetId: args.sheetId,
|
|
49
|
+
dimension: args.dimension,
|
|
50
|
+
startIndex: args.startIndex,
|
|
51
|
+
endIndex: args.endIndex,
|
|
52
|
+
},
|
|
53
|
+
collapsed: args.collapsed,
|
|
54
|
+
},
|
|
55
|
+
fields: "collapsed",
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
return {
|
|
62
|
+
content: [
|
|
63
|
+
{
|
|
64
|
+
type: "text",
|
|
65
|
+
text: `Successfully updated ${args.dimension.toLowerCase()} group from index ${args.startIndex} to ${args.endIndex} on sheet ${args.sheetId}. Collapsed: ${args.collapsed}.`,
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
isError: false,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
73
|
+
return {
|
|
74
|
+
content: [
|
|
75
|
+
{
|
|
76
|
+
type: "text",
|
|
77
|
+
text: `Error updating dimension group: ${errorMessage}`,
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
isError: true,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_add_sheet",
|
|
4
|
+
description: "Add a new sheet (tab) to a Google Spreadsheet",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
spreadsheetId: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "The ID of the spreadsheet",
|
|
11
|
+
},
|
|
12
|
+
title: {
|
|
13
|
+
type: "string",
|
|
14
|
+
description: "The name of the new sheet",
|
|
15
|
+
},
|
|
16
|
+
index: {
|
|
17
|
+
type: "number",
|
|
18
|
+
description: "Optional position index (0-based) where the sheet should be inserted",
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
required: ["spreadsheetId", "title"],
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
export async function addSheet(args) {
|
|
25
|
+
try {
|
|
26
|
+
const sheets = google.sheets("v4");
|
|
27
|
+
const request = {
|
|
28
|
+
addSheet: {
|
|
29
|
+
properties: {
|
|
30
|
+
title: args.title,
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
if (args.index !== undefined) {
|
|
35
|
+
request.addSheet.properties.index = args.index;
|
|
36
|
+
}
|
|
37
|
+
const response = await sheets.spreadsheets.batchUpdate({
|
|
38
|
+
spreadsheetId: args.spreadsheetId,
|
|
39
|
+
requestBody: {
|
|
40
|
+
requests: [request],
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
const addedSheet = response.data.replies?.[0]?.addSheet?.properties;
|
|
44
|
+
return {
|
|
45
|
+
content: [
|
|
46
|
+
{
|
|
47
|
+
type: "text",
|
|
48
|
+
text: `Successfully added sheet "${addedSheet?.title}" (ID: ${addedSheet?.sheetId}, Index: ${addedSheet?.index})`,
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
isError: false,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
return {
|
|
56
|
+
content: [
|
|
57
|
+
{
|
|
58
|
+
type: "text",
|
|
59
|
+
text: `Error adding sheet: ${error.message}`,
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
isError: true,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_copy_sheet",
|
|
4
|
+
description: "Copy a sheet to another spreadsheet or within the same spreadsheet",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
sourceSpreadsheetId: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "The ID of the source spreadsheet",
|
|
11
|
+
},
|
|
12
|
+
sourceSheetId: {
|
|
13
|
+
type: "number",
|
|
14
|
+
description: "The ID of the sheet to copy",
|
|
15
|
+
},
|
|
16
|
+
destinationSpreadsheetId: {
|
|
17
|
+
type: "string",
|
|
18
|
+
description: "The ID of the destination spreadsheet",
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
required: ["sourceSpreadsheetId", "sourceSheetId", "destinationSpreadsheetId"],
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
export async function copySheet(args) {
|
|
25
|
+
const sheets = google.sheets("v4");
|
|
26
|
+
try {
|
|
27
|
+
const response = await sheets.spreadsheets.sheets.copyTo({
|
|
28
|
+
spreadsheetId: args.sourceSpreadsheetId,
|
|
29
|
+
sheetId: args.sourceSheetId,
|
|
30
|
+
requestBody: {
|
|
31
|
+
destinationSpreadsheetId: args.destinationSpreadsheetId,
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
const copiedSheet = response.data;
|
|
35
|
+
return {
|
|
36
|
+
content: [
|
|
37
|
+
{
|
|
38
|
+
type: "text",
|
|
39
|
+
text: `Successfully copied sheet to destination. New sheet ID: ${copiedSheet.sheetId}, Title: "${copiedSheet.title}"`,
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
isError: false,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
return {
|
|
47
|
+
content: [
|
|
48
|
+
{
|
|
49
|
+
type: "text",
|
|
50
|
+
text: `Error copying sheet: ${error.message}`,
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
isError: true,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
export const schema = {
|
|
3
|
+
name: "gsheets_copy_to",
|
|
4
|
+
description: "Copy data from one range to another range using cut/paste",
|
|
5
|
+
inputSchema: {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
spreadsheetId: {
|
|
9
|
+
type: "string",
|
|
10
|
+
description: "The ID of the spreadsheet",
|
|
11
|
+
},
|
|
12
|
+
sourceSheetId: {
|
|
13
|
+
type: "number",
|
|
14
|
+
description: "The ID of the source sheet",
|
|
15
|
+
},
|
|
16
|
+
sourceStartRow: {
|
|
17
|
+
type: "number",
|
|
18
|
+
description: "Source starting row index (0-based)",
|
|
19
|
+
},
|
|
20
|
+
sourceStartColumn: {
|
|
21
|
+
type: "number",
|
|
22
|
+
description: "Source starting column index (0-based)",
|
|
23
|
+
},
|
|
24
|
+
sourceEndRow: {
|
|
25
|
+
type: "number",
|
|
26
|
+
description: "Source ending row index (exclusive, 0-based)",
|
|
27
|
+
},
|
|
28
|
+
sourceEndColumn: {
|
|
29
|
+
type: "number",
|
|
30
|
+
description: "Source ending column index (exclusive, 0-based)",
|
|
31
|
+
},
|
|
32
|
+
destinationSheetId: {
|
|
33
|
+
type: "number",
|
|
34
|
+
description: "The ID of the destination sheet",
|
|
35
|
+
},
|
|
36
|
+
destinationStartRow: {
|
|
37
|
+
type: "number",
|
|
38
|
+
description: "Destination starting row index (0-based)",
|
|
39
|
+
},
|
|
40
|
+
destinationStartColumn: {
|
|
41
|
+
type: "number",
|
|
42
|
+
description: "Destination starting column index (0-based)",
|
|
43
|
+
},
|
|
44
|
+
pasteType: {
|
|
45
|
+
type: "string",
|
|
46
|
+
enum: ["NORMAL", "VALUES", "FORMAT", "FORMULA"],
|
|
47
|
+
description: "What to paste (default: NORMAL - all data)",
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
required: [
|
|
51
|
+
"spreadsheetId",
|
|
52
|
+
"sourceSheetId",
|
|
53
|
+
"sourceStartRow",
|
|
54
|
+
"sourceStartColumn",
|
|
55
|
+
"sourceEndRow",
|
|
56
|
+
"sourceEndColumn",
|
|
57
|
+
"destinationSheetId",
|
|
58
|
+
"destinationStartRow",
|
|
59
|
+
"destinationStartColumn",
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
export async function copyTo(args) {
|
|
64
|
+
const sheets = google.sheets("v4");
|
|
65
|
+
try {
|
|
66
|
+
await sheets.spreadsheets.batchUpdate({
|
|
67
|
+
spreadsheetId: args.spreadsheetId,
|
|
68
|
+
requestBody: {
|
|
69
|
+
requests: [
|
|
70
|
+
{
|
|
71
|
+
copyPaste: {
|
|
72
|
+
source: {
|
|
73
|
+
sheetId: args.sourceSheetId,
|
|
74
|
+
startRowIndex: args.sourceStartRow,
|
|
75
|
+
endRowIndex: args.sourceEndRow,
|
|
76
|
+
startColumnIndex: args.sourceStartColumn,
|
|
77
|
+
endColumnIndex: args.sourceEndColumn,
|
|
78
|
+
},
|
|
79
|
+
destination: {
|
|
80
|
+
sheetId: args.destinationSheetId,
|
|
81
|
+
startRowIndex: args.destinationStartRow,
|
|
82
|
+
startColumnIndex: args.destinationStartColumn,
|
|
83
|
+
},
|
|
84
|
+
pasteType: args.pasteType || "NORMAL",
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
const sourceRange = `R${args.sourceStartRow}C${args.sourceStartColumn}:R${args.sourceEndRow - 1}C${args.sourceEndColumn - 1}`;
|
|
91
|
+
const destRange = `R${args.destinationStartRow}C${args.destinationStartColumn}`;
|
|
92
|
+
return {
|
|
93
|
+
content: [
|
|
94
|
+
{
|
|
95
|
+
type: "text",
|
|
96
|
+
text: `Successfully copied data from sheet ${args.sourceSheetId} (${sourceRange}) to sheet ${args.destinationSheetId} (${destRange})`,
|
|
97
|
+
},
|
|
98
|
+
],
|
|
99
|
+
isError: false,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
return {
|
|
104
|
+
content: [
|
|
105
|
+
{
|
|
106
|
+
type: "text",
|
|
107
|
+
text: `Error copying data: ${error.message}`,
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
isError: true,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|