← 返回 Skills 市场
byungkyu

Google Apps Script

作者 byungkyu · GitHub ↗ · v1.0.0 · MIT-0
cross-platform ✓ 安全检测通过
43
总下载
0
收藏
0
当前安装
1
版本数
在 OpenClaw 中安装
/install google-apps-script
功能描述
Google Apps Script API integration with managed OAuth. Manage Apps Script projects, deployments, versions, and execute script functions. Use this skill when...
使用说明 (SKILL.md)

Google Apps Script

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.

Quick Start

# Create a new Apps Script project
python \x3C\x3C'EOF'
import urllib.request, os, json
data = json.dumps({"title": "My Script"}).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))
EOF

Base URL

https://api.maton.ai/google-apps-script/{native-api-path}

Maton proxies requests to script.googleapis.com and automatically injects your OAuth token.

Authentication

All requests require the Maton API key in the Authorization header:

Authorization: Bearer $MATON_API_KEY

Environment Variable: Set your API key as MATON_API_KEY:

export MATON_API_KEY="YOUR_API_KEY"

Getting Your API Key

  1. Sign in or create an account at maton.ai
  2. Go to maton.ai/settings
  3. Copy your API key

Connection Management

Manage your Google Apps Script OAuth connections at https://api.maton.ai.

List Connections

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=google-apps-script&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Create Connection

python \x3C\x3C'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'google-apps-script'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', 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))
EOF

Get Connection

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Response:

{
  "connection": {
    "connection_id": "{connection_id}",
    "status": "ACTIVE",
    "creation_time": "2025-12-08T07:20:53.488460Z",
    "last_updated_time": "2026-01-31T20:03:32.593153Z",
    "url": "https://connect.maton.ai/?session_token=...",
    "app": "google-apps-script",
    "metadata": {}
  }
}

Open the returned url in a browser to complete OAuth authorization.

Delete Connection

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Specifying Connection

If you have multiple Google Apps Script connections, specify which one to use with the Maton-Connection header:

python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/google-apps-script/v1/processes')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

If you have multiple connections, always include this header to ensure requests go to the intended account.

Security & Permissions

  • Access is scoped to the Apps Script projects owned by or shared with the connected Google account.
  • All write operations require explicit user approval. Before creating projects, updating content, creating deployments, or executing functions, confirm the target and intended effect with the user.
  • Script execution (scripts.run) can have side effects. Always confirm with the user before running any script function.

API Reference

Projects

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 \x3C\x3C'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))
EOF

Response:

{
  "scriptId": "1e20iskkpOG79nb9sZz53XX6GmqEWwiLFd4GPoGsUL67N0lJXEu1FJud0",
  "title": "Analytics Helper",
  "createTime": "2026-05-05T09:28:57.482Z",
  "updateTime": "2026-05-05T09:28:57.482Z",
  "creator": {
    "email": "[email protected]",
    "name": "User"
  },
  "lastModifyUser": {
    "email": "[email protected]",
    "name": "User"
  }
}

Get Project

GET /google-apps-script/v1/projects/{scriptId}

Get Project Content

GET /google-apps-script/v1/projects/{scriptId}/content

Optional 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() {\
  return 'Hello';\
}",
      "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() {\
  Logger.log('Hello');\
  return 'Hello';\
}"
    }
  ]
}

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 \x3C\x3C'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() {\
  var sheet = SpreadsheetApp.getActiveSheet();\
  return sheet.getDataRange().getValues();\
}"
        }
    ]
}).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))
EOF

Get Project Metrics

GET /google-apps-script/v1/projects/{scriptId}/metrics?metricsGranularity=DAILY

Required 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"}
  ]
}

Versions

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}/versions

Optional 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}

Deployments

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}/deployments

Optional 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}

Processes

List User Processes

GET /google-apps-script/v1/processes

Optional 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}

Scripts

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".

Pagination

All list endpoints use token-based pagination:

GET /google-apps-script/v1/processes?pageSize=10&pageToken={nextPageToken}

Response includes nextPageToken when more results exist:

{
  "processes": [...],
  "nextPageToken": "Cg5iDAjLpuHPBhDQ1KO6Ag=="
}

Code Examples

JavaScript

const response = await fetch(
  'https://api.maton.ai/google-apps-script/v1/projects',
  {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${process.env.MATON_API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ title: 'My Script' })
  }
);
const project = await response.json();
console.log(project.scriptId);

Python

import os
import requests

# Create a project
project = requests.post(
    'https://api.maton.ai/google-apps-script/v1/projects',
    headers={
        'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
        'Content-Type': 'application/json'
    },
    json={'title': 'My Script'}
).json()

