Skip to content

Commit

Permalink
Merge pull request #4604 from kishanprmr/google-sheets-update-trigger
Browse files Browse the repository at this point in the history
feat(google-sheets): Updated Row Trigger Based on User Provided Column
  • Loading branch information
abuaboud committed May 3, 2024
2 parents 03e0529 + 957b590 commit 020a50d
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 11 deletions.
2 changes: 1 addition & 1 deletion packages/pieces/community/google-sheets/package.json
@@ -1,4 +1,4 @@
{
"name": "@activepieces/piece-google-sheets",
"version": "0.10.1"
"version": "0.10.2"
}
@@ -1,5 +1,9 @@
import { googleSheetsAuth } from '../../';
import { columnToLabel, googleSheetsCommon } from '../common/common';
import {
columnToLabel,
googleSheetsCommon,
labelToColumn,
} from '../common/common';
import {
createFileNotification,
deleteFileNotification,
Expand All @@ -17,6 +21,9 @@ import {
TriggerStrategy,
DEDUPE_KEY_PROPERTY,
WebhookRenewStrategy,
Property,
PiecePropValueSchema,
DropdownOption,
} from '@activepieces/pieces-framework';

import crypto from 'crypto';
Expand All @@ -27,9 +34,58 @@ export const newOrUpdatedRowTrigger = createTrigger({
displayName: 'New or Updated Row',
description: 'Triggers when a new row is added or modified in a spreadsheet.',
props: {
info: Property.MarkDown({
value:
'Please note that there might be a delay of up to 3 minutes for the trigger to be fired, due to a delay from Google.',
}),
spreadsheet_id: googleSheetsCommon.spreadsheet_id,
sheet_id: googleSheetsCommon.sheet_id,
include_team_drives: googleSheetsCommon.include_team_drives,
trigger_column: Property.Dropdown({
displayName: 'Trigger Column',
description: `Trigger on changes to cells in this column only.Select **All Columns** if you want the flow to trigger on changes to any cell within the row.`,
required: true,
refreshers: ['spreadsheet_id', 'sheet_id'],
options: async ({ auth, spreadsheet_id, sheet_id }) => {
if (!auth || !spreadsheet_id || !sheet_id) {
return {
disabled: true,
options: [],
placeholder: 'Please select sheet first.',
};
}

const authValue = auth as PiecePropValueSchema<typeof googleSheetsAuth>;
const spreadSheetId = spreadsheet_id as string;
const sheetId = sheet_id as number;

const sheetName = await getWorkSheetName(
authValue,
spreadSheetId,
sheetId
);

const firstRowValues = await getWorkSheetValues(
authValue,
spreadSheetId,
`${sheetName}!1:1`
);
const labeledRowValues = transformWorkSheetValues(firstRowValues, 0);

const options: DropdownOption<string>[] = [
{ label: 'All Columns', value: 'all_columns' },
];

Object.entries(labeledRowValues[0].values).forEach(([key, value]) => {
options.push({ label: value as string, value: key });
});

return {
disabled: false,
options,
};
},
}),
},

renewConfiguration: {
Expand All @@ -42,17 +98,23 @@ export const newOrUpdatedRowTrigger = createTrigger({
async onEnable(context) {
const spreadSheetId = context.propsValue.spreadsheet_id;
const sheetId = context.propsValue.sheet_id;
const triggerColumn = context.propsValue.trigger_column;

const sheetName = await getWorkSheetName(
context.auth,
spreadSheetId,
sheetId
);

const range =
triggerColumn === 'all_columns'
? sheetName
: `${sheetName}!${triggerColumn}:${triggerColumn}`; // only fetch trigger column values

const sheetValues = await getWorkSheetValues(
context.auth,
spreadSheetId,
sheetName
range
);

const rowHashes = [];
Expand Down Expand Up @@ -107,6 +169,7 @@ export const newOrUpdatedRowTrigger = createTrigger({

const spreadSheetId = context.propsValue.spreadsheet_id;
const sheetId = context.propsValue.sheet_id;
const triggerColumn = context.propsValue.trigger_column;

const sheetName = await getWorkSheetName(
context.auth,
Expand All @@ -116,7 +179,8 @@ export const newOrUpdatedRowTrigger = createTrigger({

const oldValuesHashes = (await context.store.get(`${sheetId}`)) as any[];

// fetch new sheet row values
/* Fetch rows values with all columns as this will be used on returning updated/new row data
*/
const currentValues = await getWorkSheetValues(
context.auth,
spreadSheetId,
Expand All @@ -128,13 +192,30 @@ export const newOrUpdatedRowTrigger = createTrigger({
const changedValues = [];
const newRowHashes = [];

for (let i = 0; i < currentValues.length; i++) {
const currentRowValue = currentValues[i];
for (let row = 0; row < currentValues.length; row++) {
const currentRowValue = currentValues[row];

/**
* This variable store value based on trigger column.
* If trigger column is all_columns then store entrie row as target value, else store only column value.

Check warning on line 200 in packages/pieces/community/google-sheets/src/lib/triggers/new-or-updated-row.trigger.ts

View workflow job for this annotation

GitHub Actions / Spell Check with Typos on Changed Files

"entrie" should be "entry" or "entries".
*/
let targetValue;
if (triggerColumn === 'all_columns') {
targetValue = currentRowValue;
} else {
const currentTriggerColumnValue =
currentRowValue[labelToColumn(triggerColumn)];

targetValue =
currentTriggerColumnValue !== undefined
? [currentTriggerColumnValue]
: [];
}

// create hash for new row values
const currentRowHash = crypto
.createHash('md5')
.update(JSON.stringify(currentRowValue))
.update(JSON.stringify(targetValue))
.digest('hex');
newRowHashes.push(currentRowHash);

Expand All @@ -143,16 +224,17 @@ export const newOrUpdatedRowTrigger = createTrigger({
continue;
}

const oldRowHash = oldValuesHashes[i];
const oldRowHash = oldValuesHashes[row];

if (oldRowHash === undefined || oldRowHash != currentRowHash) {
const formattedValues: any = {};

for (let j = 0; j < currentRowValue.length; j++) {
formattedValues[columnToLabel(j)] = currentRowValue[j];
for (let column = 0; column < currentValues[row].length; column++) {
formattedValues[columnToLabel(column)] = currentValues[row][column];
}

changedValues.push({
row: i + 1,
row: row + 1,
values: formattedValues,
});
}
Expand Down

0 comments on commit 020a50d

Please sign in to comment.