Access the Google Apps Script API with managed OAuth authentication. Create and manage Apps Script projects, update script content, manage deployments and versions, execute functions remotely, and monitor script processes.
Reference
Create Project
POST /google-apps-script/v1/projects
Content-Type: application/json
{
"title": "My Script Project",
"parentId": "{optional_drive_file_id}"
}Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Project name |
parentId | string | No | Drive ID of parent file (Sheet, Doc, Form, Slides). Omit for standalone projects |
Example:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({"title": "Analytics Helper"}).encode()
req = urllib.request.Request('https://api.maton.ai/google-apps-script/v1/projects', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFResponse:
{
"scriptId": "1e20iskkpOG79nb9sZz53XX6GmqEWwiLFd4GPoGsUL67N0lJXEu1FJud0",
"title": "Analytics Helper",
"createTime": "2026-05-05T09:28:57.482Z",
"updateTime": "2026-05-05T09:28:57.482Z",
"creator": {
"email": "user@example.com",
"name": "User"
},
"lastModifyUser": {
"email": "user@example.com",
"name": "User"
}
}Get Project
GET /google-apps-script/v1/projects/{scriptId}Get Project Content
GET /google-apps-script/v1/projects/{scriptId}/contentOptional Query Parameters:
| Parameter | Type | Description |
|---|---|---|
versionNumber | integer | Version to retrieve; omit for HEAD (latest) |
Response:
{
"scriptId": "...",
"files": [
{
"name": "appsscript",
"type": "JSON",
"source": "{\"timeZone\":\"America/New_York\",\"dependencies\":{},\"exceptionLogging\":\"STACKDRIVER\",\"runtimeVersion\":\"V8\"}",
"createTime": "2026-05-05T09:28:57.482Z",
"updateTime": "2026-05-05T09:28:57.482Z",
"functionSet": {}
},
{
"name": "Code",
"type": "SERVER_JS",
"source": "function myFunction() {\n return 'Hello';\n}",
"functionSet": {
"values": [{"name": "myFunction"}]
}
}
]
}Update Project Content
PUT /google-apps-script/v1/projects/{scriptId}/content
Content-Type: application/json
{
"files": [
{
"name": "appsscript",
"type": "JSON",
"source": "{\"timeZone\":\"America/New_York\",\"dependencies\":{},\"exceptionLogging\":\"STACKDRIVER\",\"runtimeVersion\":\"V8\"}"
},
{
"name": "Code",
"type": "SERVER_JS",
"source": "function myFunction() {\n Logger.log('Hello');\n return 'Hello';\n}"
}
]
}File types: SERVER_JS (script code), HTML (HTML files), JSON (manifest only)
Important: This replaces ALL files in the project. Always include the appsscript manifest file.
Example:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"files": [
{
"name": "appsscript",
"type": "JSON",
"source": json.dumps({
"timeZone": "America/New_York",
"dependencies": {},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8"
})
},
{
"name": "Code",
"type": "SERVER_JS",
"source": "function getData() {\n var sheet = SpreadsheetApp.getActiveSheet();\n return sheet.getDataRange().getValues();\n}"
}
]
}).encode()
req = urllib.request.Request('https://api.maton.ai/google-apps-script/v1/projects/{scriptId}/content', data=data, method='PUT')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOFGet Project Metrics
GET /google-apps-script/v1/projects/{scriptId}/metrics?metricsGranularity=DAILYRequired Query Parameters:
| Parameter | Type | Description |
|---|---|---|
metricsGranularity | string | DAILY or WEEKLY |
Response:
{
"activeUsers": [
{"startTime": "2026-05-04T00:00:00Z", "endTime": "2026-05-05T00:00:00Z"}
],
"totalExecutions": [
{"startTime": "2026-05-04T00:00:00Z", "endTime": "2026-05-05T00:00:00Z"}
],
"failedExecutions": [
{"startTime": "2026-05-04T00:00:00Z", "endTime": "2026-05-05T00:00:00Z"}
]
}Create Version
POST /google-apps-script/v1/projects/{scriptId}/versions
Content-Type: application/json
{
"description": "Release v1.0"
}Response:
{
"scriptId": "...",
"versionNumber": 1,
"description": "Release v1.0",
"createTime": "2026-05-05T09:29:20.755Z"
}List Versions
GET /google-apps-script/v1/projects/{scriptId}/versionsOptional Parameters:
| Parameter | Type | Description |
|---|---|---|
pageSize | integer | Max results per page |
pageToken | string | Token for next page |
Response:
{
"versions": [
{
"scriptId": "...",
"versionNumber": 1,
"description": "Release v1.0",
"createTime": "2026-05-05T09:29:20.755Z"
}
],
"nextPageToken": "..."
}Get Version
GET /google-apps-script/v1/projects/{scriptId}/versions/{versionNumber}Create Deployment
POST /google-apps-script/v1/projects/{scriptId}/deployments
Content-Type: application/json
{
"versionNumber": 1,
"description": "Production deployment",
"manifestFileName": "appsscript"
}Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
versionNumber | integer | No | Version to deploy |
description | string | No | Deployment description |
manifestFileName | string | No | Manifest file name (default: appsscript) |
Response:
{
"deploymentId": "AKfycbwcP87Ic2d91w3RqGX73ulArxNtrsJBUScaGZrPe45GztKsUo7b-CPHFr3aEmG9gIJxyg",
"deploymentConfig": {
"scriptId": "...",
"versionNumber": 1,
"manifestFileName": "appsscript",
"description": "Production deployment"
},
"updateTime": "2026-05-05T09:29:37.688Z"
}List Deployments
GET /google-apps-script/v1/projects/{scriptId}/deploymentsOptional Parameters:
| Parameter | Type | Description |
|---|---|---|
pageSize | integer | Max results per page |
pageToken | string | Token for next page |
Get Deployment
GET /google-apps-script/v1/projects/{scriptId}/deployments/{deploymentId}Update Deployment
PUT /google-apps-script/v1/projects/{scriptId}/deployments/{deploymentId}
Content-Type: application/json
{
"deploymentConfig": {
"scriptId": "{scriptId}",
"versionNumber": 2,
"manifestFileName": "appsscript",
"description": "Updated to v2"
}
}Delete Deployment
DELETE /google-apps-script/v1/projects/{scriptId}/deployments/{deploymentId}List User Processes
GET /google-apps-script/v1/processesOptional Parameters:
| Parameter | Type | Description |
|---|---|---|
pageSize | integer | Max results per page (default: 50) |
pageToken | string | Token for next page |
Response:
{
"processes": [
{
"projectName": "My Script",
"functionName": "myFunction",
"processType": "TIME_DRIVEN",
"processStatus": "COMPLETED",
"userAccessLevel": "READ",
"startTime": "2026-05-05T09:05:31.422Z",
"duration": "4.533s",
"runtimeVersion": "V8"
}
],
"nextPageToken": "..."
}Process types: TIME_DRIVEN, EDITOR, SIMPLE_TRIGGER, INSTALLABLE_TRIGGER, WEBAPP, EXECUTION_API, ADD_ON, BATCH_TASK
Process statuses: COMPLETED, FAILED, TIMED_OUT, UNKNOWN, DELAYED, RUNNING, CANCELED
List Script Processes
GET /google-apps-script/v1/processes:listScriptProcesses?scriptId={scriptId}Run Function
POST /google-apps-script/v1/scripts/{scriptId}:run
Content-Type: application/json
{
"function": "myFunction",
"parameters": ["arg1", 42],
"devMode": false
}Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
function | string | Yes | Function name to execute |
parameters | array | No | Function arguments (primitives only) |
devMode | boolean | No | If true, runs latest saved code instead of deployed version |
Response:
{
"done": true,
"response": {
"@type": "type.googleapis.com/google.apps.script.v1.ExecutionResponse",
"result": "Hello World"
}
}Note: Requires an "API Executable" deployment. The script must be deployed via Apps Script editor with "Deploy > New deployment > API Executable".