Swadloon is a Google Apps Script application that creates a seamless integration between Google Forms (used for bug reporting) and Plane.so (project management tool). This integration streamlines the bug reporting process by automatically creating intake issues in Plane.so when a form is submitted, and updating the status in Google Sheets when the issue status changes in Plane.so.
- Automated Issue Creation: Converts Google Form submissions into Plane.so intake issues
- Bidirectional Status Updates: Updates Google Sheets when issue status changes in Plane.so
- Webhook Integration: Listens for Plane.so status updates via webhooks
- Email Notifications: Optional email notifications for status changes
- Secure Authentication: Validates webhook requests using a secret token
- Google Workspace account with access to:
- Google Forms
- Google Sheets
- Google Apps Script
- Plane.so account with API access
- Basic knowledge of TypeScript and Google Apps Script
-
Clone this repository:
git clone https://github.com/softnetics/swadloon.git cd swadloon -
Install dependencies:
pnpm install
-
Set up your Google Form with the following fields:
- Title
- Description
- Env (Environment)
- Step to reproduce
- Expected Behavior
- Actual Behavior
- Severity
- Additional Images/Videos
Example Form: Bug Report Form
-
Create a Google Sheet to store form responses
Example Sheet: Response Sheet
-
Set up Script Properties in Google Apps Script:
- PLANE_API_URL: https://api.plane.so/
- API_KEY: Your Plane.so API key
- WORKSPACE_SLUG: Your Plane.so workspace slug
- PROJECT_ID: Your Plane.so project ID
- RECIPIENT_EMAIL: Email for notifications (optional)
- WEBHOOK_SECRET: Secret for webhook authentication
- SHEET_ID: ID of your Google Sheet
-
Build the project:
pnpm build
-
Set up
.clasp.jsonfor your Google Apps Script project:{ "scriptId": "your-app-script-id", "rootDir": "dist" } -
Push to Google Apps Script:
pnpm push
-
Set up a webhook in Plane.so pointing to your deployed Apps Script URL
- User submits a bug report via Google Form
- Form trigger executes
onFormSubmitfunction - Bug data is transformed and sent to Plane.so as an intake issue
- Initial status "Reported" is set in Google Sheets
- When issue status changes in Plane.so, a webhook is triggered
- Webhook updates the corresponding issue status in Google Sheets
swadloon/
├── src/
│ ├── index.ts # Main entry point with webhook handlers
│ ├── env.ts # Environment configuration
│ └── utils/
│ ├── form.ts # Google Sheets interaction
│ ├── plane.ts # Plane.so API interaction
│ └── email.ts # Email notification helpers
├── dist/ # Build output (Apps Script code)
├── rollup.config.mjs # Rollup configuration
└── tsconfig.json # TypeScript configuration
This project includes reference examples for implementation:
An example bug report form is available at https://forms.gle/SQq8gbBzAkGGV47P9.
This form includes all the necessary fields that are processed by the integration:
- Title of the bug
- Description
- Environment details
- Steps to reproduce
- Expected behavior
- Actual behavior
- Severity ranking
- File uploads for visual evidence
The corresponding response sheet can be viewed at https://docs.google.com/spreadsheets/d/1jDoXc1K1YRM7_KLPcSl-9PZbEo5dlHPg7mnSd0tt-p0/edit?usp=sharing.
This sheet demonstrates:
- How form responses are structured
- Where the status column is added
- How the integration updates the status based on Plane.so changes
pnpm clean: Clean build outputspnpm lint: Run code lintingpnpm build: Build the projectpnpm push: Build and push to Apps Scriptpnpm push:prod: Build and push to production
- Create a test Google Form and Sheet
- Follow the installation steps above
- Use the
.clasp-dev.jsonfor development deployments
In the Google Apps Script editor, set the following script properties (File > Project Settings > Script Properties):
| Property | Description |
|---|---|
| PLANE_API_URL | Base URL for Plane.so API |
| API_KEY | Your Plane.so API key |
| WORKSPACE_SLUG | Your workspace slug in Plane.so |
| PROJECT_ID | The project ID in Plane.so |
| RECIPIENT_EMAIL | Email address for notifications |
| WEBHOOK_SECRET | Secret token for webhook authentication |
| SHEET_ID | ID of the Google Sheet with form responses |
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request