I am using Zapier to create a Monday.com task every time a new lead is created in Copper (my CRM). The problem is that Zapier only allows the information to stored in the task name on Monday.com. I have created a webhook that is supposed to parse the needed data out of the Monday.com task title and update the column values as needed. However, my code is currently not doing that. I am receiving no errors when I create a task yet the columns are not populating properly. I am not sure what is the issue.
Here is the code:
const express = require('express')
const path = require('path')
const bodyParser = require('body-parser')
const PORT = process.env.PORT || 5000
const updateMultipleColumnValues = require("./updateMultipleColumnValue").updateMultipleColumnValue;
const app = express();
app.use( bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.post('/', (req, res) => {
console.log(req.body)
const { boardId, pulseId } = req.body.event
let parsedRecord = extractData(req.body.event.pulseName)
console.log(parsedRecord);
let newData = {
"text0": parsedRecord.DURATION
};
let stringData = JSON.stringify(newData);
console.log(boardId);
console.log(pulseId);
console.log(stringData);
updateMultipleColumnValues(boardId, pulseId, stringData);
res.json(parsedRecord);
});
app.listen(PORT, () => console.log(`Listening on ${ PORT }`));
// console.log(extractData(targetStr, fields));
function extractData(str) {
let fields = ['DATE', 'TIME', 'DURATION', 'TYPE'];
return str.split(/\s*\|\s*/).reduce((res, entry) => {
let dat = entry.split(/\s*:\s*/);
return fields.indexOf(dat[0]) > -1 ? Object.assign(res, { [dat[0]]: dat[1] }) : res;
}, {});
}
Here is the updateMultipleColumnValue file:
const executeMondayQuery = require("./executeMondayQuery").executeMondayQuery;
const updateMultipleColumnValue = async (boardId, itemId, newData) => {
const updateColumnValueBody = {
query: `mutation {
change_multiple_column_values(
board_id: ${boardId},
item_id: ${itemId},
column_values: ${newData}
) { id }
}`
};
await executeMondayQuery(updateColumnValueBody);
};
exports.updateMultipleColumnValue = updateMultipleColumnValue;
Monday.com use graphQL
Edit: We'll release a new Copper integration next week, so if you don't want to go through the trouble of recreating it with Zapier, you can wait for this release.
Anyway, there are a two things you probably need to address in this implementation.
TL;DR Solution
You need to escape your string before sending it in the mutation. This should work:
A word about GraphQL error handling
I'm not sure what's the logic inside the
executeMondayQueryfunction, but if a parsing error occurred during the execution of a GraphQL mutation, the HTTP response itself still has a 200 status code.The body of the response will contain an
errorsarray describing all syntax errors in the payload.Escaping strings in GraphQL JSON attributes
In this specific case the issue is probably that your
newData(originallystringData) isn't escaped, and isn't wrapped in double quotes (indicating it's a string).What happens is that after string interpolation your payload looks like so:
But the
column_valuesattribute ofchange_multiple_column_valuesaccepts a JSON formatted stringSo what you actually want is: