workspace-integration/sheets-to-eventarc-custom/Code.gs (54 lines of code) (raw):
const PROJECT_ID = "your-project-id";
const REGION = "us-central1";
const CHANNEL_NAME = "channel-sheets-custom";
const PUBLISH_URL = "https://eventarcpublishing.googleapis.com/v1/projects/" + PROJECT_ID
+ "/locations/" + REGION + "/channels/" + CHANNEL_NAME + ":publishEvents";
const EVENT_TYPE = "mycompany.myorg.myproject.v1.onedit";
function onEditHandler(editEvent) {
// Uncomment for debugging
//e = {}; e.user = "foo@bar.com";
Logger.log("Document edited by user: " + editEvent.user);
Logger.log(editEvent.range.getA1Notation());
Logger.log(editEvent.oldValue);
Logger.log(editEvent.value);
publishEvent(editEvent);
}
function publishEvent(editEvent) {
const headers = {
// Assumes the Sheets user has the 'roles/eventarc.publisher' role to
// publish Eventarc events (eg. the owner of the Google Cloud project)
"Authorization": "Bearer " + ScriptApp.getOAuthToken()
};
const event = getEvent(editEvent);
const payload = wrapIntoEvents(event);
const params = {
"method": 'post',
"contentType": 'application/json',
"headers": headers,
"payload": payload
};
Logger.log("Publishing with payload: " + payload);
var response = UrlFetchApp.fetch(PUBLISH_URL, params);
Logger.log("Received response code: " + response.getResponseCode() + " from URL: " + PUBLISH_URL);
}
function getEvent(editEvent) {
const event = {
"@type": "type.googleapis.com/io.cloudevents.v1.CloudEvent",
"attributes": {
"datacontenttype": { "ceString": "application/json" },
"time": { "ceTimestamp": new Date() }
},
"specVersion": "1.0",
"id": Utilities.getUuid(),
"source": "google_sheets",
"textData": '{"user": "' + editEvent.user + '", "range": "' + editEvent.range.getA1Notation()
+ '", "oldValue": "' + editEvent.oldValue + '", "newValue": "' + editEvent.value + '"}',
"type": EVENT_TYPE
};
Logger.log("Created an event: " + JSON.stringify(event));
return event;
}
function wrapIntoEvents(event) {
const events = {
"events": [
event
]
};
return JSON.stringify(events);
}