# Update its content
requests.put(
    f'https://api.maton.ai/google-apps-script/v1/projects/{project["scriptId"]}/content',
    headers={
        'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}',
        'Content-Type': 'application/json'
    },
    json={
        'files': [
            {
                'name': 'appsscript',
                'type': 'JSON',
                'source': '{"timeZone":"America/New_York","dependencies":{},"exceptionLogging":"STACKDRIVER","runtimeVersion":"V8"}'
            },
            {
                'name': 'Code',
                'type': 'SERVER_JS',
                'source': 'function hello() { return "Hello World"; }'
            }
        ]
    }
)

Notes

  • The scriptId is the Drive file ID of the Apps Script project
  • updateContent replaces ALL files; always include the appsscript manifest file
  • Versions are immutable snapshots; create a new version before deploying
  • The scripts.run endpoint requires an "API Executable" deployment configured in the Apps Script editor
  • devMode: true in scripts.run executes the latest saved HEAD code (owner only)
  • Only primitive types (string, number, boolean, array, object) can be passed as parameters to scripts.run
  • Metrics require the metricsGranularity query parameter (DAILY or WEEKLY)
  • Bound scripts (attached to Sheets/Docs/Forms) need the parent file's Drive ID as parentId during creation
  • IMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing
  • IMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments

Error Handling

Status Meaning
400 Bad request (invalid argument, missing required fields)
401 Invalid or missing Maton API key
403 Forbidden (insufficient permissions for the script)
404 Script project or deployment not found
409 Conflict (concurrent edit)
429 Rate limited
4xx/5xx Passthrough error from Apps Script API

Troubleshooting: API Key Issues

  1. Check that the MATON_API_KEY environment variable is set:
echo $MATON_API_KEY
  1. Verify the API key is valid by listing connections:
python \x3C\x3C'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF

Troubleshooting: Invalid App Name

  1. Ensure your URL path starts with google-apps-script. For example:
  • Correct: https://api.maton.ai/google-apps-script/v1/projects
  • Incorrect: https://api.maton.ai/v1/projects

Resources

安全使用建议
Before installing, make sure you trust Maton with Google Apps Script API access, store MATON_API_KEY securely, verify which Google account is connected, and require explicit confirmation before creating, updating, deploying, or running any script.
功能分析
Type: OpenClaw Skill Name: google-apps-script Version: 1.0.0 The skill provides a legitimate integration for managing Google Apps Script projects via the api.maton.ai proxy. It includes explicit safety instructions in SKILL.md for the AI agent to seek user approval for write operations and script execution. No malicious patterns, obfuscation, or data exfiltration attempts were found in the code examples or documentation.
能力标签
requires-oauth-tokenrequires-sensitive-credentials
能力评估
Purpose & Capability
The stated purpose matches the documented capabilities: creating and managing Apps Script projects, deployments, versions, and remote script execution. These are high-impact actions, but they are clearly disclosed.
Instruction Scope
The skill explicitly says write operations and scripts.run require user approval, which is appropriate for the capability. Users should ensure the agent follows that per-action confirmation.
Install Mechanism
There is no install spec and no code files; the artifact is instruction-only with example Python HTTP requests. No automatic installation or hidden executable behavior is shown.
Credentials
The MATON_API_KEY and network access to api.maton.ai are proportionate for managed OAuth, but they are sensitive because they authorize access through a connected Google account.
Persistence & Privilege
The skill documents persistent Maton OAuth connections and includes list/create/delete flows. This is expected, but users should manage and revoke unused connections.
如何使用
  1. 确保已安装 OpenClaw(本地或 Docker 部署)
  2. 在对话框中输入安装命令:/install google-apps-script
  3. 安装完成后,直接呼叫该 Skill 的名称或使用 /google-apps-script 触发
  4. 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
版本历史
v1.0.0
Initial release of Google Apps Script skill - Allows users to manage Google Apps Script projects via Maton API with managed OAuth. - Supports creating, updating, and retrieving Apps Script projects, files, and deployments. - Enables remote script function execution and monitoring of script processes. - Includes examples for establishing and managing secure OAuth connections. - Requires a valid Maton API key and internet access.
元数据
Slug google-apps-script
版本 1.0.0
许可证 MIT-0
累计安装 0
当前安装数 0
历史版本数 1
常见问题

Google Apps Script 是什么?

Google Apps Script API integration with managed OAuth. Manage Apps Script projects, deployments, versions, and execute script functions. Use this skill when... 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 43 次。

如何安装 Google Apps Script?

在 OpenClaw 或 Claude Code 对话框中运行命令「/install google-apps-script」即可一键安装,无需额外配置。

Google Apps Script 是免费的吗?

是的,Google Apps Script 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。

Google Apps Script 支持哪些平台?

Google Apps Script 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。

谁开发了 Google Apps Script?

由 byungkyu(@byungkyu)开发并维护,当前版本 v1.0.0。

💬 留言讨论