Add buttons to run your Roll20 character's macros and sync its attributes on Google Sheets. Works with virtually any TTRPG system!
Atom20 Extension
This chrome extension adds buttons to your character sheet on Google Sheets, so you can roll macros and track your character's attributes in Roll20! This lets you play virtually any TTRPG system!
GLOSSARY
-Macros: a pre-determined text, which Atom20 will post to the Roll20 chat when you click a button on Google Sheets.
-Attributes: these are a set of values (a current value and a max value), identified by a name such as \"hp\", which can then be displayed on a token in Roll20.
SETUP
Atom20 does not do anything unless you A) have both Roll20 and Google Sheets open, and B) the Google Sheets spreadsheet has a sheet named \"Atom20\" in it.
This special sheet is used to tell the extension where to find your character's attributes, and which macros to set up on the sheet.
A working example can be found here: https://docs.google.com/spreadsheets/d/1lqRLrOac2209-_Yt1RwX2X4cwTO17hgfjYKZNIwn4Xk/edit?usp=sharing
Start by copy-pasting the sheet named \"Atom20\" onto your own spreadsheet. Note that if the configuration sheet is hidden, the extension stops working until it is visible again.
1) Setting up which sheet to watch
At the top of the \"Atom20\" sheet, you will find two cells: \"character sheet name\" and \"character name\".
The \"character sheet name\" cell tells the extension which sheets to watch. If you are currently on a sheet which is not being watched, the extension does not do anything. The extension cannot watch the sheet named \"Atom20\".
The \"character name\" cell tells the extension what name your character has on Roll20: this is the character whose attributes will be updated by the extension.
1b) Setting up more than one sheet to watch
If you wish for Atom20 to watch more than one sheet, for example if you intend to use the extension to build a bestiary with the stat blocks of many different types of enemies, you can use keywords in the \"character sheet name\" & \"character name\" cells:
In \"character sheet name\", you can whitelist or blacklist certain sheets, by using the keywords \"include\" or \"exclude\", followed by a colon, and then followed by the list of sheets which must be included or excluded from the watch, separated by commas. For example: \"excludes:Index\" will watch every sheet except the ones named \"Index\" and \"Atom20\".
In \"character name\", you can input a single asterisk (\"*\") in place of the character's name. If you do, the extension will look for a character on Roll20 whose name is the same as the name of the sheet that you are on at the moment.
2) Setting up attributes
The attributes table on the left tells the extension which cells to watch. Any change made in the cells will be reflected in your character's sheet on Roll20.
Note 1: the character sheet on Roll20 must have the attributes declared, or they cannot be updated.
Note 2: changes only go one way, and updating an attribute on Roll20 will not be reflected on Google Sheets.
3) Setting up macros
The macros table on the right tells the extension where to put buttons in your character sheet. If you click a cell which has been declared to be a macro, the corresponding text will be posted on Roll20's chat.
Note: if you set up Atom20 watch more than one sheet, you might want part of the macro's text to be set up on the watched sheet itself rather than on the \"Atom20\" sheet. This is possible through the use of string templates. For example, if a macro's text is \"Hello, ${F12}\", and the sheet being watched has \"World\" in cell F12, then the macro will post \"Hello, World\" on Roll20.
EXAMPLES
Below, you can find example use-cases for Atom20:
-Character sheet: https://docs.google.com/spreadsheets/d/1lqRLrOac2209-_Yt1RwX2X4cwTO17hgfjYKZNIwn4Xk/edit#gid=0
-Bestiary: https://docs.google.com/spreadsheets/d/1ARw_AZhM7qhN416YJpM3pCX5uUPS3CqWqS1RTu-AWfY/edit?usp=sharing
To use those examples, go to \"File\" => \"Make a Copy\". You will not be granted edit permission on the public-facing files.
VERSION 1.2
In this new version, any character sheet app can now plug into the Atom20 extension.
While you have a roll20 tab open, every other tab will get an Atom20 global variable. Using this, other TTRPG app developers can ensure their app can send messages on roll20 easily.
You're an app developer and want to add an Atom20 integration to your website? Simply copy-paste this file into your project to get started: https://github.com/Trekiros/Atom20/blob/main/atom20.d.ts
Read more
GLOSSARY
-Macros: a pre-determined text, which Atom20 will post to the Roll20 chat when you click a button on Google Sheets.
-Attributes: these are a set of values (a current value and a max value), identified by a name such as \"hp\", which can then be displayed on a token in Roll20.
SETUP
Atom20 does not do anything unless you A) have both Roll20 and Google Sheets open, and B) the Google Sheets spreadsheet has a sheet named \"Atom20\" in it.
This special sheet is used to tell the extension where to find your character's attributes, and which macros to set up on the sheet.
A working example can be found here: https://docs.google.com/spreadsheets/d/1lqRLrOac2209-_Yt1RwX2X4cwTO17hgfjYKZNIwn4Xk/edit?usp=sharing
Start by copy-pasting the sheet named \"Atom20\" onto your own spreadsheet. Note that if the configuration sheet is hidden, the extension stops working until it is visible again.
1) Setting up which sheet to watch
At the top of the \"Atom20\" sheet, you will find two cells: \"character sheet name\" and \"character name\".
The \"character sheet name\" cell tells the extension which sheets to watch. If you are currently on a sheet which is not being watched, the extension does not do anything. The extension cannot watch the sheet named \"Atom20\".
The \"character name\" cell tells the extension what name your character has on Roll20: this is the character whose attributes will be updated by the extension.
1b) Setting up more than one sheet to watch
If you wish for Atom20 to watch more than one sheet, for example if you intend to use the extension to build a bestiary with the stat blocks of many different types of enemies, you can use keywords in the \"character sheet name\" & \"character name\" cells:
In \"character sheet name\", you can whitelist or blacklist certain sheets, by using the keywords \"include\" or \"exclude\", followed by a colon, and then followed by the list of sheets which must be included or excluded from the watch, separated by commas. For example: \"excludes:Index\" will watch every sheet except the ones named \"Index\" and \"Atom20\".
In \"character name\", you can input a single asterisk (\"*\") in place of the character's name. If you do, the extension will look for a character on Roll20 whose name is the same as the name of the sheet that you are on at the moment.
2) Setting up attributes
The attributes table on the left tells the extension which cells to watch. Any change made in the cells will be reflected in your character's sheet on Roll20.
Note 1: the character sheet on Roll20 must have the attributes declared, or they cannot be updated.
Note 2: changes only go one way, and updating an attribute on Roll20 will not be reflected on Google Sheets.
3) Setting up macros
The macros table on the right tells the extension where to put buttons in your character sheet. If you click a cell which has been declared to be a macro, the corresponding text will be posted on Roll20's chat.
Note: if you set up Atom20 watch more than one sheet, you might want part of the macro's text to be set up on the watched sheet itself rather than on the \"Atom20\" sheet. This is possible through the use of string templates. For example, if a macro's text is \"Hello, ${F12}\", and the sheet being watched has \"World\" in cell F12, then the macro will post \"Hello, World\" on Roll20.
EXAMPLES
Below, you can find example use-cases for Atom20:
-Character sheet: https://docs.google.com/spreadsheets/d/1lqRLrOac2209-_Yt1RwX2X4cwTO17hgfjYKZNIwn4Xk/edit#gid=0
-Bestiary: https://docs.google.com/spreadsheets/d/1ARw_AZhM7qhN416YJpM3pCX5uUPS3CqWqS1RTu-AWfY/edit?usp=sharing
To use those examples, go to \"File\" => \"Make a Copy\". You will not be granted edit permission on the public-facing files.
VERSION 1.2
In this new version, any character sheet app can now plug into the Atom20 extension.
While you have a roll20 tab open, every other tab will get an Atom20 global variable. Using this, other TTRPG app developers can ensure their app can send messages on roll20 easily.
You're an app developer and want to add an Atom20 integration to your website? Simply copy-paste this file into your project to get started: https://github.com/Trekiros/Atom20/blob/main/atom20.d.ts
Source Manifest.json
{ "action": { "default_icon": { "128": "images/icon/icon128.png", "16": "images/icon/icon16.png", "24": "images/icon/icon24.png", "256": "images/icon/icon256.png", "32": "images/icon/icon32.png", "48": "images/icon/icon48.png", "64": "images/icon/icon64.png" } }, "background": { "service_worker": "chrome-background.js", "type": "module" }, "content_scripts": [ { "js": [ "chrome-content.js" ], "matches": [ "" ] } ], "description": "Add buttons to run your Roll20 character's macros and sync its attributes on Google Sheets. Works with virtually any TTRPG system!", "host_permissions": [ "" ], "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAif2PIq3ip14mXIwGUchBmY5TaUDrZp6X+c3zLOpK+GWQAPsl5eOAjNsJX6tbT2Y03COPvqUvM/hZcA7tbipEg16lSJ2YchAZ9yuIj+acKs+IynE2RWLZRu5xmCN0SqhI0aQrnYJItQU9r+KzdXp8VPm+BRjdfAXRFAMSg4B9yog0bNafQOzo8Pi+Sv2Y0Qtt9rL5cBfZKGpZHONT+SYKMfwTIGf/rInm1WYezlkZa2L1cmUUYNjXq5z0nQtjeEM0Ic+XBAGqsKw9uXTWrigramgb3uepDBIPsKnrnGMPLtgbFAe0kcpB8F3vx3tyKlg9j6A/Xa0TL4W6cugXf3z+ZwIDAQAB", "manifest_version": 3, "name": "Atom20", "oauth2": { "client_id": "642932630026-mt1ksqfrlgulc7hjlu8trci7ee8o65dj.apps.googleusercontent.com", "scopes": [ "https://www.googleapis.com/auth/spreadsheets.readonly" ] }, "permissions": [ "tabs", "identity" ], "update_url": "https://clients2.google.com/service/update2/crx", "version": "1.1", "web_accessible_resources": [ { "matches": [ "\\u003Call_urls>" ], "resources": [ "src/*" ] } ]}
Read more