diff --git a/workflows/Automate Job Search with LinkedIn, Google Sheets & AI Resume Scoring & Cover Letters-9602/automate_job_search_with_linkedin_google_sheets_ai_resume_scoring_cover_letters.json b/workflows/Automate Job Search with LinkedIn, Google Sheets & AI Resume Scoring & Cover Letters-9602/automate_job_search_with_linkedin_google_sheets_ai_resume_scoring_cover_letters.json new file mode 100644 index 000000000..b95bebeca --- /dev/null +++ b/workflows/Automate Job Search with LinkedIn, Google Sheets & AI Resume Scoring & Cover Letters-9602/automate_job_search_with_linkedin_google_sheets_ai_resume_scoring_cover_letters.json @@ -0,0 +1 @@ +{"id":"SrQYoBJKHtuSzi6B","meta":{"instanceId":"1da5d9ac3e2974ca203c09fc21d9eb832e61e497fa9e11c9fbcaae0e18a9c185","templateCredsSetupCompleted":true},"name":"My workflow","tags":[],"nodes":[{"id":"9dd871da-bb3b-4ebe-963b-128fcff34099","name":"Download file","type":"n8n-nodes-base.googleDrive","position":[208,0],"parameters":{"fileId":{"__rl":true,"mode":"url","value":""},"options":{},"operation":"download"},"credentials":{"googleDriveOAuth2Api":{"id":"AcZcDztmyUtsa3Kc","name":"Google Drive account"}},"typeVersion":3},{"id":"6bdbd596-b061-427a-b97c-e789fe7090a4","name":"Extract from File","type":"n8n-nodes-base.extractFromFile","position":[416,0],"parameters":{"options":{},"operation":"pdf"},"typeVersion":1},{"id":"484e0f62-0d1a-4637-8b58-4942d6d0a4e0","name":"Get row(s) in sheet","type":"n8n-nodes-base.googleSheets","position":[624,0],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g/edit#gid=0","cachedResultName":"Filter"},"documentId":{"__rl":true,"mode":"list","value":"1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g/edit?usp=drivesdk","cachedResultName":"Job Search N8N"}},"credentials":{"googleSheetsOAuth2Api":{"id":"oD5JyqmvqMOPNTeR","name":"Google Sheets account"}},"typeVersion":4.7},{"id":"c4bc1e36-3acb-4637-a867-085a3079eb14","name":"LinkedIn Search URL","type":"n8n-nodes-base.code","position":[832,0],"parameters":{"jsCode":"let url = \"https://www.linkedin.com/jobs/search/?f_TPR=r86400\"\n\nconst keyword = $input.first().json.Keyword\nconst location = $input.first().json.Location\nconst experienceLevel = $input.first().json['Experience Level']\nconst remote = $input.first().json.Remote\nconst easyApply = $input.first().json['Easy Apply']\n\nif (keyword != \"\") {\n url += `&keywords=${keyword}`;\n}\n\nif (location != \"\") {\n url += `&location=${location}`;\n}\n\nif (experienceLevel !== \"\") {\n // Transform experience levels to LinkedIn codes\n // Internship -> 1, Entry level -> 2, Associate -> 3\n // Mid-Senior level -> 4, Director -> 5, Executive -> 6\n const transformedExperiences = experienceLevel\n .split(\",\")\n .map((exp) => {\n switch (exp.trim()) {\n case \"Internship\": return \"1\";\n case \"Entry level\": return \"2\";\n case \"New Grad\": return \"3\";\n default: return \"\";\n }\n })\n .filter(Boolean);\n url += `&f_E=${transformedExperiences.join(\",\")}`;\n}\n\nif (remote.length != \"\") {\n // Transform remote options to LinkedIn codes\n // On-Site -> 1, Remote -> 2, Hybrid -> 3\n const transformedRemote = remote\n .split(\",\")\n .map((e) => {\n switch (e.trim()) {\n case \"Remote\": return \"2\";\n case \"Hybrid\": return \"3\";\n case \"On-Site\": return \"1\";\n default: return \"\";\n }\n })\n .filter(Boolean);\n url += `&f_WT=${transformedRemote.join(\",\")}`;\n}\n\nif (easyApply != \"\") {\n url += \"&f_EA=true\";\n}\n\nreturn {url}\n"},"typeVersion":2},{"id":"dc8f887e-81e6-44bf-a356-13f61d6a0388","name":"Fetch jobs from LinkedIn","type":"n8n-nodes-base.httpRequest","position":[1040,0],"parameters":{"url":"={{ $json.url }}","options":{}},"typeVersion":4.2},{"id":"c9e59fa5-49df-47bb-89c0-87ab7845fd2f","name":"HTML","type":"n8n-nodes-base.html","position":[1248,0],"parameters":{"options":{},"operation":"extractHtmlContent","extractionValues":{"values":[{"key":"jobs","attribute":"href","cssSelector":"ul.jobs-search__results-list li div a[class*=\"base-card\"]","returnArray":true,"returnValue":"attribute"}]}},"typeVersion":1.2},{"id":"c2aec608-8302-4bcd-a00b-2e3d293b89bf","name":"Split Out","type":"n8n-nodes-base.splitOut","position":[1456,0],"parameters":{"options":{},"fieldToSplitOut":"jobs"},"typeVersion":1},{"id":"00612b80-a789-4615-9942-e62584e22fdf","name":"Loop Over Items","type":"n8n-nodes-base.splitInBatches","position":[1568,816],"parameters":{"options":{}},"typeVersion":3},{"id":"293a9da0-abfd-491c-9ee6-926fb6de30f1","name":"Wait","type":"n8n-nodes-base.wait","position":[-32,208],"webhookId":"12409f66-fbe7-48bd-b9d7-68449f197264","parameters":{"amount":2},"typeVersion":1.1},{"id":"2f0cb178-8831-458f-9c8c-f9fbbc52abbc","name":"HTTP Request","type":"n8n-nodes-base.httpRequest","position":[176,208],"parameters":{"url":"={{ $json.jobs }}","options":{}},"typeVersion":4.2},{"id":"33d05837-7b57-4f7d-9aa1-d79fe3e71753","name":"HTML1","type":"n8n-nodes-base.html","position":[384,208],"parameters":{"options":{},"operation":"extractHtmlContent","extractionValues":{"values":[{"key":"Title","cssSelector":"div h1"},{"key":"Company","cssSelector":"div span a"},{"key":"Location","cssSelector":"div span[class*='topcard__flavor topcard__flavor--bullet']"},{"key":"Description","cssSelector":"div.description__text.description__text--rich"},{"key":"Job ID","attribute":"data-semaphore-content-urn","cssSelector":"a[data-item-type='semaphore']","returnValue":"attribute"}]}},"typeVersion":1.2},{"id":"43feb566-7427-455c-9109-2a6ba56764f7","name":"Edit Fields","type":"n8n-nodes-base.set","position":[592,208],"parameters":{"options":{},"assignments":{"assignments":[{"id":"240418dc-3349-48d5-ba59-3aa590d71950","name":"Description","type":"string","value":"={{ $json.Description.replaceAll(/\\s+/g, \" \")}}"},{"id":"7b24938f-8b47-488d-9f65-54d036dcffd5","name":"Job ID","type":"string","value":"={{ $json['Job ID'].split(\":\").last() }}"},{"id":"d6addada-9e01-464f-a768-c19f6224c491","name":"Apply Link","type":"string","value":"={{ \"https://www.linkedin.com/jobs/view/\"+ $json['Job ID'].split(\":\").last() }}"},{"id":"21c89d3a-c8b6-44eb-9719-9ae5716a7c76","name":"Title","type":"string","value":"={{ $json.Title }}"},{"id":"da713845-9a81-486e-bff2-1613105e424d","name":"Company","type":"string","value":"={{ $json.Company }}"},{"id":"1a9a31dd-8d51-4f35-b6b6-ca8a348de5d7","name":"Location","type":"string","value":"={{ $json.Location }}"}]}},"typeVersion":3.4},{"id":"8d9894bd-66fe-4069-aff0-84d351b8b5b4","name":"AI Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[32,464],"parameters":{"text":"=You are a precise job-matching assistant.\n\nReturn ONE JSON object wrapped in ```json fences, followed by the line END_OF_JSON.\nNo extra prose. No Markdown inside the JSON. No comments.\n\nINPUTS\njob_description: {{ $json.Description }}\nmy_resume: {{ $('Extract from File').item.json.text }}\n\nTASKS\n1) Parse job_description → job_analysis with keys:\n title (string), company (string), must_have_skills (string[]), nice_to_have_skills (string[]),\n responsibilities (string[]), years_of_experience (string), education_certifications (string),\n location_constraints (string), domain_industry_focus (string), tech_stack (string[]), measurable_kpis (string[])\n\n2) Parse my_resume → resume_analysis:\n core_skills (string[]),\n tools_tech { programming_languages[], frontend_technologies[], backend_technologies[], databases_devops[] },\n years_of_experience_key_areas (object of short strings),\n accomplishments_with_metrics (string[]),\n education_certs (string[]), domains (string[]), roles_titles (string[]),\n leadership_collaboration (string[]), location_work_auth (string)\n\n3) Scoring (integer 0–100):\n - Skills/Tools overlap: 40\n - Relevant experience & seniority: 25\n - Responsibilities alignment: 15\n - Education/Certs fit: 10\n - Domain/industry fit: 5\n - Logistics (location/work auth/availability): 5\n Allow partial credit; deduct up to 10 via red_flags. Clamp to [0,100], integer.\n\n4) Explain the score:\n For each bucket, provide 1–3 concise evidence bullets. Cite \"JD\" or \"Resume\" and include short quoted fragments (escape quotes).\n\n5) Gaps & Suggestions:\n List missing/weak requirements with 1–2 concrete upskilling steps per gap.\n\n6) Cover letter:\n 150–220 words (2–4 short paragraphs), tailored to the role/company.\n Concrete impacts; no greeting/signature. JSON-safe: escape all \" as \\\", use \\n for newlines.\n\nSTRICT CONTENT RULES (to prevent invalid JSON)\n- Do NOT paste raw paragraphs, markdown (**bold**, lists), headings, or multi-line blocks into any array fields.\n- Every array element must be a short phrase (≤ 140 characters), single line, no line breaks, no asterisks, no bullets.\n- If a JD section is long, summarize into short phrases before placing into arrays.\n- Do NOT include unrelated job text inside arrays or objects. Keep each value semantically atomic.\n- Never invent company/title; use \"\" if unknown.\n- No trailing commas anywhere.\n\nSTRICT OUTPUT RULES\n- Output exactly the following schema (keys and types). No extra keys.\n\nSCHEMA\n```json\n{\n \"job_analysis\": {\n \"title\": \"\",\n \"company\": \"\",\n \"must_have_skills\": [],\n \"nice_to_have_skills\": [],\n \"responsibilities\": [],\n \"years_of_experience\": \"\",\n \"education_certifications\": \"\",\n \"location_constraints\": \"\",\n \"domain_industry_focus\": \"\",\n \"tech_stack\": [],\n \"measurable_kpis\": []\n },\n \"resume_analysis\": {\n \"core_skills\": [],\n \"tools_tech\": {\n \"programming_languages\": [],\n \"frontend_technologies\": [],\n \"backend_technologies\": [],\n \"databases_devops\": []\n },\n \"years_of_experience_key_areas\": {},\n \"accomplishments_with_metrics\": [],\n \"education_certs\": [],\n \"domains\": [],\n \"roles_titles\": [],\n \"leadership_collaboration\": [],\n \"location_work_auth\": \"\"\n },\n \"match_score\": 0,\n \"score_explanation\": [\n { \"category\": \"Skills/Tools overlap (40 points)\", \"score\": 0, \"evidence\": [] },\n { \"category\": \"Relevant experience depth & seniority (25 points)\", \"score\": 0, \"evidence\": [] },\n { \"category\": \"Responsibilities alignment (15 points)\", \"score\": 0, \"evidence\": [] },\n { \"category\": \"Education/Certs fit (10 points)\", \"score\": 0, \"evidence\": [] },\n { \"category\": \"Domain/industry fit (5 points)\", \"score\": 0, \"evidence\": [] },\n { \"category\": \"Logistics (location, work auth, availability) (5 points)\", \"score\": 0, \"evidence\": [] }\n ],\n \"red_flags\": [],\n \"gaps_and_suggestions\": [\n { \"gap\": \"\", \"suggestion\": \"\" }\n ],\n \"cover_letter\": \"\"\n}\n","options":{},"promptType":"define"},"typeVersion":2.2},{"id":"cc137b01-1f25-4ba5-955d-6fb7f947bcd6","name":"Google Gemini Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","position":[32,640],"parameters":{"options":{}},"credentials":{"googlePalmApi":{"id":"g6RyTSgLpUyQXe6T","name":"Google Gemini(PaLM) Api account"}},"typeVersion":1},{"id":"4ef714a7-1e5d-4c45-b1fd-d961592ec459","name":"Edit Fields1","type":"n8n-nodes-base.set","position":[432,656],"parameters":{"mode":"raw","options":{},"jsonOutput":"={{ (() => {\n // 0) Read model output from AI Agent node\n const raw = String(($('AI Agent').item.json.output ?? ''));\n\n // 1) Strip code fences\n let s = raw\n .replace(/`{2,3}(?:json)?\\s*/gi, '')\n .replace(/\\s*`{3}\\s*$/gi, '');\n\n // 1b) Normalize curly quotes (Gemini sometimes emits them)\n s = s.replace(/[\\u201C\\u201D]/g, '\"').replace(/\\u2019/g, \"'\");\n\n // 2) Cut at END_OF_JSON if present\n const endIdx = s.indexOf('END_OF_JSON');\n if (endIdx !== -1) s = s.slice(0, endIdx);\n\n // 3) Extract first complete { ... } by brace counting\n const start = s.indexOf('{');\n if (start < 0) return {};\n let depth = 0, inStr = false, esc = false, end = -1;\n for (let i = start; i < s.length; i++) {\n const ch = s[i];\n if (inStr) {\n if (esc) { esc = false; }\n else if (ch === '\\\\') { esc = true; }\n else if (ch === '\"') { inStr = false; }\n } else {\n if (ch === '\"') inStr = true;\n else if (ch === '{') depth++;\n else if (ch === '}') { depth--; if (depth === 0) { end = i + 1; break; } }\n }\n }\n if (end < 0) return {};\n\n const cleaned = s.slice(start, end).trim();\n\n try {\n return JSON.parse(cleaned); // JSON mode expects an OBJECT\n } catch (e) {\n // As a last resort, return an empty object to keep the run alive\n return {};\n }\n})() }}\n"},"typeVersion":3.4},{"id":"b4795633-1f39-4d56-b19d-d2837d987d89","name":"AI Agent1","type":"@n8n/n8n-nodes-langchain.agent","position":[736,656],"parameters":{"text":"You are a ruthless resume editor. Compare the inputs and output ONLY crisp, point-wise changes to improve job fit.\n\nInputs:\n- job_description: {{ $json.Description }}\n- my_resume: {{ $('Extract from File').item.json.text }}\n\nInstructions:\n- Output a numbered list; highest-impact first.\n- One line per point; <= 14 words.\n- Start each line with a tag: [ADD], [REMOVE], [REWRITE], [ORDER], [QUANTIFY], [KEYWORDS], [FORMAT], [FOCUS].\n- Base every point on gaps vs. the job_description; do not invent experience.\n- Prefer concrete actions: skills to add, bullets to rewrite, sections to reorder/remove.\n- Include one line: 'Missing keywords: term1, term2, ...' (only if any).\n- No intros, explanations, code fences, or extra text - points only.\n\nOutput: points only, exactly as specified above.","options":{},"promptType":"define"},"typeVersion":2.2},{"id":"5e3518b8-e203-45ba-9d02-356edf668c0c","name":"Google Gemini Chat Model1","type":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","position":[736,816],"parameters":{"options":{}},"credentials":{"googlePalmApi":{"id":"g6RyTSgLpUyQXe6T","name":"Google Gemini(PaLM) Api account"}},"typeVersion":1},{"id":"ca1e037d-bb59-455c-8738-f1e1ce89f2b4","name":"Append or update row in sheet1","type":"n8n-nodes-base.googleSheets","position":[1072,656],"parameters":{"columns":{"value":{"Link":"={{ $('Edit Fields').item.json['Apply Link'] }}","Score":"={{ $('Edit Fields1').item.json.match_score }}","Title":"={{ $('Edit Fields').item.json.Title }}","Skills":"={{ $('Edit Fields1').item.json.resume_analysis.core_skills }}","Locaton":"={{ $('Edit Fields').item.json.Location }}","Company ":"={{ $('Edit Fields').item.json.Company }}","Cover Letter":"={{ $('Edit Fields1').item.json.cover_letter }}","Improvements":"={{ $json.output }}"},"schema":[{"id":"Title","type":"string","display":true,"required":false,"displayName":"Title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Company ","type":"string","display":true,"required":false,"displayName":"Company ","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Locaton","type":"string","display":true,"required":false,"displayName":"Locaton","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Link","type":"string","display":true,"removed":false,"required":false,"displayName":"Link","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Score","type":"string","display":true,"required":false,"displayName":"Score","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Cover Letter","type":"string","display":true,"required":false,"displayName":"Cover Letter","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Skills","type":"string","display":true,"removed":false,"required":false,"displayName":"Skills","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Improvements","type":"string","display":true,"removed":false,"required":false,"displayName":"Improvements","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["Link"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"appendOrUpdate","sheetName":{"__rl":true,"mode":"list","value":11035642,"cachedResultUrl":"https://docs.google.com/spreadsheets/d/1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g/edit#gid=11035642","cachedResultName":"Result"},"documentId":{"__rl":true,"mode":"list","value":"1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1m_p1yu6j10cuHK-bImqz86Oraegz5j9ii2u5LJqxg1g/edit?usp=drivesdk","cachedResultName":"Job Search N8N"}},"credentials":{"googleSheetsOAuth2Api":{"id":"oD5JyqmvqMOPNTeR","name":"Google Sheets account"}},"typeVersion":4.7},{"id":"d2b5241e-c511-42c9-8301-e75c1b5c22c9","name":"Send a message","type":"n8n-nodes-base.gmail","position":[1984,800],"webhookId":"f0d6158b-a72b-4e84-8f3e-0e8ecfaeda72","parameters":{"sendTo":"","message":"Hey, your job search results with resume changes are ready in your sheet for today","options":{},"subject":"Job search results","emailType":"text"},"credentials":{"gmailOAuth2":{"id":"Zd1C7CJsZcTcApAG","name":"Gmail account"}},"typeVersion":2.1},{"id":"9100d62e-1108-4ba2-b6dd-91576b1c015b","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[112,-240],"parameters":{"height":192,"content":"## Add Google Cloud Credentials\n\n1. sign in with google\n2. Upload your resume and change to anyone can view\n3. Paste your link\n"},"typeVersion":1},{"id":"ff1c1aad-5ab0-49c3-805a-092e1e371985","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[576,-224],"parameters":{"height":176,"content":"## Add Google Cloud Credentials\n\n1. sign in with google\n2. Prepare your sheet filter\n3. Add your sheet Link"},"typeVersion":1},{"id":"9d6df7e1-3a16-483b-add7-9d0e2fc95498","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[1904,592],"parameters":{"content":"## Add Google Cloud Credentials\n\n- sign in with google\n- Enter your e-mail address"},"typeVersion":1},{"id":"986e4584-7f86-4a56-97d4-f6a09835808e","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[1008,448],"parameters":{"height":176,"content":"## Add Google Cloud Credentials\n\n1. sign in with google\n2. Select your sheet and sub sheet"},"typeVersion":1},{"id":"b4e4313d-e9e1-4e81-a613-de7de233eec1","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-16,784],"parameters":{"height":176,"content":"## Add Gemini Free tier api key\n\n1. sign in with google\n2. Create API key and project\n3. Add Free Tier key"},"typeVersion":1},{"id":"65c1327d-e61b-47ee-bd55-8ddf43c58cd8","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[640,464],"parameters":{"height":176,"content":"## Add Gemini Free tier api key\n\n1. sign in with google\n2. Create API key and project\n3. Add Free Tier key"},"typeVersion":1},{"id":"94653150-71a5-411b-bed3-a0771b9fef44","name":"Schedule Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[-48,0],"parameters":{"rule":{"interval":[{"triggerAtHour":5}]}},"typeVersion":1.2},{"id":"c28849bf-1393-41d1-88e7-aa2d1c8c3c8c","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[640,-624],"parameters":{"height":320,"content":"# Job search ultimate workflow - @jugaldb\n\n1. Takes about 1 hour to run\n2. Finds all relevant jobs posted in last one day, runs at 5 AM everyday\n3. Sends you an e-mail whne complete"},"typeVersion":1}],"active":true,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"25e5c7d3-60ea-47bf-b4bc-cb62a22a3ad7","connections":{"HTML":{"main":[[{"node":"Split Out","type":"main","index":0}]]},"Wait":{"main":[[{"node":"HTTP Request","type":"main","index":0}]]},"HTML1":{"main":[[{"node":"Edit Fields","type":"main","index":0}]]},"AI Agent":{"main":[[{"node":"Edit Fields1","type":"main","index":0}]]},"AI Agent1":{"main":[[{"node":"Append or update row in sheet1","type":"main","index":0}]]},"Split Out":{"main":[[{"node":"Loop Over Items","type":"main","index":0}]]},"Edit Fields":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"Edit Fields1":{"main":[[{"node":"AI Agent1","type":"main","index":0}]]},"HTTP Request":{"main":[[{"node":"HTML1","type":"main","index":0}]]},"Download file":{"main":[[{"node":"Extract from File","type":"main","index":0}]]},"Loop Over Items":{"main":[[{"node":"Send a message","type":"main","index":0}],[{"node":"Wait","type":"main","index":0}]]},"Schedule Trigger":{"main":[[{"node":"Download file","type":"main","index":0}]]},"Extract from File":{"main":[[{"node":"Get row(s) in sheet","type":"main","index":0}]]},"Get row(s) in sheet":{"main":[[{"node":"LinkedIn Search URL","type":"main","index":0}]]},"LinkedIn Search URL":{"main":[[{"node":"Fetch jobs from LinkedIn","type":"main","index":0}]]},"Fetch jobs from LinkedIn":{"main":[[{"node":"HTML","type":"main","index":0}]]},"Google Gemini Chat Model":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]},"Google Gemini Chat Model1":{"ai_languageModel":[[{"node":"AI Agent1","type":"ai_languageModel","index":0}]]},"Append or update row in sheet1":{"main":[[{"node":"Loop Over Items","type":"main","index":0}]]}}} \ No newline at end of file