diff --git a/node-red-grist/sync-table.html b/node-red-grist/sync-table.html
new file mode 100644
index 0000000..fc73753
--- /dev/null
+++ b/node-red-grist/sync-table.html
@@ -0,0 +1,68 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/node-red-grist/sync-table.js b/node-red-grist/sync-table.js
new file mode 100644
index 0000000..2ffdb7f
--- /dev/null
+++ b/node-red-grist/sync-table.js
@@ -0,0 +1,26 @@
+const { GristDocAPI } = require('grist-api');
+const mustache = require('mustache');
+
+module.exports = function (RED) {
+ function SyncTableNode(config) {
+ RED.nodes.createNode(this, config);
+ let node = this;
+ this.document = RED.nodes.getNode(config.document);
+ this.server = RED.nodes.getNode(config.server);
+ this.table = config.tableId;
+ this.primaryKey = config.primaryKey;
+
+ node.on('input', async function (msg, send, done) {
+ const protocol = this.server.tlsEnabled === true ? "https" : "http";
+ const url = protocol + "://" + this.server.hostname + ":" + this.server.port;
+ const api = new GristDocAPI(this.document.docid, { apiKey: this.server.apiKey, server: url });
+ const data = Array.isArray(msg.payload) ? msg.payload : [msg.payload]
+
+ api.syncTable(this.table, data, this.primaryKey).then(data => {
+ node.send({ ...msg, payload: data })
+ }).catch(reason => done(reason, "Failed to perform grist request to " + url));
+
+ });
+ }
+ RED.nodes.registerType("grist-add-records", SyncTableNode);
+}
\ No newline at end of file
diff --git a/package.json b/package.json
index b361a04..abace08 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
"grist-document-export": "node-red-grist/document-export.js",
"grist-add-records": "node-red-grist/add-records.js",
"grist-get-records": "node-red-grist/get-records.js",
+ "grist-sync-table": "node-red-grist/sync-table.js",
"grist-update-records": "node-red-grist/update-records.js",
"grist-document": "node-red-grist/document.js",
"grist-server": "node-red-grist/server.js"