- Add native config option: `new Brainy({ integrations: true })`
- OData integration for Excel Power Query and Power BI
- Google Sheets integration with Apps Script
- Server-Sent Events (SSE) for real-time streaming
- Webhooks for push notifications
- Zero-config with sensible defaults
- Full tree-shaking when disabled
142 lines
3.3 KiB
Markdown
142 lines
3.3 KiB
Markdown
# Brainy Google Sheets Add-on
|
|
|
|
Two-way sync between Brainy and Google Sheets.
|
|
|
|
## Quick Setup
|
|
|
|
1. Open your Google Sheet
|
|
2. Go to **Extensions → Apps Script**
|
|
3. Delete any existing code
|
|
4. Copy and paste `Code.gs` into the editor
|
|
5. Create a new HTML file called `Sidebar.html` and paste the content
|
|
6. Go to **Project Settings** (gear icon) → **Script properties**
|
|
7. Add property: `BRAINY_URL` = your Brainy server URL (e.g., `http://localhost:3000`)
|
|
8. Save and refresh your spreadsheet
|
|
|
|
## Custom Functions
|
|
|
|
Use these directly in cells:
|
|
|
|
### `=BRAINY_QUERY(query, limit)`
|
|
Query entities using semantic search or type filter.
|
|
|
|
```
|
|
=BRAINY_QUERY("machine learning", 10)
|
|
=BRAINY_QUERY("type:person", 100)
|
|
```
|
|
|
|
### `=BRAINY_GET(id)`
|
|
Get a single entity by ID.
|
|
|
|
```
|
|
=BRAINY_GET("entity-uuid-here")
|
|
```
|
|
|
|
### `=BRAINY_SIMILAR(text, limit)`
|
|
Find semantically similar entities.
|
|
|
|
```
|
|
=BRAINY_SIMILAR("artificial intelligence research", 5)
|
|
```
|
|
|
|
### `=BRAINY_RELATIONS(entityId, direction)`
|
|
Get relationships for an entity.
|
|
|
|
```
|
|
=BRAINY_RELATIONS("entity-id", "from")
|
|
=BRAINY_RELATIONS("entity-id", "to")
|
|
=BRAINY_RELATIONS("entity-id", "both")
|
|
```
|
|
|
|
### `=BRAINY_TYPES()`
|
|
List all available entity types.
|
|
|
|
### `=BRAINY_RELATION_TYPES()`
|
|
List all available relationship types.
|
|
|
|
## Sidebar
|
|
|
|
Open via **Brainy → Open Sidebar** menu:
|
|
|
|
- **Search**: Query entities and insert results into the sheet
|
|
- **Add**: Create new entities with a form
|
|
- **Sync**: Sync selected range to Brainy (add or update)
|
|
|
|
## Authentication
|
|
|
|
If your Brainy server requires authentication:
|
|
|
|
1. Go to **Project Settings → Script properties**
|
|
2. Add property: `BRAINY_API_KEY` = your API key
|
|
|
|
## Real-Time Sync
|
|
|
|
For real-time updates, enable SSE in your Brainy server:
|
|
|
|
```javascript
|
|
brain.augmentations.register(new SSEIntegration())
|
|
```
|
|
|
|
The sidebar will automatically show changes as they happen.
|
|
|
|
## Troubleshooting
|
|
|
|
### "Brainy URL not configured"
|
|
Add the `BRAINY_URL` script property in Apps Script settings.
|
|
|
|
### "Connection failed"
|
|
- Check that your Brainy server is running
|
|
- Ensure the URL is correct (include port if needed)
|
|
- For local development, use ngrok or similar to expose localhost
|
|
|
|
### Custom functions not appearing
|
|
- Refresh the spreadsheet
|
|
- Wait a few seconds (Apps Script can be slow to register)
|
|
- Check the Apps Script execution log for errors
|
|
|
|
## Server Setup
|
|
|
|
The simplest way to enable all integrations:
|
|
|
|
```javascript
|
|
import { Brainy } from '@soulcraft/brainy'
|
|
|
|
const brain = new Brainy({ integrations: true })
|
|
await brain.init()
|
|
|
|
console.log(brain.hub.endpoints)
|
|
// { odata: '/odata', sheets: '/sheets', sse: '/events', webhooks: '/webhooks' }
|
|
```
|
|
|
|
With Express:
|
|
|
|
```javascript
|
|
import express from 'express'
|
|
import { Brainy } from '@soulcraft/brainy'
|
|
|
|
const app = express()
|
|
const brain = new Brainy({ integrations: true })
|
|
await brain.init()
|
|
|
|
// Route all integration requests
|
|
app.use(express.json())
|
|
app.all(['/odata/*', '/sheets/*', '/events/*'], async (req, res) => {
|
|
const response = await brain.hub.handleRequest({
|
|
method: req.method,
|
|
path: req.path,
|
|
query: req.query,
|
|
headers: req.headers,
|
|
body: req.body
|
|
})
|
|
|
|
if (response.isSSE) {
|
|
// Handle SSE stream
|
|
res.setHeader('Content-Type', 'text/event-stream')
|
|
// ... streaming logic
|
|
} else {
|
|
res.status(response.status).set(response.headers).json(response.body)
|
|
}
|
|
})
|
|
|
|
app.listen(3000)
|
|
```
|