{ "kind": "open-flow-workflow", "version": 1, "name": "Validate Sheet Email Deliverability", "content": { "modelVersion": 14, "document": { "bindings": {}, "graph": { "nodes": { "n_99445edda5315ea8": { "name": "Every minute", "kind": "cron", "cronTimes": [ { "type": "cron", "expression": "* * * * *", "timezone": "UTC" } ] }, "n_262a525596e33d91": { "inputs": { "spreadsheetId": { "kind": "value", "value": "YOUR_SPREADSHEET_ID" }, "range": { "kind": "value", "value": "'Emails'!A:Z" }, "majorDimension": { "kind": "value", "value": "ROWS" }, "valueRenderOption": { "kind": "value", "value": "FORMATTED_VALUE" } }, "name": "Read the email sheet", "kind": "task", "task": { "inputs": [ { "description": "The spreadsheet ID.", "jsonSchema": { "type": "string", "minLength": 1, "description": "The spreadsheet ID." }, "nullable": true, "handle": "spreadsheetId", "value": null }, { "description": "The A1 notation of the range to retrieve.", "jsonSchema": { "type": "string", "minLength": 1, "description": "The A1 notation of the range to retrieve." }, "nullable": false, "handle": "range" }, { "description": "The major dimension for the returned values.", "jsonSchema": { "type": "string", "enum": [ "DIMENSION_UNSPECIFIED", "ROWS", "COLUMNS" ], "description": "The major dimension for the returned values." }, "nullable": true, "handle": "majorDimension", "value": null }, { "description": "How values should be rendered in the output.", "jsonSchema": { "type": "string", "enum": [ "FORMATTED_VALUE", "UNFORMATTED_VALUE", "FORMULA" ], "description": "How values should be rendered in the output." }, "nullable": true, "handle": "valueRenderOption", "value": null }, { "description": "How dates and times should be rendered in the output.", "jsonSchema": { "type": "string", "enum": [ "SERIAL_NUMBER", "FORMATTED_STRING" ], "description": "How dates and times should be rendered in the output." }, "nullable": true, "handle": "dateTimeRenderOption", "value": null } ], "outputs": [ { "description": "The A1 notation of the range.", "jsonSchema": { "type": "string", "description": "The A1 notation of the range." }, "nullable": false, "handle": "range" }, { "description": "The major dimension of the values (ROWS or COLUMNS).", "jsonSchema": { "type": "string", "description": "The major dimension of the values (ROWS or COLUMNS)." }, "nullable": false, "handle": "majorDimension" }, { "description": "The data values in the range.", "jsonSchema": { "type": "array", "items": { "type": "array", "items": { "anyOf": [ { "type": "string", "description": "A union variant." }, { "type": "number", "description": "A union variant." }, { "type": "boolean", "description": "A union variant." }, { "const": null, "description": "A union variant." } ], "description": "The cell value schema." }, "description": "An array item." }, "description": "The data values in the range." }, "nullable": false, "handle": "values" } ], "name": "Read the email sheet", "executor": { "kind": "connector", "action": "googlesheets.values_get" } } }, "n_db1dfd296b944d8d": { "inputs": { "values": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_262a525596e33d91", "output": "values" } ] } }, "name": "Find changed email rows", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "array", "items": { "type": "array", "items": { "anyOf": [ { "type": "string", "description": "A union variant." }, { "type": "number", "description": "A union variant." }, { "type": "boolean", "description": "A union variant." }, { "const": null, "description": "A union variant." } ], "description": "The cell value schema." }, "description": "An array item." }, "description": "The data values in the range." }, "nullable": false, "handle": "values" } ], "outputs": [ { "jsonSchema": { "type": "array", "items": { "type": "object", "additionalProperties": true } }, "nullable": false, "handle": "items" }, { "jsonSchema": { "type": "array", "items": { "type": "array", "items": { "anyOf": [ { "type": "string", "description": "A union variant." }, { "type": "number", "description": "A union variant." }, { "type": "boolean", "description": "A union variant." }, { "const": null, "description": "A union variant." } ], "description": "The cell value schema." }, "description": "An array item." }, "description": "The data values in the range." }, "nullable": false, "handle": "snapshot" } ], "name": "Find changed email rows", "moduleId": "n_7440661159c20d62", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_cfd077d86c0ca23d": { "inputs": { "items": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_db1dfd296b944d8d", "output": "items" } ] }, "previousState": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_cfd077d86c0ca23d", "output": "state" } ] } }, "name": "Select the next email", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "array", "items": { "type": "object", "additionalProperties": true } }, "nullable": false, "handle": "items" }, { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": true, "handle": "previousState" } ], "outputs": [ { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": false, "handle": "state" }, { "jsonSchema": { "type": "boolean" }, "nullable": false, "handle": "more" }, { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": false, "handle": "current" }, { "jsonSchema": { "type": "string", "format": "email", "description": "The email address to validate." }, "nullable": false, "handle": "email" } ], "name": "Select the next email", "moduleId": "n_a65d5e1aa9c41448", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_dc463dc7ff7934ab": { "inputs": {}, "name": "More emails?", "kind": "condition", "matchMode": "first", "cases": [ { "output": "validate", "groups": [ { "expressions": [ { "left": { "kind": "source", "source": { "kind": "node", "nodeId": "n_cfd077d86c0ca23d", "output": "more" } }, "operator": "isTrue" } ] } ] } ] }, "n_dc36abc29b1f2946": { "inputs": { "email": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_cfd077d86c0ca23d", "output": "email" } ] } }, "name": "Validate the email", "kind": "task", "task": { "inputs": [ { "description": "The email address to validate.", "jsonSchema": { "type": "string", "format": "email", "description": "The email address to validate." }, "nullable": false, "handle": "email" } ], "outputs": [ { "description": "The validation result identifier.", "jsonSchema": { "type": "string", "format": "uuid", "description": "The validation result identifier." }, "nullable": false, "handle": "id" }, { "description": "The email address that was validated.", "jsonSchema": { "type": "string", "format": "email", "description": "The email address that was validated." }, "nullable": false, "handle": "email" }, { "description": "The email username, or null when Mails did not return one.", "jsonSchema": { "anyOf": [ { "type": "string", "description": "The email username returned by Mails." }, { "const": null, "description": "Mails did not return an email username." } ], "description": "The email username, or null when Mails did not return one." }, "nullable": false, "handle": "username" }, { "description": "The email domain, or null when Mails did not return one.", "jsonSchema": { "anyOf": [ { "type": "string", "description": "The email domain returned by Mails." }, { "const": null, "description": "Mails did not return an email domain." } ], "description": "The email domain, or null when Mails did not return one." }, "nullable": false, "handle": "domain" }, { "description": "The MX record, or null when Mails did not return one.", "jsonSchema": { "anyOf": [ { "type": "string", "description": "The MX record returned by Mails." }, { "const": null, "description": "Mails did not return an MX record." } ], "description": "The MX record, or null when Mails did not return one." }, "nullable": false, "handle": "mxRecord" }, { "description": "The validation score from 0 to 100 returned by Mails.", "jsonSchema": { "type": "integer", "minimum": 0, "maximum": 100, "description": "The validation score from 0 to 100 returned by Mails." }, "nullable": false, "handle": "score" }, { "description": "Whether the email format is valid.", "jsonSchema": { "type": "boolean", "description": "Whether the email format is valid." }, "nullable": false, "handle": "isValidFormat" }, { "description": "Whether the email domain is valid.", "jsonSchema": { "type": "boolean", "description": "Whether the email domain is valid." }, "nullable": false, "handle": "isValidDomain" }, { "description": "Whether the MX record is valid, or null when Mails did not complete MX validation.", "jsonSchema": { "anyOf": [ { "type": "boolean", "description": "Whether the MX record is valid." }, { "const": null, "description": "Mails did not complete MX validation." } ], "description": "Whether the MX record is valid, or null when Mails did not complete MX validation." }, "nullable": false, "handle": "isValidMx" }, { "description": "Whether the email was not found on a provider blocklist.", "jsonSchema": { "type": "boolean", "description": "Whether the email was not found on a provider blocklist." }, "nullable": false, "handle": "hasNoBlocklist" }, { "description": "Whether the email domain is not configured as catch-all.", "jsonSchema": { "type": "boolean", "description": "Whether the email domain is not configured as catch-all." }, "nullable": false, "handle": "hasNoCatchall" }, { "description": "Whether the email is not a generic role inbox.", "jsonSchema": { "type": "boolean", "description": "Whether the email is not a generic role inbox." }, "nullable": false, "handle": "hasNoGeneric" }, { "description": "Whether the email uses a free mailbox provider.", "jsonSchema": { "type": "boolean", "description": "Whether the email uses a free mailbox provider." }, "nullable": false, "handle": "isFree" }, { "description": "The overall Mails validation result.", "jsonSchema": { "type": "string", "enum": [ "deliverable", "undeliverable", "risky", "unknown" ], "description": "The overall Mails validation result." }, "nullable": false, "handle": "result" }, { "description": "The detailed reason returned by Mails for the validation result.", "jsonSchema": { "type": "string", "enum": [ "accepted_email", "invalid_format", "invalid_domain", "invalid_smtp", "rejected_email", "catch_all", "disposable", "no_connect", "timeout", "other" ], "description": "The detailed reason returned by Mails for the validation result." }, "nullable": false, "handle": "reason" } ], "name": "Validate the email", "executor": { "kind": "connector", "action": "mails_so.validate_email" } } }, "n_9a8113f4b1d94fcc": { "inputs": { "spreadsheetId": { "kind": "value", "value": "YOUR_SPREADSHEET_ID" }, "range": { "kind": "value", "value": "'Emails'!A:Z" }, "majorDimension": { "kind": "value", "value": "ROWS" }, "valueRenderOption": { "kind": "value", "value": "FORMATTED_VALUE" } }, "name": "Recheck the email sheet", "kind": "task", "task": { "inputs": [ { "description": "The spreadsheet ID.", "jsonSchema": { "type": "string", "minLength": 1, "description": "The spreadsheet ID." }, "nullable": true, "handle": "spreadsheetId", "value": null }, { "description": "The A1 notation of the range to retrieve.", "jsonSchema": { "type": "string", "minLength": 1, "description": "The A1 notation of the range to retrieve." }, "nullable": false, "handle": "range" }, { "description": "The major dimension for the returned values.", "jsonSchema": { "type": "string", "enum": [ "DIMENSION_UNSPECIFIED", "ROWS", "COLUMNS" ], "description": "The major dimension for the returned values." }, "nullable": true, "handle": "majorDimension", "value": null }, { "description": "How values should be rendered in the output.", "jsonSchema": { "type": "string", "enum": [ "FORMATTED_VALUE", "UNFORMATTED_VALUE", "FORMULA" ], "description": "How values should be rendered in the output." }, "nullable": true, "handle": "valueRenderOption", "value": null }, { "description": "How dates and times should be rendered in the output.", "jsonSchema": { "type": "string", "enum": [ "SERIAL_NUMBER", "FORMATTED_STRING" ], "description": "How dates and times should be rendered in the output." }, "nullable": true, "handle": "dateTimeRenderOption", "value": null } ], "outputs": [ { "description": "The A1 notation of the range.", "jsonSchema": { "type": "string", "description": "The A1 notation of the range." }, "nullable": false, "handle": "range" }, { "description": "The major dimension of the values (ROWS or COLUMNS).", "jsonSchema": { "type": "string", "description": "The major dimension of the values (ROWS or COLUMNS)." }, "nullable": false, "handle": "majorDimension" }, { "description": "The data values in the range.", "jsonSchema": { "type": "array", "items": { "type": "array", "items": { "anyOf": [ { "type": "string", "description": "A union variant." }, { "type": "number", "description": "A union variant." }, { "type": "boolean", "description": "A union variant." }, { "const": null, "description": "A union variant." } ], "description": "The cell value schema." }, "description": "An array item." }, "description": "The data values in the range." }, "nullable": false, "handle": "values" } ], "name": "Recheck the email sheet", "executor": { "kind": "connector", "action": "googlesheets.values_get" } } }, "n_7f42d9d02267743f": { "inputs": { "values": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_9a8113f4b1d94fcc", "output": "values" } ] }, "current": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_cfd077d86c0ca23d", "output": "current" } ] }, "sheetName": { "kind": "value", "value": "Emails" }, "result": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_dc36abc29b1f2946", "output": "result" } ] }, "returnedEmail": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_dc36abc29b1f2946", "output": "email" } ] } }, "name": "Prepare the status cell", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "array", "items": { "type": "array", "items": { "anyOf": [ { "type": "string", "description": "A union variant." }, { "type": "number", "description": "A union variant." }, { "type": "boolean", "description": "A union variant." }, { "const": null, "description": "A union variant." } ], "description": "The cell value schema." }, "description": "An array item." }, "description": "The data values in the range." }, "nullable": false, "handle": "values" }, { "jsonSchema": { "type": "object", "additionalProperties": true }, "nullable": false, "handle": "current" }, { "jsonSchema": { "type": "string" }, "nullable": false, "handle": "sheetName" }, { "jsonSchema": { "type": "string", "enum": [ "deliverable", "undeliverable", "risky", "unknown" ], "description": "The overall Mails validation result." }, "nullable": false, "handle": "result" }, { "jsonSchema": { "type": "string", "format": "email", "description": "The email address that was validated." }, "nullable": false, "handle": "returnedEmail" } ], "outputs": [ { "jsonSchema": { "type": "string", "minLength": 1, "description": "The A1 notation of the range to write to." }, "nullable": false, "handle": "range" }, { "jsonSchema": { "type": "array", "items": { "type": "array", "items": { "anyOf": [ { "type": "string", "description": "A union variant." }, { "type": "number", "description": "A union variant." }, { "type": "boolean", "description": "A union variant." }, { "const": null, "description": "A union variant." } ], "description": "The cell value schema." }, "description": "An array item." }, "description": "The data to write into the range." }, "nullable": false, "handle": "values" } ], "name": "Prepare the status cell", "moduleId": "n_d129096233ceaeed", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_8093576c06e68ae1": { "inputs": { "spreadsheetId": { "kind": "value", "value": "YOUR_SPREADSHEET_ID" }, "range": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_7f42d9d02267743f", "output": "range" } ] }, "values": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_7f42d9d02267743f", "output": "values" } ] }, "valueInputOption": { "kind": "value", "value": "RAW" } }, "name": "Write the deliverability status", "kind": "task", "task": { "inputs": [ { "description": "The spreadsheet ID.", "jsonSchema": { "type": "string", "minLength": 1, "description": "The spreadsheet ID." }, "nullable": true, "handle": "spreadsheetId", "value": null }, { "description": "The A1 notation of the range to write to.", "jsonSchema": { "type": "string", "minLength": 1, "description": "The A1 notation of the range to write to." }, "nullable": false, "handle": "range" }, { "description": "The data to write into the range.", "jsonSchema": { "type": "array", "items": { "type": "array", "items": { "anyOf": [ { "type": "string", "description": "A union variant." }, { "type": "number", "description": "A union variant." }, { "type": "boolean", "description": "A union variant." }, { "const": null, "description": "A union variant." } ], "description": "The cell value schema." }, "description": "An array item." }, "description": "The data to write into the range." }, "nullable": false, "handle": "values" }, { "description": "The major dimension of the values array.", "jsonSchema": { "type": "string", "enum": [ "ROWS", "COLUMNS" ], "description": "The major dimension of the values array." }, "nullable": true, "handle": "majorDimension", "value": null }, { "description": "How the input data should be interpreted.", "jsonSchema": { "type": "string", "enum": [ "RAW", "USER_ENTERED" ], "description": "How the input data should be interpreted." }, "nullable": true, "handle": "valueInputOption", "value": null }, { "description": "Whether to include the written values in the response.", "jsonSchema": { "type": "boolean", "description": "Whether to include the written values in the response." }, "nullable": true, "handle": "includeValuesInResponse", "value": null }, { "description": "How values in the response should be rendered.", "jsonSchema": { "type": "string", "enum": [ "FORMATTED_VALUE", "UNFORMATTED_VALUE", "FORMULA" ], "description": "How values in the response should be rendered." }, "nullable": true, "handle": "responseValueRenderOption", "value": null }, { "description": "How dates in the response should be rendered.", "jsonSchema": { "type": "string", "enum": [ "SERIAL_NUMBER", "FORMATTED_STRING" ], "description": "How dates in the response should be rendered." }, "nullable": true, "handle": "responseDateTimeRenderOption", "value": null }, { "description": "Whether to auto-expand the sheet to fit the written data.", "jsonSchema": { "type": "boolean", "description": "Whether to auto-expand the sheet to fit the written data." }, "nullable": true, "handle": "autoExpandSheet", "value": null } ], "outputs": [ { "description": "The unique ID of the spreadsheet.", "jsonSchema": { "type": "string", "description": "The unique ID of the spreadsheet." }, "nullable": false, "handle": "spreadsheetId" }, { "description": "The A1 notation of the range that was updated.", "jsonSchema": { "type": "string", "description": "The A1 notation of the range that was updated." }, "nullable": false, "handle": "updatedRange" }, { "description": "The number of rows that were updated.", "jsonSchema": { "type": "integer", "description": "The number of rows that were updated." }, "nullable": false, "handle": "updatedRows" }, { "description": "The number of columns that were updated.", "jsonSchema": { "type": "integer", "description": "The number of columns that were updated." }, "nullable": false, "handle": "updatedColumns" }, { "description": "The number of cells that were updated.", "jsonSchema": { "type": "integer", "description": "The number of cells that were updated." }, "nullable": false, "handle": "updatedCells" }, { "description": "The values of the cells after the update.", "jsonSchema": { "type": "object", "properties": { "range": { "type": "string", "description": "The A1 notation of the range." }, "majorDimension": { "type": "string", "description": "The major dimension of the values (ROWS or COLUMNS)." }, "values": { "type": "array", "items": { "type": "array", "items": { "anyOf": [ { "type": "string", "description": "A union variant." }, { "type": "number", "description": "A union variant." }, { "type": "boolean", "description": "A union variant." }, { "const": null, "description": "A union variant." } ], "description": "The cell value schema." }, "description": "An array item." }, "description": "The data values in the range." } }, "required": [ "range", "majorDimension", "values" ], "additionalProperties": false, "description": "The values of the cells after the update." }, "nullable": true, "handle": "updatedData" } ], "name": "Write the deliverability status", "executor": { "kind": "connector", "action": "googlesheets.values_update" } } }, "n_2fddf117594ea45f": { "inputs": { "updatedCells": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_8093576c06e68ae1", "output": "updatedCells" } ] } }, "name": "Confirm the status update", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "integer", "description": "The number of cells that were updated." }, "nullable": false, "handle": "updatedCells" } ], "outputs": [ { "jsonSchema": { "type": "boolean" }, "nullable": false, "handle": "ok" } ], "name": "Confirm the status update", "moduleId": "n_01dc3dcde0d294e3", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_4779f826ce0cd584": { "inputs": { "snapshot": { "kind": "sources", "sources": [ { "kind": "node", "nodeId": "n_db1dfd296b944d8d", "output": "snapshot" } ] } }, "name": "Save the observed snapshot", "kind": "task", "task": { "inputs": [ { "jsonSchema": { "type": "array", "items": { "type": "array", "items": { "anyOf": [ { "type": "string", "description": "A union variant." }, { "type": "number", "description": "A union variant." }, { "type": "boolean", "description": "A union variant." }, { "const": null, "description": "A union variant." } ], "description": "The cell value schema." }, "description": "An array item." }, "description": "The data values in the range." }, "nullable": false, "handle": "snapshot" } ], "outputs": [ { "jsonSchema": { "type": "boolean" }, "nullable": false, "handle": "ok" } ], "name": "Save the observed snapshot", "moduleId": "n_e9516e370741d89f", "capabilities": [ { "kind": "connector", "mode": "independent", "actions": [] } ] } }, "n_a9b55e868ac94dee": { "name": "Complete", "kind": "outputs", "outputDefs": [], "outputMappings": {} } }, "edges": [ { "source": "n_99445edda5315ea8", "target": "n_262a525596e33d91" }, { "source": "n_262a525596e33d91", "target": "n_db1dfd296b944d8d" }, { "source": "n_db1dfd296b944d8d", "target": "n_cfd077d86c0ca23d" }, { "source": "n_cfd077d86c0ca23d", "target": "n_dc463dc7ff7934ab" }, { "source": "n_dc463dc7ff7934ab", "target": "n_dc36abc29b1f2946", "sourceHandle": "validate" }, { "source": "n_dc36abc29b1f2946", "target": "n_9a8113f4b1d94fcc" }, { "source": "n_9a8113f4b1d94fcc", "target": "n_7f42d9d02267743f" }, { "source": "n_7f42d9d02267743f", "target": "n_8093576c06e68ae1" }, { "source": "n_8093576c06e68ae1", "target": "n_2fddf117594ea45f" }, { "source": "n_2fddf117594ea45f", "target": "n_cfd077d86c0ca23d" }, { "source": "n_dc463dc7ff7934ab", "target": "n_4779f826ce0cd584", "sourceHandle": "otherwise" }, { "source": "n_4779f826ce0cd584", "target": "n_a9b55e868ac94dee" } ] } }, "modules": { "n_7440661159c20d62": { "name": "Find changed email rows", "imports": [], "source": "function PLAN({values,previous}) {\n if (!Array.isArray(values) || !Array.isArray(values[0])) throw Error('Sheet needs headers');\n const headers=values[0];\n const column=name=>{const matches=headers.flatMap((v,i)=>v===name?[i]:[]);if(matches.length!==1)throw Error('Missing or duplicate '+name+' header');return matches[0]};\n const emailColumn=column('Email'), statusColumn=column('Status');\n const rows=values.slice(1).map((row,i)=>{if(!Array.isArray(row))throw Error('Invalid row');return {row:i+2,email:String(row[emailColumn]??'').trim(),status:String(row[statusColumn]??''),cells:row}});\n const snapshot=rows.map(r=>r.cells);\n if(previous==null)return {snapshot,items:[]};\n if(!Array.isArray(previous))throw Error('Invalid previous snapshot');\n const seen=new Set(),items=[];\n for(let i=0;iitems.length)throw Error('Invalid item index');const current=items[index];return {state:{index:index+1},more:index{const a=h.flatMap((x,i)=>x===n?[i]:[]);if(a.length!==1)throw Error('Missing or duplicate '+n+' header');return a[0]};const e=find('Email'),s=find('Status'),row=values[current.row-1];if(!Array.isArray(row)||String(row[e]??'').trim()!==current.email||String(row[s]??'').trim())throw Error('Row changed before update');let col=s+1,letters='';while(col){col--;letters=String.fromCharCode(65+col%26)+letters;col=Math.floor(col/26)}if(typeof sheetName!=='string'||!sheetName.trim())throw Error('Missing sheet name');return{range:\"'\"+sheetName.replace(/'/g,\"''\")+\"'!\"+letters+current.row,values:[[result]]}}\n" }, "n_01dc3dcde0d294e3": { "name": "Confirm the status update", "imports": [], "source": "export default function confirm({updatedCells}){if(updatedCells!==1)throw Error('Status update was not confirmed');return{ok:true};}\n" }, "n_e9516e370741d89f": { "name": "Save the observed snapshot", "imports": [], "source": "export default async function commit({snapshot},context){if(!Array.isArray(snapshot))throw Error('Invalid snapshot');await context.state.set('sheet-snapshot',snapshot);return {ok:true}}\n" } } }, "presentation": { "designer": { "version": 1, "flow": { "direction": "vertical" } } } }