n8n-nodes-base 1.98.1 → 1.99.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/credentials/GoogleSheetsOAuth2Api.credentials.js +1 -0
  2. package/dist/credentials/GoogleSheetsOAuth2Api.credentials.js.map +1 -1
  3. package/dist/credentials/JiraSoftwareCloudApi.credentials.js +1 -1
  4. package/dist/credentials/JiraSoftwareCloudApi.credentials.js.map +1 -1
  5. package/dist/credentials/JiraSoftwareServerApi.credentials.js +1 -1
  6. package/dist/credentials/JiraSoftwareServerApi.credentials.js.map +1 -1
  7. package/dist/credentials/JiraSoftwareServerPatApi.credentials.js +1 -1
  8. package/dist/credentials/JiraSoftwareServerPatApi.credentials.js.map +1 -1
  9. package/dist/nodes/Code/ExecutionError.js +11 -4
  10. package/dist/nodes/Code/ExecutionError.js.map +1 -1
  11. package/dist/nodes/Evaluation/utils/evaluationTriggerUtils.js +3 -2
  12. package/dist/nodes/Evaluation/utils/evaluationTriggerUtils.js.map +1 -1
  13. package/dist/nodes/ExecutionData/ExecutionData.node.js +35 -10
  14. package/dist/nodes/ExecutionData/ExecutionData.node.js.map +1 -1
  15. package/dist/nodes/Google/Sheet/v2/actions/utils/readOperation.js +7 -1
  16. package/dist/nodes/Google/Sheet/v2/actions/utils/readOperation.js.map +1 -1
  17. package/dist/nodes/Google/Sheet/v2/helpers/GoogleSheet.js +14 -6
  18. package/dist/nodes/Google/Sheet/v2/helpers/GoogleSheet.js.map +1 -1
  19. package/dist/nodes/Google/Sheet/v2/methods/resourceMapping.js +1 -1
  20. package/dist/nodes/Google/Sheet/v2/methods/resourceMapping.js.map +1 -1
  21. package/dist/nodes/Microsoft/SharePoint/MicrosoftSharePoint.node.js +1 -2
  22. package/dist/nodes/Microsoft/SharePoint/MicrosoftSharePoint.node.js.map +1 -1
  23. package/dist/nodes/Microsoft/Sql/GenericFunctions.js.map +1 -1
  24. package/dist/nodes/Onfleet/Onfleet.node.js.map +1 -1
  25. package/dist/nodes/Postgres/v1/genericFunctions.js.map +1 -1
  26. package/dist/types/credentials.json +4 -4
  27. package/dist/types/nodes.json +4 -4
  28. package/package.json +7 -7
@@ -31,6 +31,7 @@ class GoogleSheetsOAuth2Api {
31
31
  this.name = "googleSheetsOAuth2Api";
32
32
  this.extends = ["googleOAuth2Api"];
33
33
  this.displayName = "Google Sheets OAuth2 API";
34
+ this.icon = "node:n8n-nodes-base.googleSheets";
34
35
  this.documentationUrl = "google/oauth-single-service";
35
36
  this.properties = [
36
37
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../credentials/GoogleSheetsOAuth2Api.credentials.ts"],"sourcesContent":["import type { ICredentialType, INodeProperties } from 'n8n-workflow';\n\nconst scopes = [\n\t'https://www.googleapis.com/auth/drive.file',\n\t'https://www.googleapis.com/auth/spreadsheets',\n\t'https://www.googleapis.com/auth/drive.metadata',\n];\n\nexport class GoogleSheetsOAuth2Api implements ICredentialType {\n\tname = 'googleSheetsOAuth2Api';\n\n\textends = ['googleOAuth2Api'];\n\n\tdisplayName = 'Google Sheets OAuth2 API';\n\n\tdocumentationUrl = 'google/oauth-single-service';\n\n\tproperties: INodeProperties[] = [\n\t\t{\n\t\t\tdisplayName: 'Scope',\n\t\t\tname: 'scope',\n\t\t\ttype: 'hidden',\n\t\t\tdefault: scopes.join(' '),\n\t\t},\n\t\t{\n\t\t\tdisplayName:\n\t\t\t\t'Make sure you enabled the following APIs & Services in the Google Cloud Console: Google Drive API, Google Sheets API. <a href=\"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-generic/#scopes\" target=\"_blank\">More info</a>.',\n\t\t\tname: 'notice',\n\t\t\ttype: 'notice',\n\t\t\tdefault: '',\n\t\t\tdisplayOptions: {\n\t\t\t\thideOnCloud: true,\n\t\t\t},\n\t\t},\n\t];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,MAAM,SAAS;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACD;AAEO,MAAM,sBAAiD;AAAA,EAAvD;AACN,gBAAO;AAEP,mBAAU,CAAC,iBAAiB;AAE5B,uBAAc;AAEd,4BAAmB;AAEnB,sBAAgC;AAAA,MAC/B;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,OAAO,KAAK,GAAG;AAAA,MACzB;AAAA,MACA;AAAA,QACC,aACC;AAAA,QACD,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,gBAAgB;AAAA,UACf,aAAa;AAAA,QACd;AAAA,MACD;AAAA,IACD;AAAA;AACD;","names":[]}
1
+ {"version":3,"sources":["../../credentials/GoogleSheetsOAuth2Api.credentials.ts"],"sourcesContent":["import type { Icon, ICredentialType, INodeProperties } from 'n8n-workflow';\n\nconst scopes = [\n\t'https://www.googleapis.com/auth/drive.file',\n\t'https://www.googleapis.com/auth/spreadsheets',\n\t'https://www.googleapis.com/auth/drive.metadata',\n];\n\nexport class GoogleSheetsOAuth2Api implements ICredentialType {\n\tname = 'googleSheetsOAuth2Api';\n\n\textends = ['googleOAuth2Api'];\n\n\tdisplayName = 'Google Sheets OAuth2 API';\n\n\ticon: Icon = 'node:n8n-nodes-base.googleSheets';\n\n\tdocumentationUrl = 'google/oauth-single-service';\n\n\tproperties: INodeProperties[] = [\n\t\t{\n\t\t\tdisplayName: 'Scope',\n\t\t\tname: 'scope',\n\t\t\ttype: 'hidden',\n\t\t\tdefault: scopes.join(' '),\n\t\t},\n\t\t{\n\t\t\tdisplayName:\n\t\t\t\t'Make sure you enabled the following APIs & Services in the Google Cloud Console: Google Drive API, Google Sheets API. <a href=\"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-generic/#scopes\" target=\"_blank\">More info</a>.',\n\t\t\tname: 'notice',\n\t\t\ttype: 'notice',\n\t\t\tdefault: '',\n\t\t\tdisplayOptions: {\n\t\t\t\thideOnCloud: true,\n\t\t\t},\n\t\t},\n\t];\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,MAAM,SAAS;AAAA,EACd;AAAA,EACA;AAAA,EACA;AACD;AAEO,MAAM,sBAAiD;AAAA,EAAvD;AACN,gBAAO;AAEP,mBAAU,CAAC,iBAAiB;AAE5B,uBAAc;AAEd,gBAAa;AAEb,4BAAmB;AAEnB,sBAAgC;AAAA,MAC/B;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS,OAAO,KAAK,GAAG;AAAA,MACzB;AAAA,MACA;AAAA,QACC,aACC;AAAA,QACD,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,gBAAgB;AAAA,UACf,aAAa;AAAA,QACd;AAAA,MACD;AAAA,IACD;AAAA;AACD;","names":[]}
@@ -61,7 +61,7 @@ class JiraSoftwareCloudApi {
61
61
  this.test = {
62
62
  request: {
63
63
  baseURL: "={{$credentials?.domain}}",
64
- url: "/rest/api/2/project"
64
+ url: "/rest/api/2/myself"
65
65
  }
66
66
  };
67
67
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../credentials/JiraSoftwareCloudApi.credentials.ts"],"sourcesContent":["import type {\n\tIAuthenticateGeneric,\n\tICredentialTestRequest,\n\tICredentialType,\n\tINodeProperties,\n} from 'n8n-workflow';\n\nexport class JiraSoftwareCloudApi implements ICredentialType {\n\tname = 'jiraSoftwareCloudApi';\n\n\tdisplayName = 'Jira SW Cloud API';\n\n\tdocumentationUrl = 'jira';\n\n\tproperties: INodeProperties[] = [\n\t\t{\n\t\t\tdisplayName: 'Email',\n\t\t\tname: 'email',\n\t\t\ttype: 'string',\n\t\t\tplaceholder: 'name@email.com',\n\t\t\tdefault: '',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'API Token',\n\t\t\tname: 'apiToken',\n\t\t\ttype: 'string',\n\t\t\ttypeOptions: { password: true },\n\t\t\tdefault: '',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Domain',\n\t\t\tname: 'domain',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://example.atlassian.net',\n\t\t},\n\t];\n\n\tauthenticate: IAuthenticateGeneric = {\n\t\ttype: 'generic',\n\t\tproperties: {\n\t\t\tauth: {\n\t\t\t\tusername: '={{$credentials.email}}',\n\t\t\t\tpassword: '={{$credentials.apiToken}}',\n\t\t\t},\n\t\t},\n\t};\n\n\ttest: ICredentialTestRequest = {\n\t\trequest: {\n\t\t\tbaseURL: '={{$credentials?.domain}}',\n\t\t\turl: '/rest/api/2/project',\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,MAAM,qBAAgD;AAAA,EAAtD;AACN,gBAAO;AAEP,uBAAc;AAEd,4BAAmB;AAEnB,sBAAgC;AAAA,MAC/B;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,MACV;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa,EAAE,UAAU,KAAK;AAAA,QAC9B,SAAS;AAAA,MACV;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa;AAAA,MACd;AAAA,IACD;AAEA,wBAAqC;AAAA,MACpC,MAAM;AAAA,MACN,YAAY;AAAA,QACX,MAAM;AAAA,UACL,UAAU;AAAA,UACV,UAAU;AAAA,QACX;AAAA,MACD;AAAA,IACD;AAEA,gBAA+B;AAAA,MAC9B,SAAS;AAAA,QACR,SAAS;AAAA,QACT,KAAK;AAAA,MACN;AAAA,IACD;AAAA;AACD;","names":[]}
1
+ {"version":3,"sources":["../../credentials/JiraSoftwareCloudApi.credentials.ts"],"sourcesContent":["import type {\n\tIAuthenticateGeneric,\n\tICredentialTestRequest,\n\tICredentialType,\n\tINodeProperties,\n} from 'n8n-workflow';\n\nexport class JiraSoftwareCloudApi implements ICredentialType {\n\tname = 'jiraSoftwareCloudApi';\n\n\tdisplayName = 'Jira SW Cloud API';\n\n\tdocumentationUrl = 'jira';\n\n\tproperties: INodeProperties[] = [\n\t\t{\n\t\t\tdisplayName: 'Email',\n\t\t\tname: 'email',\n\t\t\ttype: 'string',\n\t\t\tplaceholder: 'name@email.com',\n\t\t\tdefault: '',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'API Token',\n\t\t\tname: 'apiToken',\n\t\t\ttype: 'string',\n\t\t\ttypeOptions: { password: true },\n\t\t\tdefault: '',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Domain',\n\t\t\tname: 'domain',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://example.atlassian.net',\n\t\t},\n\t];\n\n\tauthenticate: IAuthenticateGeneric = {\n\t\ttype: 'generic',\n\t\tproperties: {\n\t\t\tauth: {\n\t\t\t\tusername: '={{$credentials.email}}',\n\t\t\t\tpassword: '={{$credentials.apiToken}}',\n\t\t\t},\n\t\t},\n\t};\n\n\ttest: ICredentialTestRequest = {\n\t\trequest: {\n\t\t\tbaseURL: '={{$credentials?.domain}}',\n\t\t\turl: '/rest/api/2/myself',\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,MAAM,qBAAgD;AAAA,EAAtD;AACN,gBAAO;AAEP,uBAAc;AAEd,4BAAmB;AAEnB,sBAAgC;AAAA,MAC/B;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,MACV;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa,EAAE,UAAU,KAAK;AAAA,QAC9B,SAAS;AAAA,MACV;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa;AAAA,MACd;AAAA,IACD;AAEA,wBAAqC;AAAA,MACpC,MAAM;AAAA,MACN,YAAY;AAAA,QACX,MAAM;AAAA,UACL,UAAU;AAAA,UACV,UAAU;AAAA,QACX;AAAA,MACD;AAAA,IACD;AAEA,gBAA+B;AAAA,MAC9B,SAAS;AAAA,QACR,SAAS;AAAA,QACT,KAAK;AAAA,MACN;AAAA,IACD;AAAA;AACD;","names":[]}
@@ -63,7 +63,7 @@ class JiraSoftwareServerApi {
63
63
  this.test = {
64
64
  request: {
65
65
  baseURL: "={{$credentials?.domain}}",
66
- url: "/rest/api/2/project"
66
+ url: "/rest/api/2/myself"
67
67
  }
68
68
  };
69
69
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../credentials/JiraSoftwareServerApi.credentials.ts"],"sourcesContent":["import type {\n\tIAuthenticateGeneric,\n\tICredentialTestRequest,\n\tICredentialType,\n\tINodeProperties,\n} from 'n8n-workflow';\n\nexport class JiraSoftwareServerApi implements ICredentialType {\n\tname = 'jiraSoftwareServerApi';\n\n\tdisplayName = 'Jira SW Server API';\n\n\tdocumentationUrl = 'jira';\n\n\tproperties: INodeProperties[] = [\n\t\t{\n\t\t\tdisplayName: 'Email',\n\t\t\tname: 'email',\n\t\t\ttype: 'string',\n\t\t\tplaceholder: 'name@email.com',\n\t\t\tdefault: '',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Password',\n\t\t\tname: 'password',\n\t\t\ttypeOptions: {\n\t\t\t\tpassword: true,\n\t\t\t},\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Domain',\n\t\t\tname: 'domain',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://example.com',\n\t\t},\n\t];\n\n\tauthenticate: IAuthenticateGeneric = {\n\t\ttype: 'generic',\n\t\tproperties: {\n\t\t\tauth: {\n\t\t\t\tusername: '={{$credentials.email}}',\n\t\t\t\tpassword: '={{$credentials.password}}',\n\t\t\t},\n\t\t},\n\t};\n\n\ttest: ICredentialTestRequest = {\n\t\trequest: {\n\t\t\tbaseURL: '={{$credentials?.domain}}',\n\t\t\turl: '/rest/api/2/project',\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,MAAM,sBAAiD;AAAA,EAAvD;AACN,gBAAO;AAEP,uBAAc;AAEd,4BAAmB;AAEnB,sBAAgC;AAAA,MAC/B;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,MACV;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,aAAa;AAAA,UACZ,UAAU;AAAA,QACX;AAAA,QACA,MAAM;AAAA,QACN,SAAS;AAAA,MACV;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa;AAAA,MACd;AAAA,IACD;AAEA,wBAAqC;AAAA,MACpC,MAAM;AAAA,MACN,YAAY;AAAA,QACX,MAAM;AAAA,UACL,UAAU;AAAA,UACV,UAAU;AAAA,QACX;AAAA,MACD;AAAA,IACD;AAEA,gBAA+B;AAAA,MAC9B,SAAS;AAAA,QACR,SAAS;AAAA,QACT,KAAK;AAAA,MACN;AAAA,IACD;AAAA;AACD;","names":[]}
1
+ {"version":3,"sources":["../../credentials/JiraSoftwareServerApi.credentials.ts"],"sourcesContent":["import type {\n\tIAuthenticateGeneric,\n\tICredentialTestRequest,\n\tICredentialType,\n\tINodeProperties,\n} from 'n8n-workflow';\n\nexport class JiraSoftwareServerApi implements ICredentialType {\n\tname = 'jiraSoftwareServerApi';\n\n\tdisplayName = 'Jira SW Server API';\n\n\tdocumentationUrl = 'jira';\n\n\tproperties: INodeProperties[] = [\n\t\t{\n\t\t\tdisplayName: 'Email',\n\t\t\tname: 'email',\n\t\t\ttype: 'string',\n\t\t\tplaceholder: 'name@email.com',\n\t\t\tdefault: '',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Password',\n\t\t\tname: 'password',\n\t\t\ttypeOptions: {\n\t\t\t\tpassword: true,\n\t\t\t},\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Domain',\n\t\t\tname: 'domain',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://example.com',\n\t\t},\n\t];\n\n\tauthenticate: IAuthenticateGeneric = {\n\t\ttype: 'generic',\n\t\tproperties: {\n\t\t\tauth: {\n\t\t\t\tusername: '={{$credentials.email}}',\n\t\t\t\tpassword: '={{$credentials.password}}',\n\t\t\t},\n\t\t},\n\t};\n\n\ttest: ICredentialTestRequest = {\n\t\trequest: {\n\t\t\tbaseURL: '={{$credentials?.domain}}',\n\t\t\turl: '/rest/api/2/myself',\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,MAAM,sBAAiD;AAAA,EAAvD;AACN,gBAAO;AAEP,uBAAc;AAEd,4BAAmB;AAEnB,sBAAgC;AAAA,MAC/B;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,aAAa;AAAA,QACb,SAAS;AAAA,MACV;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,aAAa;AAAA,UACZ,UAAU;AAAA,QACX;AAAA,QACA,MAAM;AAAA,QACN,SAAS;AAAA,MACV;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa;AAAA,MACd;AAAA,IACD;AAEA,wBAAqC;AAAA,MACpC,MAAM;AAAA,MACN,YAAY;AAAA,QACX,MAAM;AAAA,UACL,UAAU;AAAA,UACV,UAAU;AAAA,QACX;AAAA,MACD;AAAA,IACD;AAEA,gBAA+B;AAAA,MAC9B,SAAS;AAAA,QACR,SAAS;AAAA,QACT,KAAK;AAAA,MACN;AAAA,IACD;AAAA;AACD;","names":[]}
@@ -53,7 +53,7 @@ class JiraSoftwareServerPatApi {
53
53
  this.test = {
54
54
  request: {
55
55
  baseURL: "={{$credentials?.domain}}",
56
- url: "/rest/api/2/project"
56
+ url: "/rest/api/2/myself"
57
57
  }
58
58
  };
59
59
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../credentials/JiraSoftwareServerPatApi.credentials.ts"],"sourcesContent":["import type {\n\tIAuthenticateGeneric,\n\tICredentialTestRequest,\n\tICredentialType,\n\tINodeProperties,\n} from 'n8n-workflow';\n\nexport class JiraSoftwareServerPatApi implements ICredentialType {\n\tname = 'jiraSoftwareServerPatApi';\n\n\tdisplayName = 'Jira SW Server (PAT) API';\n\n\tdocumentationUrl = 'jira';\n\n\tproperties: INodeProperties[] = [\n\t\t{\n\t\t\tdisplayName: 'Personal Access Token',\n\t\t\tname: 'personalAccessToken',\n\t\t\ttypeOptions: { password: true },\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Domain',\n\t\t\tname: 'domain',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://example.com',\n\t\t},\n\t];\n\n\tauthenticate: IAuthenticateGeneric = {\n\t\ttype: 'generic',\n\t\tproperties: {\n\t\t\theaders: {\n\t\t\t\tAuthorization: '=Bearer {{$credentials.personalAccessToken}}',\n\t\t\t},\n\t\t},\n\t};\n\n\ttest: ICredentialTestRequest = {\n\t\trequest: {\n\t\t\tbaseURL: '={{$credentials?.domain}}',\n\t\t\turl: '/rest/api/2/project',\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,MAAM,yBAAoD;AAAA,EAA1D;AACN,gBAAO;AAEP,uBAAc;AAEd,4BAAmB;AAEnB,sBAAgC;AAAA,MAC/B;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,aAAa,EAAE,UAAU,KAAK;AAAA,QAC9B,MAAM;AAAA,QACN,SAAS;AAAA,MACV;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa;AAAA,MACd;AAAA,IACD;AAEA,wBAAqC;AAAA,MACpC,MAAM;AAAA,MACN,YAAY;AAAA,QACX,SAAS;AAAA,UACR,eAAe;AAAA,QAChB;AAAA,MACD;AAAA,IACD;AAEA,gBAA+B;AAAA,MAC9B,SAAS;AAAA,QACR,SAAS;AAAA,QACT,KAAK;AAAA,MACN;AAAA,IACD;AAAA;AACD;","names":[]}
1
+ {"version":3,"sources":["../../credentials/JiraSoftwareServerPatApi.credentials.ts"],"sourcesContent":["import type {\n\tIAuthenticateGeneric,\n\tICredentialTestRequest,\n\tICredentialType,\n\tINodeProperties,\n} from 'n8n-workflow';\n\nexport class JiraSoftwareServerPatApi implements ICredentialType {\n\tname = 'jiraSoftwareServerPatApi';\n\n\tdisplayName = 'Jira SW Server (PAT) API';\n\n\tdocumentationUrl = 'jira';\n\n\tproperties: INodeProperties[] = [\n\t\t{\n\t\t\tdisplayName: 'Personal Access Token',\n\t\t\tname: 'personalAccessToken',\n\t\t\ttypeOptions: { password: true },\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t},\n\t\t{\n\t\t\tdisplayName: 'Domain',\n\t\t\tname: 'domain',\n\t\t\ttype: 'string',\n\t\t\tdefault: '',\n\t\t\tplaceholder: 'https://example.com',\n\t\t},\n\t];\n\n\tauthenticate: IAuthenticateGeneric = {\n\t\ttype: 'generic',\n\t\tproperties: {\n\t\t\theaders: {\n\t\t\t\tAuthorization: '=Bearer {{$credentials.personalAccessToken}}',\n\t\t\t},\n\t\t},\n\t};\n\n\ttest: ICredentialTestRequest = {\n\t\trequest: {\n\t\t\tbaseURL: '={{$credentials?.domain}}',\n\t\t\turl: '/rest/api/2/myself',\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOO,MAAM,yBAAoD;AAAA,EAA1D;AACN,gBAAO;AAEP,uBAAc;AAEd,4BAAmB;AAEnB,sBAAgC;AAAA,MAC/B;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,aAAa,EAAE,UAAU,KAAK;AAAA,QAC9B,MAAM;AAAA,QACN,SAAS;AAAA,MACV;AAAA,MACA;AAAA,QACC,aAAa;AAAA,QACb,MAAM;AAAA,QACN,MAAM;AAAA,QACN,SAAS;AAAA,QACT,aAAa;AAAA,MACd;AAAA,IACD;AAEA,wBAAqC;AAAA,MACpC,MAAM;AAAA,MACN,YAAY;AAAA,QACX,SAAS;AAAA,UACR,eAAe;AAAA,QAChB;AAAA,MACD;AAAA,IACD;AAEA,gBAA+B;AAAA,MAC9B,SAAS;AAAA,QACR,SAAS;AAAA,QACT,KAAK;AAAA,MACN;AAAA,IACD;AAAA;AACD;","names":[]}
@@ -41,13 +41,14 @@ class ExecutionError extends import_n8n_workflow.ApplicationError {
41
41
  * Populate error `message` and `description` from error `stack`.
42
42
  */
43
43
  populateFromStack() {
44
- const stackRows = this.stack.split("\n");
44
+ const stackRows = this.stack && typeof this.stack === "string" ? this.stack.split("\n") : [];
45
45
  if (stackRows.length === 0) {
46
46
  this.message = "Unknown error";
47
+ return;
47
48
  }
48
49
  const messageRow = stackRows.find((line) => line.includes("Error:"));
49
50
  const lineNumberRow = stackRows.find((line) => line.includes("Code:"));
50
- const lineNumberDisplay = this.toLineNumberDisplay(lineNumberRow);
51
+ const lineNumberDisplay = this.toLineNumberDisplay(lineNumberRow) || "";
51
52
  if (!messageRow) {
52
53
  this.message = `Unknown error ${lineNumberDisplay}`;
53
54
  return;
@@ -58,7 +59,7 @@ class ExecutionError extends import_n8n_workflow.ApplicationError {
58
59
  this.message = `Unknown error ${lineNumberDisplay}`;
59
60
  return;
60
61
  }
61
- this.message = `${errorDetails} ${lineNumberDisplay}`;
62
+ this.message = `${errorDetails} ${lineNumberDisplay}`.trim();
62
63
  }
63
64
  toLineNumberDisplay(lineNumberRow) {
64
65
  const errorLineNumberMatch = lineNumberRow?.match(/Code:(?<lineNumber>\d+)/);
@@ -70,7 +71,13 @@ class ExecutionError extends import_n8n_workflow.ApplicationError {
70
71
  }
71
72
  toErrorDetailsAndType(messageRow) {
72
73
  if (!messageRow) return [null, null];
73
- const [errorDetails, errorType] = messageRow.split(":").reverse().map((i) => i.trim());
74
+ messageRow = messageRow.replace(/^Error: /, "");
75
+ const colonIndex = messageRow.indexOf(": ");
76
+ if (colonIndex === -1) {
77
+ return [messageRow.trim(), null];
78
+ }
79
+ const errorType = messageRow.substring(0, colonIndex).trim();
80
+ const errorDetails = messageRow.substring(colonIndex + 2).trim();
74
81
  return [errorDetails, errorType === "Error" ? null : errorType];
75
82
  }
76
83
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../nodes/Code/ExecutionError.ts"],"sourcesContent":["import { ApplicationError } from 'n8n-workflow';\n\nexport class ExecutionError extends ApplicationError {\n\tdescription: string | null = null;\n\n\titemIndex: number | undefined = undefined;\n\n\tcontext: { itemIndex: number } | undefined = undefined;\n\n\tstack = '';\n\n\tlineNumber: number | undefined = undefined;\n\n\tconstructor(error: Error & { stack?: string }, itemIndex?: number) {\n\t\tsuper(error.message);\n\t\tthis.itemIndex = itemIndex;\n\n\t\tif (this.itemIndex !== undefined) {\n\t\t\tthis.context = { itemIndex: this.itemIndex };\n\t\t}\n\n\t\tthis.stack = error.stack ?? '';\n\n\t\tthis.populateFromStack();\n\t}\n\n\t/**\n\t * Populate error `message` and `description` from error `stack`.\n\t */\n\tprivate populateFromStack() {\n\t\tconst stackRows = this.stack.split('\\n');\n\n\t\tif (stackRows.length === 0) {\n\t\t\tthis.message = 'Unknown error';\n\t\t}\n\n\t\tconst messageRow = stackRows.find((line) => line.includes('Error:'));\n\t\tconst lineNumberRow = stackRows.find((line) => line.includes('Code:'));\n\t\tconst lineNumberDisplay = this.toLineNumberDisplay(lineNumberRow);\n\n\t\tif (!messageRow) {\n\t\t\tthis.message = `Unknown error ${lineNumberDisplay}`;\n\t\t\treturn;\n\t\t}\n\n\t\tconst [errorDetails, errorType] = this.toErrorDetailsAndType(messageRow);\n\n\t\tif (errorType) this.description = errorType;\n\n\t\tif (!errorDetails) {\n\t\t\tthis.message = `Unknown error ${lineNumberDisplay}`;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.message = `${errorDetails} ${lineNumberDisplay}`;\n\t}\n\n\tprivate toLineNumberDisplay(lineNumberRow?: string) {\n\t\tconst errorLineNumberMatch = lineNumberRow?.match(/Code:(?<lineNumber>\\d+)/);\n\n\t\tif (!errorLineNumberMatch?.groups?.lineNumber) return null;\n\n\t\tconst lineNumber = errorLineNumberMatch.groups.lineNumber;\n\n\t\tthis.lineNumber = Number(lineNumber);\n\n\t\tif (!lineNumber) return '';\n\n\t\treturn this.itemIndex === undefined\n\t\t\t? `[line ${lineNumber}]`\n\t\t\t: `[line ${lineNumber}, for item ${this.itemIndex}]`;\n\t}\n\n\tprivate toErrorDetailsAndType(messageRow?: string) {\n\t\tif (!messageRow) return [null, null];\n\n\t\tconst [errorDetails, errorType] = messageRow\n\t\t\t.split(':')\n\t\t\t.reverse()\n\t\t\t.map((i) => i.trim());\n\n\t\treturn [errorDetails, errorType === 'Error' ? null : errorType];\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAiC;AAE1B,MAAM,uBAAuB,qCAAiB;AAAA,EAWpD,YAAY,OAAmC,WAAoB;AAClE,UAAM,MAAM,OAAO;AAXpB,uBAA6B;AAE7B,qBAAgC;AAEhC,mBAA6C;AAE7C,iBAAQ;AAER,sBAAiC;AAIhC,SAAK,YAAY;AAEjB,QAAI,KAAK,cAAc,QAAW;AACjC,WAAK,UAAU,EAAE,WAAW,KAAK,UAAU;AAAA,IAC5C;AAEA,SAAK,QAAQ,MAAM,SAAS;AAE5B,SAAK,kBAAkB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB;AAC3B,UAAM,YAAY,KAAK,MAAM,MAAM,IAAI;AAEvC,QAAI,UAAU,WAAW,GAAG;AAC3B,WAAK,UAAU;AAAA,IAChB;AAEA,UAAM,aAAa,UAAU,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ,CAAC;AACnE,UAAM,gBAAgB,UAAU,KAAK,CAAC,SAAS,KAAK,SAAS,OAAO,CAAC;AACrE,UAAM,oBAAoB,KAAK,oBAAoB,aAAa;AAEhE,QAAI,CAAC,YAAY;AAChB,WAAK,UAAU,iBAAiB,iBAAiB;AACjD;AAAA,IACD;AAEA,UAAM,CAAC,cAAc,SAAS,IAAI,KAAK,sBAAsB,UAAU;AAEvE,QAAI,UAAW,MAAK,cAAc;AAElC,QAAI,CAAC,cAAc;AAClB,WAAK,UAAU,iBAAiB,iBAAiB;AACjD;AAAA,IACD;AAEA,SAAK,UAAU,GAAG,YAAY,IAAI,iBAAiB;AAAA,EACpD;AAAA,EAEQ,oBAAoB,eAAwB;AACnD,UAAM,uBAAuB,eAAe,MAAM,yBAAyB;AAE3E,QAAI,CAAC,sBAAsB,QAAQ,WAAY,QAAO;AAEtD,UAAM,aAAa,qBAAqB,OAAO;AAE/C,SAAK,aAAa,OAAO,UAAU;AAEnC,QAAI,CAAC,WAAY,QAAO;AAExB,WAAO,KAAK,cAAc,SACvB,SAAS,UAAU,MACnB,SAAS,UAAU,cAAc,KAAK,SAAS;AAAA,EACnD;AAAA,EAEQ,sBAAsB,YAAqB;AAClD,QAAI,CAAC,WAAY,QAAO,CAAC,MAAM,IAAI;AAEnC,UAAM,CAAC,cAAc,SAAS,IAAI,WAChC,MAAM,GAAG,EACT,QAAQ,EACR,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;AAErB,WAAO,CAAC,cAAc,cAAc,UAAU,OAAO,SAAS;AAAA,EAC/D;AACD;","names":[]}
1
+ {"version":3,"sources":["../../../nodes/Code/ExecutionError.ts"],"sourcesContent":["import { ApplicationError } from 'n8n-workflow';\n\nexport class ExecutionError extends ApplicationError {\n\tdescription: string | null = null;\n\n\titemIndex: number | undefined = undefined;\n\n\tcontext: { itemIndex: number } | undefined = undefined;\n\n\tstack = '';\n\n\tlineNumber: number | undefined = undefined;\n\n\tconstructor(error: Error & { stack?: string }, itemIndex?: number) {\n\t\tsuper(error.message);\n\t\tthis.itemIndex = itemIndex;\n\n\t\tif (this.itemIndex !== undefined) {\n\t\t\tthis.context = { itemIndex: this.itemIndex };\n\t\t}\n\n\t\tthis.stack = error.stack ?? '';\n\n\t\tthis.populateFromStack();\n\t}\n\n\t/**\n\t * Populate error `message` and `description` from error `stack`.\n\t */\n\tprivate populateFromStack() {\n\t\tconst stackRows = this.stack && typeof this.stack === 'string' ? this.stack.split('\\n') : [];\n\n\t\tif (stackRows.length === 0) {\n\t\t\tthis.message = 'Unknown error';\n\t\t\treturn;\n\t\t}\n\n\t\tconst messageRow = stackRows.find((line) => line.includes('Error:'));\n\t\tconst lineNumberRow = stackRows.find((line) => line.includes('Code:'));\n\t\tconst lineNumberDisplay = this.toLineNumberDisplay(lineNumberRow) || '';\n\n\t\tif (!messageRow) {\n\t\t\tthis.message = `Unknown error ${lineNumberDisplay}`;\n\t\t\treturn;\n\t\t}\n\n\t\tconst [errorDetails, errorType] = this.toErrorDetailsAndType(messageRow);\n\n\t\tif (errorType) this.description = errorType;\n\n\t\tif (!errorDetails) {\n\t\t\tthis.message = `Unknown error ${lineNumberDisplay}`;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.message = `${errorDetails} ${lineNumberDisplay}`.trim();\n\t}\n\n\tprivate toLineNumberDisplay(lineNumberRow?: string) {\n\t\tconst errorLineNumberMatch = lineNumberRow?.match(/Code:(?<lineNumber>\\d+)/);\n\n\t\tif (!errorLineNumberMatch?.groups?.lineNumber) return null;\n\n\t\tconst lineNumber = errorLineNumberMatch.groups.lineNumber;\n\n\t\tthis.lineNumber = Number(lineNumber);\n\n\t\tif (!lineNumber) return '';\n\n\t\treturn this.itemIndex === undefined\n\t\t\t? `[line ${lineNumber}]`\n\t\t\t: `[line ${lineNumber}, for item ${this.itemIndex}]`;\n\t}\n\n\tprivate toErrorDetailsAndType(messageRow?: string) {\n\t\tif (!messageRow) return [null, null];\n\n\t\t// Remove \"Error: \" prefix added by stacktrace formatting\n\t\tmessageRow = messageRow.replace(/^Error: /, '');\n\n\t\tconst colonIndex = messageRow.indexOf(': ');\n\t\tif (colonIndex === -1) {\n\t\t\treturn [messageRow.trim(), null];\n\t\t}\n\n\t\tconst errorType = messageRow.substring(0, colonIndex).trim();\n\t\tconst errorDetails = messageRow.substring(colonIndex + 2).trim();\n\n\t\treturn [errorDetails, errorType === 'Error' ? null : errorType];\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAiC;AAE1B,MAAM,uBAAuB,qCAAiB;AAAA,EAWpD,YAAY,OAAmC,WAAoB;AAClE,UAAM,MAAM,OAAO;AAXpB,uBAA6B;AAE7B,qBAAgC;AAEhC,mBAA6C;AAE7C,iBAAQ;AAER,sBAAiC;AAIhC,SAAK,YAAY;AAEjB,QAAI,KAAK,cAAc,QAAW;AACjC,WAAK,UAAU,EAAE,WAAW,KAAK,UAAU;AAAA,IAC5C;AAEA,SAAK,QAAQ,MAAM,SAAS;AAE5B,SAAK,kBAAkB;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB;AAC3B,UAAM,YAAY,KAAK,SAAS,OAAO,KAAK,UAAU,WAAW,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC;AAE3F,QAAI,UAAU,WAAW,GAAG;AAC3B,WAAK,UAAU;AACf;AAAA,IACD;AAEA,UAAM,aAAa,UAAU,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ,CAAC;AACnE,UAAM,gBAAgB,UAAU,KAAK,CAAC,SAAS,KAAK,SAAS,OAAO,CAAC;AACrE,UAAM,oBAAoB,KAAK,oBAAoB,aAAa,KAAK;AAErE,QAAI,CAAC,YAAY;AAChB,WAAK,UAAU,iBAAiB,iBAAiB;AACjD;AAAA,IACD;AAEA,UAAM,CAAC,cAAc,SAAS,IAAI,KAAK,sBAAsB,UAAU;AAEvE,QAAI,UAAW,MAAK,cAAc;AAElC,QAAI,CAAC,cAAc;AAClB,WAAK,UAAU,iBAAiB,iBAAiB;AACjD;AAAA,IACD;AAEA,SAAK,UAAU,GAAG,YAAY,IAAI,iBAAiB,GAAG,KAAK;AAAA,EAC5D;AAAA,EAEQ,oBAAoB,eAAwB;AACnD,UAAM,uBAAuB,eAAe,MAAM,yBAAyB;AAE3E,QAAI,CAAC,sBAAsB,QAAQ,WAAY,QAAO;AAEtD,UAAM,aAAa,qBAAqB,OAAO;AAE/C,SAAK,aAAa,OAAO,UAAU;AAEnC,QAAI,CAAC,WAAY,QAAO;AAExB,WAAO,KAAK,cAAc,SACvB,SAAS,UAAU,MACnB,SAAS,UAAU,cAAc,KAAK,SAAS;AAAA,EACnD;AAAA,EAEQ,sBAAsB,YAAqB;AAClD,QAAI,CAAC,WAAY,QAAO,CAAC,MAAM,IAAI;AAGnC,iBAAa,WAAW,QAAQ,YAAY,EAAE;AAE9C,UAAM,aAAa,WAAW,QAAQ,IAAI;AAC1C,QAAI,eAAe,IAAI;AACtB,aAAO,CAAC,WAAW,KAAK,GAAG,IAAI;AAAA,IAChC;AAEA,UAAM,YAAY,WAAW,UAAU,GAAG,UAAU,EAAE,KAAK;AAC3D,UAAM,eAAe,WAAW,UAAU,aAAa,CAAC,EAAE,KAAK;AAE/D,WAAO,CAAC,cAAc,cAAc,UAAU,OAAO,SAAS;AAAA,EAC/D;AACD;","names":[]}
@@ -56,7 +56,8 @@ async function getFilteredResults(operationResult, googleSheet, result, starting
56
56
  {
57
57
  rangeDefinition: "specifyRange",
58
58
  headerRow: 1,
59
- firstDataRow: startingRow
59
+ firstDataRow: startingRow,
60
+ includeHeadersWithEmptyCells: true
60
61
  }
61
62
  );
62
63
  return operationResult.filter((row) => row?.json?.row_number <= endingRow);
@@ -90,7 +91,7 @@ async function getResults(operationResult, googleSheet, result, rangeOptions) {
90
91
  this.getNode().typeVersion,
91
92
  [],
92
93
  void 0,
93
- rangeOptions
94
+ { ...rangeOptions, includeHeadersWithEmptyCells: true }
94
95
  );
95
96
  return operationResult;
96
97
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../nodes/Evaluation/utils/evaluationTriggerUtils.ts"],"sourcesContent":["import type { IExecuteFunctions, INodeExecutionData, IDataObject } from 'n8n-workflow';\n\nimport { readSheet } from '../../Google/Sheet/v2/actions/utils/readOperation';\nimport { GoogleSheet } from '../../Google/Sheet/v2/helpers/GoogleSheet';\nimport type { ResourceLocator } from '../../Google/Sheet/v2/helpers/GoogleSheets.types';\nimport { getSpreadsheetId } from '../../Google/Sheet/v2/helpers/GoogleSheets.utils';\n\nexport async function getSheet(\n\tthis: IExecuteFunctions,\n\tgoogleSheet: GoogleSheet,\n): Promise<{\n\ttitle: string;\n\tsheetId: number;\n}> {\n\tconst sheetWithinDocument = this.getNodeParameter('sheetName', 0, undefined, {\n\t\textractValue: true,\n\t}) as string;\n\tconst { mode: sheetMode } = this.getNodeParameter('sheetName', 0) as {\n\t\tmode: ResourceLocator;\n\t};\n\n\treturn await googleSheet.spreadsheetGetSheet(this.getNode(), sheetMode, sheetWithinDocument);\n}\n\nexport function getGoogleSheet(this: IExecuteFunctions) {\n\tconst { mode, value } = this.getNodeParameter('documentId', 0) as IDataObject;\n\tconst spreadsheetId = getSpreadsheetId(this.getNode(), mode as ResourceLocator, value as string);\n\n\tconst googleSheet = new GoogleSheet(spreadsheetId, this);\n\n\treturn googleSheet;\n}\n\nexport async function getFilteredResults(\n\tthis: IExecuteFunctions,\n\toperationResult: INodeExecutionData[],\n\tgoogleSheet: GoogleSheet,\n\tresult: { title: string; sheetId: number },\n\tstartingRow: number,\n\tendingRow: number,\n): Promise<INodeExecutionData[]> {\n\tconst sheetName = result.title;\n\n\toperationResult = await readSheet.call(\n\t\tthis,\n\t\tgoogleSheet,\n\t\tsheetName,\n\t\t0,\n\t\toperationResult,\n\t\tthis.getNode().typeVersion,\n\t\t[],\n\t\tundefined,\n\t\t{\n\t\t\trangeDefinition: 'specifyRange',\n\t\t\theaderRow: 1,\n\t\t\tfirstDataRow: startingRow,\n\t\t},\n\t);\n\n\treturn operationResult.filter((row) => (row?.json?.row_number as number) <= endingRow);\n}\n\nexport async function getNumberOfRowsLeftFiltered(\n\tthis: IExecuteFunctions,\n\tgoogleSheet: GoogleSheet,\n\tsheetName: string,\n\tstartingRow: number,\n\tendingRow: number,\n) {\n\tconst remainderSheet: INodeExecutionData[] = await readSheet.call(\n\t\tthis,\n\t\tgoogleSheet,\n\t\tsheetName,\n\t\t0,\n\t\t[],\n\t\tthis.getNode().typeVersion,\n\t\t[],\n\t\tundefined,\n\t\t{\n\t\t\trangeDefinition: 'specifyRange',\n\t\t\theaderRow: 1,\n\t\t\tfirstDataRow: startingRow,\n\t\t},\n\t);\n\n\treturn remainderSheet.filter((row) => (row?.json?.row_number as number) <= endingRow).length;\n}\n\nexport async function getResults(\n\tthis: IExecuteFunctions,\n\toperationResult: INodeExecutionData[],\n\tgoogleSheet: GoogleSheet,\n\tresult: { title: string; sheetId: number },\n\trangeOptions: IDataObject,\n): Promise<INodeExecutionData[]> {\n\tconst sheetName = result.title;\n\n\toperationResult = await readSheet.call(\n\t\tthis,\n\t\tgoogleSheet,\n\t\tsheetName,\n\t\t0,\n\t\toperationResult,\n\t\tthis.getNode().typeVersion,\n\t\t[],\n\t\tundefined,\n\t\trangeOptions,\n\t);\n\n\treturn operationResult;\n}\n\nexport async function getRowsLeft(\n\tthis: IExecuteFunctions,\n\tgoogleSheet: GoogleSheet,\n\tsheetName: string,\n\trangeString: string,\n) {\n\tconst remainderSheet: INodeExecutionData[] = await readSheet.call(\n\t\tthis,\n\t\tgoogleSheet,\n\t\tsheetName,\n\t\t0,\n\t\t[],\n\t\tthis.getNode().typeVersion,\n\t\t[],\n\t\trangeString,\n\t);\n\n\treturn remainderSheet.length;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,2BAA0B;AAC1B,yBAA4B;AAE5B,0BAAiC;AAEjC,eAAsB,SAErB,aAIE;AACF,QAAM,sBAAsB,KAAK,iBAAiB,aAAa,GAAG,QAAW;AAAA,IAC5E,cAAc;AAAA,EACf,CAAC;AACD,QAAM,EAAE,MAAM,UAAU,IAAI,KAAK,iBAAiB,aAAa,CAAC;AAIhE,SAAO,MAAM,YAAY,oBAAoB,KAAK,QAAQ,GAAG,WAAW,mBAAmB;AAC5F;AAEO,SAAS,iBAAwC;AACvD,QAAM,EAAE,MAAM,MAAM,IAAI,KAAK,iBAAiB,cAAc,CAAC;AAC7D,QAAM,oBAAgB,sCAAiB,KAAK,QAAQ,GAAG,MAAyB,KAAe;AAE/F,QAAM,cAAc,IAAI,+BAAY,eAAe,IAAI;AAEvD,SAAO;AACR;AAEA,eAAsB,mBAErB,iBACA,aACA,QACA,aACA,WACgC;AAChC,QAAM,YAAY,OAAO;AAEzB,oBAAkB,MAAM,+BAAU;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,QAAQ,EAAE;AAAA,IACf,CAAC;AAAA,IACD;AAAA,IACA;AAAA,MACC,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,cAAc;AAAA,IACf;AAAA,EACD;AAEA,SAAO,gBAAgB,OAAO,CAAC,QAAS,KAAK,MAAM,cAAyB,SAAS;AACtF;AAEA,eAAsB,4BAErB,aACA,WACA,aACA,WACC;AACD,QAAM,iBAAuC,MAAM,+BAAU;AAAA,IAC5D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,KAAK,QAAQ,EAAE;AAAA,IACf,CAAC;AAAA,IACD;AAAA,IACA;AAAA,MACC,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,cAAc;AAAA,IACf;AAAA,EACD;AAEA,SAAO,eAAe,OAAO,CAAC,QAAS,KAAK,MAAM,cAAyB,SAAS,EAAE;AACvF;AAEA,eAAsB,WAErB,iBACA,aACA,QACA,cACgC;AAChC,QAAM,YAAY,OAAO;AAEzB,oBAAkB,MAAM,+BAAU;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,QAAQ,EAAE;AAAA,IACf,CAAC;AAAA,IACD;AAAA,IACA;AAAA,EACD;AAEA,SAAO;AACR;AAEA,eAAsB,YAErB,aACA,WACA,aACC;AACD,QAAM,iBAAuC,MAAM,+BAAU;AAAA,IAC5D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,KAAK,QAAQ,EAAE;AAAA,IACf,CAAC;AAAA,IACD;AAAA,EACD;AAEA,SAAO,eAAe;AACvB;","names":[]}
1
+ {"version":3,"sources":["../../../../nodes/Evaluation/utils/evaluationTriggerUtils.ts"],"sourcesContent":["import type { IExecuteFunctions, INodeExecutionData, IDataObject } from 'n8n-workflow';\n\nimport { readSheet } from '../../Google/Sheet/v2/actions/utils/readOperation';\nimport { GoogleSheet } from '../../Google/Sheet/v2/helpers/GoogleSheet';\nimport type { ResourceLocator } from '../../Google/Sheet/v2/helpers/GoogleSheets.types';\nimport { getSpreadsheetId } from '../../Google/Sheet/v2/helpers/GoogleSheets.utils';\n\nexport async function getSheet(\n\tthis: IExecuteFunctions,\n\tgoogleSheet: GoogleSheet,\n): Promise<{\n\ttitle: string;\n\tsheetId: number;\n}> {\n\tconst sheetWithinDocument = this.getNodeParameter('sheetName', 0, undefined, {\n\t\textractValue: true,\n\t}) as string;\n\tconst { mode: sheetMode } = this.getNodeParameter('sheetName', 0) as {\n\t\tmode: ResourceLocator;\n\t};\n\n\treturn await googleSheet.spreadsheetGetSheet(this.getNode(), sheetMode, sheetWithinDocument);\n}\n\nexport function getGoogleSheet(this: IExecuteFunctions) {\n\tconst { mode, value } = this.getNodeParameter('documentId', 0) as IDataObject;\n\tconst spreadsheetId = getSpreadsheetId(this.getNode(), mode as ResourceLocator, value as string);\n\n\tconst googleSheet = new GoogleSheet(spreadsheetId, this);\n\n\treturn googleSheet;\n}\n\nexport async function getFilteredResults(\n\tthis: IExecuteFunctions,\n\toperationResult: INodeExecutionData[],\n\tgoogleSheet: GoogleSheet,\n\tresult: { title: string; sheetId: number },\n\tstartingRow: number,\n\tendingRow: number,\n): Promise<INodeExecutionData[]> {\n\tconst sheetName = result.title;\n\n\toperationResult = await readSheet.call(\n\t\tthis,\n\t\tgoogleSheet,\n\t\tsheetName,\n\t\t0,\n\t\toperationResult,\n\t\tthis.getNode().typeVersion,\n\t\t[],\n\t\tundefined,\n\t\t{\n\t\t\trangeDefinition: 'specifyRange',\n\t\t\theaderRow: 1,\n\t\t\tfirstDataRow: startingRow,\n\t\t\tincludeHeadersWithEmptyCells: true,\n\t\t},\n\t);\n\n\treturn operationResult.filter((row) => (row?.json?.row_number as number) <= endingRow);\n}\n\nexport async function getNumberOfRowsLeftFiltered(\n\tthis: IExecuteFunctions,\n\tgoogleSheet: GoogleSheet,\n\tsheetName: string,\n\tstartingRow: number,\n\tendingRow: number,\n) {\n\tconst remainderSheet: INodeExecutionData[] = await readSheet.call(\n\t\tthis,\n\t\tgoogleSheet,\n\t\tsheetName,\n\t\t0,\n\t\t[],\n\t\tthis.getNode().typeVersion,\n\t\t[],\n\t\tundefined,\n\t\t{\n\t\t\trangeDefinition: 'specifyRange',\n\t\t\theaderRow: 1,\n\t\t\tfirstDataRow: startingRow,\n\t\t},\n\t);\n\n\treturn remainderSheet.filter((row) => (row?.json?.row_number as number) <= endingRow).length;\n}\n\nexport async function getResults(\n\tthis: IExecuteFunctions,\n\toperationResult: INodeExecutionData[],\n\tgoogleSheet: GoogleSheet,\n\tresult: { title: string; sheetId: number },\n\trangeOptions: IDataObject,\n): Promise<INodeExecutionData[]> {\n\tconst sheetName = result.title;\n\n\toperationResult = await readSheet.call(\n\t\tthis,\n\t\tgoogleSheet,\n\t\tsheetName,\n\t\t0,\n\t\toperationResult,\n\t\tthis.getNode().typeVersion,\n\t\t[],\n\t\tundefined,\n\t\t{ ...rangeOptions, includeHeadersWithEmptyCells: true },\n\t);\n\n\treturn operationResult;\n}\n\nexport async function getRowsLeft(\n\tthis: IExecuteFunctions,\n\tgoogleSheet: GoogleSheet,\n\tsheetName: string,\n\trangeString: string,\n) {\n\tconst remainderSheet: INodeExecutionData[] = await readSheet.call(\n\t\tthis,\n\t\tgoogleSheet,\n\t\tsheetName,\n\t\t0,\n\t\t[],\n\t\tthis.getNode().typeVersion,\n\t\t[],\n\t\trangeString,\n\t);\n\n\treturn remainderSheet.length;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,2BAA0B;AAC1B,yBAA4B;AAE5B,0BAAiC;AAEjC,eAAsB,SAErB,aAIE;AACF,QAAM,sBAAsB,KAAK,iBAAiB,aAAa,GAAG,QAAW;AAAA,IAC5E,cAAc;AAAA,EACf,CAAC;AACD,QAAM,EAAE,MAAM,UAAU,IAAI,KAAK,iBAAiB,aAAa,CAAC;AAIhE,SAAO,MAAM,YAAY,oBAAoB,KAAK,QAAQ,GAAG,WAAW,mBAAmB;AAC5F;AAEO,SAAS,iBAAwC;AACvD,QAAM,EAAE,MAAM,MAAM,IAAI,KAAK,iBAAiB,cAAc,CAAC;AAC7D,QAAM,oBAAgB,sCAAiB,KAAK,QAAQ,GAAG,MAAyB,KAAe;AAE/F,QAAM,cAAc,IAAI,+BAAY,eAAe,IAAI;AAEvD,SAAO;AACR;AAEA,eAAsB,mBAErB,iBACA,aACA,QACA,aACA,WACgC;AAChC,QAAM,YAAY,OAAO;AAEzB,oBAAkB,MAAM,+BAAU;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,QAAQ,EAAE;AAAA,IACf,CAAC;AAAA,IACD;AAAA,IACA;AAAA,MACC,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,cAAc;AAAA,MACd,8BAA8B;AAAA,IAC/B;AAAA,EACD;AAEA,SAAO,gBAAgB,OAAO,CAAC,QAAS,KAAK,MAAM,cAAyB,SAAS;AACtF;AAEA,eAAsB,4BAErB,aACA,WACA,aACA,WACC;AACD,QAAM,iBAAuC,MAAM,+BAAU;AAAA,IAC5D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,KAAK,QAAQ,EAAE;AAAA,IACf,CAAC;AAAA,IACD;AAAA,IACA;AAAA,MACC,iBAAiB;AAAA,MACjB,WAAW;AAAA,MACX,cAAc;AAAA,IACf;AAAA,EACD;AAEA,SAAO,eAAe,OAAO,CAAC,QAAS,KAAK,MAAM,cAAyB,SAAS,EAAE;AACvF;AAEA,eAAsB,WAErB,iBACA,aACA,QACA,cACgC;AAChC,QAAM,YAAY,OAAO;AAEzB,oBAAkB,MAAM,+BAAU;AAAA,IACjC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,KAAK,QAAQ,EAAE;AAAA,IACf,CAAC;AAAA,IACD;AAAA,IACA,EAAE,GAAG,cAAc,8BAA8B,KAAK;AAAA,EACvD;AAEA,SAAO;AACR;AAEA,eAAsB,YAErB,aACA,WACA,aACC;AACD,QAAM,iBAAuC,MAAM,+BAAU;AAAA,IAC5D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD,KAAK,QAAQ,EAAE;AAAA,IACf,CAAC;AAAA,IACD;AAAA,EACD;AAEA,SAAO,eAAe;AACvB;","names":[]}
@@ -30,7 +30,7 @@ class ExecutionData {
30
30
  icon: "fa:tasks",
31
31
  group: ["input"],
32
32
  iconColor: "light-green",
33
- version: 1,
33
+ version: [1, 1.1],
34
34
  description: "Add execution data for search",
35
35
  defaults: {
36
36
  name: "Execution Data",
@@ -84,7 +84,8 @@ class ExecutionData {
84
84
  name: "key",
85
85
  type: "string",
86
86
  default: "",
87
- placeholder: "e.g. myKey"
87
+ placeholder: "e.g. myKey",
88
+ requiresDataPath: "single"
88
89
  },
89
90
  {
90
91
  displayName: "Value",
@@ -117,20 +118,44 @@ class ExecutionData {
117
118
  };
118
119
  }
119
120
  async execute() {
120
- const context = this.getWorkflowDataProxy(0);
121
+ const dataProxy = this.getWorkflowDataProxy(0);
122
+ const nodeVersion = this.getNode().typeVersion;
121
123
  const items = this.getInputData();
122
124
  const operations = this.getNodeParameter("operation", 0);
125
+ const returnData = [];
123
126
  if (operations === "save") {
124
127
  for (let i = 0; i < items.length; i++) {
125
- const dataToSave = this.getNodeParameter("dataToSave", i, {}).values || [];
126
- const values = dataToSave.reduce((acc, { key, value }) => {
127
- acc[key] = value;
128
- return acc;
129
- }, {});
130
- context.$execution.customData.setAll(values);
128
+ try {
129
+ const dataToSave = this.getNodeParameter("dataToSave", i, {}).values || [];
130
+ const values = dataToSave.reduce(
131
+ (acc, { key, value }) => {
132
+ const valueToSet = value ? value : nodeVersion >= 1.1 ? "" : value;
133
+ acc[key] = valueToSet;
134
+ return acc;
135
+ },
136
+ {}
137
+ );
138
+ dataProxy.$execution.customData.setAll(values);
139
+ returnData.push(items[i]);
140
+ } catch (error) {
141
+ if (this.continueOnFail()) {
142
+ returnData.push({
143
+ json: {
144
+ error: error.message
145
+ },
146
+ pairedItem: {
147
+ item: i
148
+ }
149
+ });
150
+ continue;
151
+ }
152
+ throw new import_n8n_workflow.NodeOperationError(this.getNode(), error);
153
+ }
131
154
  }
155
+ } else {
156
+ return [items];
132
157
  }
133
- return [items];
158
+ return [returnData];
134
159
  }
135
160
  }
136
161
  // Annotate the CommonJS export names for ESM import in node:
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../nodes/ExecutionData/ExecutionData.node.ts"],"sourcesContent":["import type {\n\tIDataObject,\n\tIExecuteFunctions,\n\tINodeExecutionData,\n\tINodeType,\n\tINodeTypeDescription,\n} from 'n8n-workflow';\nimport { NodeConnectionTypes } from 'n8n-workflow';\n\nexport class ExecutionData implements INodeType {\n\tdescription: INodeTypeDescription = {\n\t\tdisplayName: 'Execution Data',\n\t\tname: 'executionData',\n\t\ticon: 'fa:tasks',\n\t\tgroup: ['input'],\n\t\ticonColor: 'light-green',\n\t\tversion: 1,\n\t\tdescription: 'Add execution data for search',\n\t\tdefaults: {\n\t\t\tname: 'Execution Data',\n\t\t\tcolor: '#29A568',\n\t\t},\n\t\tinputs: [NodeConnectionTypes.Main],\n\t\toutputs: [NodeConnectionTypes.Main],\n\t\tproperties: [\n\t\t\t{\n\t\t\t\tdisplayName:\n\t\t\t\t\t\"Save important data using this node. It will be displayed on each execution for easy reference and you can filter by it.<br />Filtering is available on Pro and Enterprise plans. <a href='https://n8n.io/pricing/' target='_blank'>More Info</a>\",\n\t\t\t\tname: 'notice',\n\t\t\t\ttype: 'notice',\n\t\t\t\tdefault: '',\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Operation',\n\t\t\t\tname: 'operation',\n\t\t\t\ttype: 'options',\n\t\t\t\tdefault: 'save',\n\t\t\t\tnoDataExpression: true,\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Save Highlight Data (for Search/review)',\n\t\t\t\t\t\tvalue: 'save',\n\t\t\t\t\t\taction: 'Save Highlight Data (for search/review)',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Data to Save',\n\t\t\t\tname: 'dataToSave',\n\t\t\t\tplaceholder: 'Add Saved Field',\n\t\t\t\ttype: 'fixedCollection',\n\t\t\t\ttypeOptions: {\n\t\t\t\t\tmultipleValueButtonText: 'Add Saved Field',\n\t\t\t\t\tmultipleValues: true,\n\t\t\t\t},\n\t\t\t\tdisplayOptions: {\n\t\t\t\t\tshow: {\n\t\t\t\t\t\toperation: ['save'],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tdefault: {},\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Values',\n\t\t\t\t\t\tname: 'values',\n\t\t\t\t\t\tvalues: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdisplayName: 'Key',\n\t\t\t\t\t\t\t\tname: 'key',\n\t\t\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t\t\t\tplaceholder: 'e.g. myKey',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdisplayName: 'Value',\n\t\t\t\t\t\t\t\tname: 'value',\n\t\t\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t\t\t\tplaceholder: 'e.g. myValue',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t\thints: [\n\t\t\t{\n\t\t\t\ttype: 'warning',\n\t\t\t\tmessage: 'Some keys are longer than 50 characters. They will be truncated.',\n\t\t\t\tdisplayCondition: '={{ $parameter.dataToSave.values.some((x) => x.key.length > 50) }}',\n\t\t\t\twhenToDisplay: 'beforeExecution',\n\t\t\t\tlocation: 'outputPane',\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'warning',\n\t\t\t\tmessage: 'Some values are longer than 512 characters. They will be truncated.',\n\t\t\t\tdisplayCondition: '={{ $parameter.dataToSave.values.some((x) => x.value.length > 512) }}',\n\t\t\t\twhenToDisplay: 'beforeExecution',\n\t\t\t\tlocation: 'outputPane',\n\t\t\t},\n\t\t],\n\t};\n\n\tasync execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {\n\t\tconst context = this.getWorkflowDataProxy(0);\n\n\t\tconst items = this.getInputData();\n\t\tconst operations = this.getNodeParameter('operation', 0);\n\n\t\tif (operations === 'save') {\n\t\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\t\tconst dataToSave =\n\t\t\t\t\t((this.getNodeParameter('dataToSave', i, {}) as IDataObject).values as IDataObject[]) ||\n\t\t\t\t\t[];\n\n\t\t\t\tconst values = dataToSave.reduce((acc, { key, value }) => {\n\t\t\t\t\tacc[key as string] = value;\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {} as IDataObject);\n\n\t\t\t\tcontext.$execution.customData.setAll(values);\n\t\t\t}\n\t\t}\n\n\t\treturn [items];\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,0BAAoC;AAE7B,MAAM,cAAmC;AAAA,EAAzC;AACN,uBAAoC;AAAA,MACnC,aAAa;AAAA,MACb,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO,CAAC,OAAO;AAAA,MACf,WAAW;AAAA,MACX,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU;AAAA,QACT,MAAM;AAAA,QACN,OAAO;AAAA,MACR;AAAA,MACA,QAAQ,CAAC,wCAAoB,IAAI;AAAA,MACjC,SAAS,CAAC,wCAAoB,IAAI;AAAA,MAClC,YAAY;AAAA,QACX;AAAA,UACC,aACC;AAAA,UACD,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,QACV;AAAA,QACA;AAAA,UACC,aAAa;AAAA,UACb,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS;AAAA,UACT,kBAAkB;AAAA,UAClB,SAAS;AAAA,YACR;AAAA,cACC,MAAM;AAAA,cACN,OAAO;AAAA,cACP,QAAQ;AAAA,YACT;AAAA,UACD;AAAA,QACD;AAAA,QACA;AAAA,UACC,aAAa;AAAA,UACb,MAAM;AAAA,UACN,aAAa;AAAA,UACb,MAAM;AAAA,UACN,aAAa;AAAA,YACZ,yBAAyB;AAAA,YACzB,gBAAgB;AAAA,UACjB;AAAA,UACA,gBAAgB;AAAA,YACf,MAAM;AAAA,cACL,WAAW,CAAC,MAAM;AAAA,YACnB;AAAA,UACD;AAAA,UACA,SAAS,CAAC;AAAA,UACV,SAAS;AAAA,YACR;AAAA,cACC,aAAa;AAAA,cACb,MAAM;AAAA,cACN,QAAQ;AAAA,gBACP;AAAA,kBACC,aAAa;AAAA,kBACb,MAAM;AAAA,kBACN,MAAM;AAAA,kBACN,SAAS;AAAA,kBACT,aAAa;AAAA,gBACd;AAAA,gBACA;AAAA,kBACC,aAAa;AAAA,kBACb,MAAM;AAAA,kBACN,MAAM;AAAA,kBACN,SAAS;AAAA,kBACT,aAAa;AAAA,gBACd;AAAA,cACD;AAAA,YACD;AAAA,UACD;AAAA,QACD;AAAA,MACD;AAAA,MACA,OAAO;AAAA,QACN;AAAA,UACC,MAAM;AAAA,UACN,SAAS;AAAA,UACT,kBAAkB;AAAA,UAClB,eAAe;AAAA,UACf,UAAU;AAAA,QACX;AAAA,QACA;AAAA,UACC,MAAM;AAAA,UACN,SAAS;AAAA,UACT,kBAAkB;AAAA,UAClB,eAAe;AAAA,UACf,UAAU;AAAA,QACX;AAAA,MACD;AAAA,IACD;AAAA;AAAA,EAEA,MAAM,UAAkE;AACvE,UAAM,UAAU,KAAK,qBAAqB,CAAC;AAE3C,UAAM,QAAQ,KAAK,aAAa;AAChC,UAAM,aAAa,KAAK,iBAAiB,aAAa,CAAC;AAEvD,QAAI,eAAe,QAAQ;AAC1B,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,cAAM,aACH,KAAK,iBAAiB,cAAc,GAAG,CAAC,CAAC,EAAkB,UAC7D,CAAC;AAEF,cAAM,SAAS,WAAW,OAAO,CAAC,KAAK,EAAE,KAAK,MAAM,MAAM;AACzD,cAAI,GAAa,IAAI;AACrB,iBAAO;AAAA,QACR,GAAG,CAAC,CAAgB;AAEpB,gBAAQ,WAAW,WAAW,OAAO,MAAM;AAAA,MAC5C;AAAA,IACD;AAEA,WAAO,CAAC,KAAK;AAAA,EACd;AACD;","names":[]}
1
+ {"version":3,"sources":["../../../nodes/ExecutionData/ExecutionData.node.ts"],"sourcesContent":["import type {\n\tIExecuteFunctions,\n\tINodeExecutionData,\n\tINodeType,\n\tINodeTypeDescription,\n} from 'n8n-workflow';\nimport { NodeConnectionTypes, NodeOperationError } from 'n8n-workflow';\n\ntype DataToSave = {\n\tvalues: Array<{ key: string; value: string }>;\n};\n\nexport class ExecutionData implements INodeType {\n\tdescription: INodeTypeDescription = {\n\t\tdisplayName: 'Execution Data',\n\t\tname: 'executionData',\n\t\ticon: 'fa:tasks',\n\t\tgroup: ['input'],\n\t\ticonColor: 'light-green',\n\t\tversion: [1, 1.1],\n\t\tdescription: 'Add execution data for search',\n\t\tdefaults: {\n\t\t\tname: 'Execution Data',\n\t\t\tcolor: '#29A568',\n\t\t},\n\t\tinputs: [NodeConnectionTypes.Main],\n\t\toutputs: [NodeConnectionTypes.Main],\n\t\tproperties: [\n\t\t\t{\n\t\t\t\tdisplayName:\n\t\t\t\t\t\"Save important data using this node. It will be displayed on each execution for easy reference and you can filter by it.<br />Filtering is available on Pro and Enterprise plans. <a href='https://n8n.io/pricing/' target='_blank'>More Info</a>\",\n\t\t\t\tname: 'notice',\n\t\t\t\ttype: 'notice',\n\t\t\t\tdefault: '',\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Operation',\n\t\t\t\tname: 'operation',\n\t\t\t\ttype: 'options',\n\t\t\t\tdefault: 'save',\n\t\t\t\tnoDataExpression: true,\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tname: 'Save Highlight Data (for Search/review)',\n\t\t\t\t\t\tvalue: 'save',\n\t\t\t\t\t\taction: 'Save Highlight Data (for search/review)',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t\t{\n\t\t\t\tdisplayName: 'Data to Save',\n\t\t\t\tname: 'dataToSave',\n\t\t\t\tplaceholder: 'Add Saved Field',\n\t\t\t\ttype: 'fixedCollection',\n\t\t\t\ttypeOptions: {\n\t\t\t\t\tmultipleValueButtonText: 'Add Saved Field',\n\t\t\t\t\tmultipleValues: true,\n\t\t\t\t},\n\t\t\t\tdisplayOptions: {\n\t\t\t\t\tshow: {\n\t\t\t\t\t\toperation: ['save'],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tdefault: {},\n\t\t\t\toptions: [\n\t\t\t\t\t{\n\t\t\t\t\t\tdisplayName: 'Values',\n\t\t\t\t\t\tname: 'values',\n\t\t\t\t\t\tvalues: [\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdisplayName: 'Key',\n\t\t\t\t\t\t\t\tname: 'key',\n\t\t\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t\t\t\tplaceholder: 'e.g. myKey',\n\t\t\t\t\t\t\t\trequiresDataPath: 'single',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tdisplayName: 'Value',\n\t\t\t\t\t\t\t\tname: 'value',\n\t\t\t\t\t\t\t\ttype: 'string',\n\t\t\t\t\t\t\t\tdefault: '',\n\t\t\t\t\t\t\t\tplaceholder: 'e.g. myValue',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t\thints: [\n\t\t\t{\n\t\t\t\ttype: 'warning',\n\t\t\t\tmessage: 'Some keys are longer than 50 characters. They will be truncated.',\n\t\t\t\tdisplayCondition: '={{ $parameter.dataToSave.values.some((x) => x.key.length > 50) }}',\n\t\t\t\twhenToDisplay: 'beforeExecution',\n\t\t\t\tlocation: 'outputPane',\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: 'warning',\n\t\t\t\tmessage: 'Some values are longer than 512 characters. They will be truncated.',\n\t\t\t\tdisplayCondition: '={{ $parameter.dataToSave.values.some((x) => x.value.length > 512) }}',\n\t\t\t\twhenToDisplay: 'beforeExecution',\n\t\t\t\tlocation: 'outputPane',\n\t\t\t},\n\t\t],\n\t};\n\n\tasync execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {\n\t\tconst dataProxy = this.getWorkflowDataProxy(0);\n\t\tconst nodeVersion = this.getNode().typeVersion;\n\n\t\tconst items = this.getInputData();\n\t\tconst operations = this.getNodeParameter('operation', 0);\n\n\t\tconst returnData: INodeExecutionData[] = [];\n\n\t\tif (operations === 'save') {\n\t\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\t\ttry {\n\t\t\t\t\tconst dataToSave =\n\t\t\t\t\t\t(this.getNodeParameter('dataToSave', i, {}) as DataToSave).values || [];\n\n\t\t\t\t\tconst values = dataToSave.reduce(\n\t\t\t\t\t\t(acc, { key, value }) => {\n\t\t\t\t\t\t\tconst valueToSet = value ? value : nodeVersion >= 1.1 ? '' : value;\n\t\t\t\t\t\t\tacc[key] = valueToSet;\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{} as { [key: string]: string },\n\t\t\t\t\t);\n\n\t\t\t\t\tdataProxy.$execution.customData.setAll(values);\n\n\t\t\t\t\treturnData.push(items[i]);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (this.continueOnFail()) {\n\t\t\t\t\t\treturnData.push({\n\t\t\t\t\t\t\tjson: {\n\t\t\t\t\t\t\t\terror: error.message,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tpairedItem: {\n\t\t\t\t\t\t\t\titem: i,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tthrow new NodeOperationError(this.getNode(), error);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\treturn [items];\n\t\t}\n\n\t\treturn [returnData];\n\t}\n}\n"],"mappings":"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","names":[]}
@@ -29,6 +29,7 @@ async function readSheet(sheet, sheetName, itemIndex, returnData, nodeVersion, i
29
29
  if (dataLocationOnSheetOptions.rangeDefinition === void 0) {
30
30
  dataLocationOnSheetOptions.rangeDefinition = "detectAutomatically";
31
31
  }
32
+ const includeHeadersWithEmptyCells = additionalOptions?.includeHeadersWithEmptyCells ?? false;
32
33
  const range = rangeString ?? (0, import_GoogleSheets.getRangeString)(sheetName, dataLocationOnSheetOptions);
33
34
  const valueRenderMode = outputFormattingOption.general || "UNFORMATTED_VALUE";
34
35
  const dateTimeRenderOption = outputFormattingOption.date || "FORMATTED_STRING";
@@ -78,7 +79,12 @@ async function readSheet(sheet, sheetName, itemIndex, returnData, nodeVersion, i
78
79
  combineFilters
79
80
  });
80
81
  } else {
81
- responseData = sheet.structureArrayDataByColumn(inputData, keyRowIndex, dataStartRowIndex);
82
+ responseData = sheet.structureArrayDataByColumn(
83
+ inputData,
84
+ keyRowIndex,
85
+ dataStartRowIndex,
86
+ includeHeadersWithEmptyCells
87
+ );
82
88
  }
83
89
  returnData.push(
84
90
  ...responseData.map((item) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../nodes/Google/Sheet/v2/actions/utils/readOperation.ts"],"sourcesContent":["import type { IDataObject, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';\n\nimport { type GoogleSheet } from '../../helpers/GoogleSheet';\nimport type {\n\tILookupValues,\n\tRangeDetectionOptions,\n\tSheetRangeData,\n\tValueRenderOption,\n} from '../../helpers/GoogleSheets.types';\nimport { getRangeString, prepareSheetData } from '../../helpers/GoogleSheets.utils';\n\nexport async function readSheet(\n\tthis: IExecuteFunctions,\n\tsheet: GoogleSheet,\n\tsheetName: string,\n\titemIndex: number,\n\treturnData: INodeExecutionData[],\n\tnodeVersion: number,\n\titems: INodeExecutionData[],\n\trangeString?: string,\n\tadditionalOptions?: IDataObject,\n): Promise<INodeExecutionData[]> {\n\tconst options = this.getNodeParameter('options', itemIndex, {});\n\tconst outputFormattingOption =\n\t\t((options.outputFormatting as IDataObject)?.values as IDataObject) || {};\n\n\tconst dataLocationOnSheetOptions =\n\t\t((options.dataLocationOnSheet as IDataObject)?.values as RangeDetectionOptions) ||\n\t\tadditionalOptions ||\n\t\t{};\n\n\tif (dataLocationOnSheetOptions.rangeDefinition === undefined) {\n\t\tdataLocationOnSheetOptions.rangeDefinition = 'detectAutomatically';\n\t}\n\n\tconst range = rangeString ?? getRangeString(sheetName, dataLocationOnSheetOptions);\n\n\tconst valueRenderMode = (outputFormattingOption.general ||\n\t\t'UNFORMATTED_VALUE') as ValueRenderOption;\n\tconst dateTimeRenderOption = (outputFormattingOption.date || 'FORMATTED_STRING') as string;\n\n\tconst sheetData = (await sheet.getData(\n\t\trange,\n\t\tvalueRenderMode,\n\t\tdateTimeRenderOption,\n\t)) as SheetRangeData;\n\n\tif (sheetData === undefined || sheetData.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst {\n\t\tdata,\n\t\theaderRow: keyRowIndex,\n\t\tfirstDataRow: dataStartRowIndex,\n\t} = prepareSheetData(sheetData, dataLocationOnSheetOptions);\n\n\tlet responseData = [];\n\n\tconst lookupValues = this.getNodeParameter('filtersUI.values', itemIndex, []) as ILookupValues[];\n\n\tconst inputData = data as string[][];\n\n\tif (lookupValues.length) {\n\t\tlet returnAllMatches;\n\t\tif (nodeVersion < 4.5) {\n\t\t\treturnAllMatches = options.returnAllMatches === 'returnAllMatches' ? true : false;\n\t\t} else {\n\t\t\treturnAllMatches =\n\t\t\t\t(additionalOptions?.returnFirstMatch ?? options.returnFirstMatch) ? false : true;\n\t\t}\n\n\t\tif (nodeVersion <= 4.1) {\n\t\t\tfor (let i = 1; i < items.length; i++) {\n\t\t\t\tconst itemLookupValues = this.getNodeParameter(\n\t\t\t\t\t'filtersUI.values',\n\t\t\t\t\ti,\n\t\t\t\t\t[],\n\t\t\t\t) as ILookupValues[];\n\t\t\t\tif (itemLookupValues.length) {\n\t\t\t\t\tlookupValues.push(...itemLookupValues);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst combineFilters = this.getNodeParameter('combineFilters', itemIndex, 'OR') as 'AND' | 'OR';\n\n\t\tresponseData = await sheet.lookupValues({\n\t\t\tinputData,\n\t\t\tkeyRowIndex,\n\t\t\tdataStartRowIndex,\n\t\t\tlookupValues,\n\t\t\treturnAllMatches,\n\t\t\tnodeVersion,\n\t\t\tcombineFilters,\n\t\t});\n\t} else {\n\t\tresponseData = sheet.structureArrayDataByColumn(inputData, keyRowIndex, dataStartRowIndex);\n\t}\n\n\treturnData.push(\n\t\t...responseData.map((item) => {\n\t\t\treturn {\n\t\t\t\tjson: item,\n\t\t\t\tpairedItem: { item: itemIndex },\n\t\t\t};\n\t\t}),\n\t);\n\n\treturn returnData;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,0BAAiD;AAEjD,eAAsB,UAErB,OACA,WACA,WACA,YACA,aACA,OACA,aACA,mBACgC;AAChC,QAAM,UAAU,KAAK,iBAAiB,WAAW,WAAW,CAAC,CAAC;AAC9D,QAAM,yBACH,QAAQ,kBAAkC,UAA0B,CAAC;AAExE,QAAM,6BACH,QAAQ,qBAAqC,UAC/C,qBACA,CAAC;AAEF,MAAI,2BAA2B,oBAAoB,QAAW;AAC7D,+BAA2B,kBAAkB;AAAA,EAC9C;AAEA,QAAM,QAAQ,mBAAe,oCAAe,WAAW,0BAA0B;AAEjF,QAAM,kBAAmB,uBAAuB,WAC/C;AACD,QAAM,uBAAwB,uBAAuB,QAAQ;AAE7D,QAAM,YAAa,MAAM,MAAM;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAEA,MAAI,cAAc,UAAa,UAAU,WAAW,GAAG;AACtD,WAAO,CAAC;AAAA,EACT;AAEA,QAAM;AAAA,IACL;AAAA,IACA,WAAW;AAAA,IACX,cAAc;AAAA,EACf,QAAI,sCAAiB,WAAW,0BAA0B;AAE1D,MAAI,eAAe,CAAC;AAEpB,QAAM,eAAe,KAAK,iBAAiB,oBAAoB,WAAW,CAAC,CAAC;AAE5E,QAAM,YAAY;AAElB,MAAI,aAAa,QAAQ;AACxB,QAAI;AACJ,QAAI,cAAc,KAAK;AACtB,yBAAmB,QAAQ,qBAAqB,qBAAqB,OAAO;AAAA,IAC7E,OAAO;AACN,yBACE,mBAAmB,oBAAoB,QAAQ,mBAAoB,QAAQ;AAAA,IAC9E;AAEA,QAAI,eAAe,KAAK;AACvB,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,cAAM,mBAAmB,KAAK;AAAA,UAC7B;AAAA,UACA;AAAA,UACA,CAAC;AAAA,QACF;AACA,YAAI,iBAAiB,QAAQ;AAC5B,uBAAa,KAAK,GAAG,gBAAgB;AAAA,QACtC;AAAA,MACD;AAAA,IACD;AAEA,UAAM,iBAAiB,KAAK,iBAAiB,kBAAkB,WAAW,IAAI;AAE9E,mBAAe,MAAM,MAAM,aAAa;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAC;AAAA,EACF,OAAO;AACN,mBAAe,MAAM,2BAA2B,WAAW,aAAa,iBAAiB;AAAA,EAC1F;AAEA,aAAW;AAAA,IACV,GAAG,aAAa,IAAI,CAAC,SAAS;AAC7B,aAAO;AAAA,QACN,MAAM;AAAA,QACN,YAAY,EAAE,MAAM,UAAU;AAAA,MAC/B;AAAA,IACD,CAAC;AAAA,EACF;AAEA,SAAO;AACR;","names":[]}
1
+ {"version":3,"sources":["../../../../../../../nodes/Google/Sheet/v2/actions/utils/readOperation.ts"],"sourcesContent":["import type { IDataObject, IExecuteFunctions, INodeExecutionData } from 'n8n-workflow';\n\nimport { type GoogleSheet } from '../../helpers/GoogleSheet';\nimport type {\n\tILookupValues,\n\tRangeDetectionOptions,\n\tSheetRangeData,\n\tValueRenderOption,\n} from '../../helpers/GoogleSheets.types';\nimport { getRangeString, prepareSheetData } from '../../helpers/GoogleSheets.utils';\n\nexport async function readSheet(\n\tthis: IExecuteFunctions,\n\tsheet: GoogleSheet,\n\tsheetName: string,\n\titemIndex: number,\n\treturnData: INodeExecutionData[],\n\tnodeVersion: number,\n\titems: INodeExecutionData[],\n\trangeString?: string,\n\tadditionalOptions?: IDataObject,\n): Promise<INodeExecutionData[]> {\n\tconst options = this.getNodeParameter('options', itemIndex, {});\n\tconst outputFormattingOption =\n\t\t((options.outputFormatting as IDataObject)?.values as IDataObject) || {};\n\n\tconst dataLocationOnSheetOptions =\n\t\t((options.dataLocationOnSheet as IDataObject)?.values as RangeDetectionOptions) ||\n\t\tadditionalOptions ||\n\t\t{};\n\n\tif (dataLocationOnSheetOptions.rangeDefinition === undefined) {\n\t\tdataLocationOnSheetOptions.rangeDefinition = 'detectAutomatically';\n\t}\n\n\tconst includeHeadersWithEmptyCells =\n\t\t(additionalOptions?.includeHeadersWithEmptyCells as boolean) ?? false;\n\n\tconst range = rangeString ?? getRangeString(sheetName, dataLocationOnSheetOptions);\n\n\tconst valueRenderMode = (outputFormattingOption.general ||\n\t\t'UNFORMATTED_VALUE') as ValueRenderOption;\n\tconst dateTimeRenderOption = (outputFormattingOption.date || 'FORMATTED_STRING') as string;\n\n\tconst sheetData = (await sheet.getData(\n\t\trange,\n\t\tvalueRenderMode,\n\t\tdateTimeRenderOption,\n\t)) as SheetRangeData;\n\n\tif (sheetData === undefined || sheetData.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst {\n\t\tdata,\n\t\theaderRow: keyRowIndex,\n\t\tfirstDataRow: dataStartRowIndex,\n\t} = prepareSheetData(sheetData, dataLocationOnSheetOptions);\n\n\tlet responseData = [];\n\n\tconst lookupValues = this.getNodeParameter('filtersUI.values', itemIndex, []) as ILookupValues[];\n\n\tconst inputData = data as string[][];\n\n\tif (lookupValues.length) {\n\t\tlet returnAllMatches;\n\t\tif (nodeVersion < 4.5) {\n\t\t\treturnAllMatches = options.returnAllMatches === 'returnAllMatches' ? true : false;\n\t\t} else {\n\t\t\treturnAllMatches =\n\t\t\t\t(additionalOptions?.returnFirstMatch ?? options.returnFirstMatch) ? false : true;\n\t\t}\n\n\t\tif (nodeVersion <= 4.1) {\n\t\t\tfor (let i = 1; i < items.length; i++) {\n\t\t\t\tconst itemLookupValues = this.getNodeParameter(\n\t\t\t\t\t'filtersUI.values',\n\t\t\t\t\ti,\n\t\t\t\t\t[],\n\t\t\t\t) as ILookupValues[];\n\t\t\t\tif (itemLookupValues.length) {\n\t\t\t\t\tlookupValues.push(...itemLookupValues);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst combineFilters = this.getNodeParameter('combineFilters', itemIndex, 'OR') as 'AND' | 'OR';\n\n\t\tresponseData = await sheet.lookupValues({\n\t\t\tinputData,\n\t\t\tkeyRowIndex,\n\t\t\tdataStartRowIndex,\n\t\t\tlookupValues,\n\t\t\treturnAllMatches,\n\t\t\tnodeVersion,\n\t\t\tcombineFilters,\n\t\t});\n\t} else {\n\t\tresponseData = sheet.structureArrayDataByColumn(\n\t\t\tinputData,\n\t\t\tkeyRowIndex,\n\t\t\tdataStartRowIndex,\n\t\t\tincludeHeadersWithEmptyCells,\n\t\t);\n\t}\n\n\treturnData.push(\n\t\t...responseData.map((item) => {\n\t\t\treturn {\n\t\t\t\tjson: item,\n\t\t\t\tpairedItem: { item: itemIndex },\n\t\t\t};\n\t\t}),\n\t);\n\n\treturn returnData;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AASA,0BAAiD;AAEjD,eAAsB,UAErB,OACA,WACA,WACA,YACA,aACA,OACA,aACA,mBACgC;AAChC,QAAM,UAAU,KAAK,iBAAiB,WAAW,WAAW,CAAC,CAAC;AAC9D,QAAM,yBACH,QAAQ,kBAAkC,UAA0B,CAAC;AAExE,QAAM,6BACH,QAAQ,qBAAqC,UAC/C,qBACA,CAAC;AAEF,MAAI,2BAA2B,oBAAoB,QAAW;AAC7D,+BAA2B,kBAAkB;AAAA,EAC9C;AAEA,QAAM,+BACJ,mBAAmB,gCAA4C;AAEjE,QAAM,QAAQ,mBAAe,oCAAe,WAAW,0BAA0B;AAEjF,QAAM,kBAAmB,uBAAuB,WAC/C;AACD,QAAM,uBAAwB,uBAAuB,QAAQ;AAE7D,QAAM,YAAa,MAAM,MAAM;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACD;AAEA,MAAI,cAAc,UAAa,UAAU,WAAW,GAAG;AACtD,WAAO,CAAC;AAAA,EACT;AAEA,QAAM;AAAA,IACL;AAAA,IACA,WAAW;AAAA,IACX,cAAc;AAAA,EACf,QAAI,sCAAiB,WAAW,0BAA0B;AAE1D,MAAI,eAAe,CAAC;AAEpB,QAAM,eAAe,KAAK,iBAAiB,oBAAoB,WAAW,CAAC,CAAC;AAE5E,QAAM,YAAY;AAElB,MAAI,aAAa,QAAQ;AACxB,QAAI;AACJ,QAAI,cAAc,KAAK;AACtB,yBAAmB,QAAQ,qBAAqB,qBAAqB,OAAO;AAAA,IAC7E,OAAO;AACN,yBACE,mBAAmB,oBAAoB,QAAQ,mBAAoB,QAAQ;AAAA,IAC9E;AAEA,QAAI,eAAe,KAAK;AACvB,eAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,cAAM,mBAAmB,KAAK;AAAA,UAC7B;AAAA,UACA;AAAA,UACA,CAAC;AAAA,QACF;AACA,YAAI,iBAAiB,QAAQ;AAC5B,uBAAa,KAAK,GAAG,gBAAgB;AAAA,QACtC;AAAA,MACD;AAAA,IACD;AAEA,UAAM,iBAAiB,KAAK,iBAAiB,kBAAkB,WAAW,IAAI;AAE9E,mBAAe,MAAM,MAAM,aAAa;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD,CAAC;AAAA,EACF,OAAO;AACN,mBAAe,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA,EACD;AAEA,aAAW;AAAA,IACV,GAAG,aAAa,IAAI,CAAC,SAAS;AAC7B,aAAO;AAAA,QACN,MAAM;AAAA,QACN,YAAY,EAAE,MAAM,UAAU;AAAA,MAC/B;AAAA,IACD,CAAC;AAAA,EACF;AAEA,SAAO;AACR;","names":[]}
@@ -266,14 +266,16 @@ class GoogleSheet {
266
266
  /**
267
267
  * Returns the given sheet data in a structured way
268
268
  */
269
- convertSheetDataArrayToObjectArray(data, startRow, columnKeys, addEmpty) {
269
+ convertSheetDataArrayToObjectArray(sheet, startRow, columnKeys, addEmpty, includeHeadersWithEmptyCells) {
270
270
  const returnData = [];
271
- for (let rowIndex = startRow; rowIndex < data.length; rowIndex++) {
271
+ for (let rowIndex = startRow; rowIndex < sheet.length; rowIndex++) {
272
272
  const item = {};
273
- for (let columnIndex = 0; columnIndex < data[rowIndex].length; columnIndex++) {
273
+ const rowCount = sheet[rowIndex].length;
274
+ const columnCount = includeHeadersWithEmptyCells ? columnKeys.length : rowCount;
275
+ for (let columnIndex = 0; columnIndex < columnCount; columnIndex++) {
274
276
  const key = columnKeys[columnIndex];
275
277
  if (key) {
276
- item[key] = data[rowIndex][columnIndex];
278
+ item[key] = sheet[rowIndex][columnIndex] || "";
277
279
  }
278
280
  }
279
281
  if (Object.keys(item).length || addEmpty === true) {
@@ -286,7 +288,7 @@ class GoogleSheet {
286
288
  * Returns the given sheet data in a structured way using
287
289
  * the startRow as the one with the name of the key
288
290
  */
289
- structureArrayDataByColumn(inputData, keyRow, dataStartRow) {
291
+ structureArrayDataByColumn(inputData, keyRow, dataStartRow, includeHeadersWithEmptyCells) {
290
292
  const keys = [];
291
293
  if (keyRow < 0 || dataStartRow < keyRow || keyRow >= inputData.length) {
292
294
  return [];
@@ -295,7 +297,13 @@ class GoogleSheet {
295
297
  for (let columnIndex = 0; columnIndex < longestRow; columnIndex++) {
296
298
  keys.push(inputData[keyRow][columnIndex] || `col_${columnIndex}`);
297
299
  }
298
- return this.convertSheetDataArrayToObjectArray(inputData, dataStartRow, keys);
300
+ return this.convertSheetDataArrayToObjectArray(
301
+ inputData,
302
+ dataStartRow,
303
+ keys,
304
+ false,
305
+ includeHeadersWithEmptyCells
306
+ );
299
307
  }
300
308
  testFilter(inputData, keyRow, dataStartRow) {
301
309
  const keys = [];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../nodes/Google/Sheet/v2/helpers/GoogleSheet.ts"],"sourcesContent":["import get from 'lodash/get';\nimport type {\n\tIDataObject,\n\tIExecuteFunctions,\n\tILoadOptionsFunctions,\n\tINode,\n\tIPollFunctions,\n} from 'n8n-workflow';\nimport { ApplicationError, NodeOperationError } from 'n8n-workflow';\nimport { utils as xlsxUtils } from 'xlsx';\n\nimport type {\n\tILookupValues,\n\tISheetUpdateData,\n\tResourceLocator,\n\tSheetCellDecoded,\n\tSheetRangeData,\n\tSheetRangeDecoded,\n\tSpreadSheetResponse,\n\tValueInputOption,\n\tValueRenderOption,\n} from './GoogleSheets.types';\nimport { getSheetId, removeEmptyColumns } from './GoogleSheets.utils';\nimport { apiRequest } from '../transport';\n\nexport class GoogleSheet {\n\tid: string;\n\n\texecuteFunctions: IExecuteFunctions | ILoadOptionsFunctions | IPollFunctions;\n\n\tconstructor(\n\t\tspreadsheetId: string,\n\t\texecuteFunctions: IExecuteFunctions | ILoadOptionsFunctions | IPollFunctions,\n\t) {\n\t\tthis.executeFunctions = executeFunctions;\n\t\tthis.id = spreadsheetId;\n\t}\n\n\t/**\n\t * Encodes the range that also none latin character work\n\t *\n\t * @param {string} range\n\t * @returns {string}\n\t * @memberof GoogleSheet\n\t */\n\tprivate encodeRange(range: string): string {\n\t\tif (range.includes('!')) {\n\t\t\tconst [sheet, ranges] = range.split('!');\n\t\t\treturn `${encodeURIComponent(sheet)}!${ranges}`;\n\t\t}\n\t\t// Use '' so that sheet is not interpreted as range\n\t\treturn encodeURIComponent(`'${range}'`);\n\t}\n\n\t/**\n\t * Clears values from a sheet\n\t *\n\t * @param {string} range\n\t * @returns {Promise<object>}\n\t * @memberof GoogleSheet\n\t */\n\tasync clearData(range: string): Promise<object> {\n\t\tconst body = {\n\t\t\tspreadsheetId: this.id,\n\t\t\trange,\n\t\t};\n\n\t\tconst response = await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'POST',\n\t\t\t`/v4/spreadsheets/${this.id}/values/${this.encodeRange(range)}:clear`,\n\t\t\tbody,\n\t\t);\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Returns the cell values\n\t */\n\tasync getData(range: string, valueRenderMode: ValueRenderOption, dateTimeRenderOption?: string) {\n\t\tconst query: IDataObject = {\n\t\t\tvalueRenderOption: valueRenderMode,\n\t\t\tdateTimeRenderOption: 'FORMATTED_STRING',\n\t\t};\n\n\t\tif (dateTimeRenderOption) {\n\t\t\tquery.dateTimeRenderOption = dateTimeRenderOption;\n\t\t}\n\n\t\tconst response = await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'GET',\n\t\t\t`/v4/spreadsheets/${this.id}/values/${this.encodeRange(range)}`,\n\t\t\t{},\n\t\t\tquery,\n\t\t);\n\n\t\treturn response.values as string[][] | undefined;\n\t}\n\n\t/**\n\t * Returns the sheets in a Spreadsheet\n\t */\n\tasync spreadsheetGetSheets() {\n\t\tconst query = {\n\t\t\tfields: 'sheets.properties',\n\t\t};\n\n\t\tconst response = await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'GET',\n\t\t\t`/v4/spreadsheets/${this.id}`,\n\t\t\t{},\n\t\t\tquery,\n\t\t);\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Returns the sheet within a spreadsheet based on name or ID\n\t */\n\tasync spreadsheetGetSheet(node: INode, mode: ResourceLocator, value: string) {\n\t\tconst query = {\n\t\t\tfields: 'sheets.properties',\n\t\t};\n\n\t\tconst response = (await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'GET',\n\t\t\t`/v4/spreadsheets/${this.id}`,\n\t\t\t{},\n\t\t\tquery,\n\t\t)) as SpreadSheetResponse;\n\n\t\tconst foundItem = response.sheets.find((item) => {\n\t\t\tif (mode === 'name') return item.properties.title === value;\n\t\t\treturn item.properties.sheetId === getSheetId(value);\n\t\t});\n\n\t\tif (!foundItem?.properties?.title) {\n\t\t\tconst error = new Error(`Sheet with ${mode === 'name' ? 'name' : 'ID'} ${value} not found`);\n\t\t\tthrow new NodeOperationError(node, error, { level: 'warning' });\n\t\t}\n\n\t\treturn foundItem.properties;\n\t}\n\n\t/**\n\t * Returns the grid properties of a sheet\n\t */\n\tasync getDataRange(sheetId: string) {\n\t\tconst query = {\n\t\t\tfields: 'sheets.properties',\n\t\t};\n\n\t\tconst response = await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'GET',\n\t\t\t`/v4/spreadsheets/${this.id}`,\n\t\t\t{},\n\t\t\tquery,\n\t\t);\n\t\tconst foundItem = response.sheets.find(\n\t\t\t(item: { properties: { sheetId: string } }) => item.properties.sheetId === sheetId,\n\t\t);\n\t\treturn foundItem.properties.gridProperties;\n\t}\n\n\t/**\n\t * Sets values in one or more ranges of a spreadsheet.\n\t */\n\tasync spreadsheetBatchUpdate(requests: IDataObject[]) {\n\t\tconst body = {\n\t\t\trequests,\n\t\t};\n\n\t\tconst response = await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'POST',\n\t\t\t`/v4/spreadsheets/${this.id}:batchUpdate`,\n\t\t\tbody,\n\t\t);\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Sets the cell values\n\t */\n\tasync batchUpdate(updateData: ISheetUpdateData[], valueInputMode: ValueInputOption) {\n\t\tconst body = {\n\t\t\tdata: updateData,\n\t\t\tvalueInputOption: valueInputMode,\n\t\t};\n\n\t\tconst response = await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'POST',\n\t\t\t`/v4/spreadsheets/${this.id}/values:batchUpdate`,\n\t\t\tbody,\n\t\t);\n\n\t\treturn response;\n\t}\n\n\tasync appendEmptyRowsOrColumns(sheetId: string, rowsToAdd = 1, columnsToAdd = 1) {\n\t\tconst requests: IDataObject[] = [];\n\n\t\tif (rowsToAdd > 0) {\n\t\t\trequests.push({\n\t\t\t\tappendDimension: {\n\t\t\t\t\tsheetId,\n\t\t\t\t\tdimension: 'ROWS',\n\t\t\t\t\tlength: rowsToAdd,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tif (columnsToAdd > 0) {\n\t\t\trequests.push({\n\t\t\t\tappendDimension: {\n\t\t\t\t\tsheetId,\n\t\t\t\t\tdimension: 'COLUMNS',\n\t\t\t\t\tlength: columnsToAdd,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tif (requests.length === 0) {\n\t\t\tthrow new ApplicationError('Must specify at least one column or row to add', {\n\t\t\t\tlevel: 'warning',\n\t\t\t});\n\t\t}\n\n\t\tconst response = await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'POST',\n\t\t\t`/v4/spreadsheets/${this.id}:batchUpdate`,\n\t\t\t{ requests },\n\t\t);\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Appends the cell values\n\t */\n\tasync appendData(\n\t\trange: string,\n\t\tdata: string[][],\n\t\tvalueInputMode: ValueInputOption,\n\t\tlastRow?: number,\n\t\tuseAppend?: boolean,\n\t) {\n\t\tconst lastRowWithData =\n\t\t\tlastRow ||\n\t\t\t(((await this.getData(range, 'UNFORMATTED_VALUE')) as string[][]) || []).length + 1;\n\n\t\tconst response = await this.updateRows(\n\t\t\trange,\n\t\t\tdata,\n\t\t\tvalueInputMode,\n\t\t\tlastRowWithData,\n\t\t\tdata.length,\n\t\t\tuseAppend,\n\t\t);\n\n\t\treturn response;\n\t}\n\n\tasync updateRows(\n\t\tsheetName: string,\n\t\tdata: string[][],\n\t\tvalueInputMode: ValueInputOption,\n\t\trow: number,\n\t\trowsLength?: number,\n\t\tuseAppend?: boolean,\n\t) {\n\t\tconst [name, _sheetRange] = sheetName.split('!');\n\t\tconst range = `${name}!${row}:${rowsLength ? row + rowsLength - 1 : row}`;\n\n\t\tconst body = {\n\t\t\trange,\n\t\t\tvalues: data,\n\t\t};\n\n\t\tconst query = {\n\t\t\tvalueInputOption: valueInputMode,\n\t\t};\n\n\t\tlet response;\n\n\t\tif (useAppend) {\n\t\t\tresponse = await apiRequest.call(\n\t\t\t\tthis.executeFunctions,\n\t\t\t\t'POST',\n\t\t\t\t`/v4/spreadsheets/${this.id}/values/${this.encodeRange(range)}:append`,\n\t\t\t\tbody,\n\t\t\t\tquery,\n\t\t\t);\n\t\t} else {\n\t\t\tresponse = await apiRequest.call(\n\t\t\t\tthis.executeFunctions,\n\t\t\t\t'PUT',\n\t\t\t\t`/v4/spreadsheets/${this.id}/values/${this.encodeRange(range)}`,\n\t\t\t\tbody,\n\t\t\t\tquery,\n\t\t\t);\n\t\t}\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Returns the given sheet data in a structured way\n\t */\n\tconvertSheetDataArrayToObjectArray(\n\t\tdata: SheetRangeData,\n\t\tstartRow: number,\n\t\tcolumnKeys: string[],\n\t\taddEmpty?: boolean,\n\t): IDataObject[] {\n\t\tconst returnData = [];\n\n\t\tfor (let rowIndex = startRow; rowIndex < data.length; rowIndex++) {\n\t\t\tconst item: IDataObject = {};\n\t\t\tfor (let columnIndex = 0; columnIndex < data[rowIndex].length; columnIndex++) {\n\t\t\t\tconst key = columnKeys[columnIndex];\n\t\t\t\tif (key) {\n\t\t\t\t\titem[key] = data[rowIndex][columnIndex];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Object.keys(item).length || addEmpty === true) {\n\t\t\t\treturnData.push(item);\n\t\t\t}\n\t\t}\n\n\t\treturn returnData;\n\t}\n\n\t/**\n\t * Returns the given sheet data in a structured way using\n\t * the startRow as the one with the name of the key\n\t */\n\tstructureArrayDataByColumn(\n\t\tinputData: string[][],\n\t\tkeyRow: number,\n\t\tdataStartRow: number,\n\t): IDataObject[] {\n\t\tconst keys: string[] = [];\n\n\t\tif (keyRow < 0 || dataStartRow < keyRow || keyRow >= inputData.length) {\n\t\t\t// The key row does not exist so it is not possible to structure data\n\t\t\treturn [];\n\t\t}\n\n\t\tconst longestRow = inputData.reduce((a, b) => (a.length > b.length ? a : b), []).length;\n\t\tfor (let columnIndex = 0; columnIndex < longestRow; columnIndex++) {\n\t\t\tkeys.push(inputData[keyRow][columnIndex] || `col_${columnIndex}`);\n\t\t}\n\n\t\treturn this.convertSheetDataArrayToObjectArray(inputData, dataStartRow, keys);\n\t}\n\n\ttestFilter(inputData: string[][], keyRow: number, dataStartRow: number): string[] {\n\t\tconst keys: string[] = [];\n\t\t//const returnData = [];\n\n\t\tif (keyRow < 0 || dataStartRow < keyRow || keyRow >= inputData.length) {\n\t\t\t// The key row does not exist so it is not possible to structure data\n\t\t\treturn [];\n\t\t}\n\n\t\t// Create the keys array\n\t\tfor (let columnIndex = 0; columnIndex < inputData[keyRow].length; columnIndex++) {\n\t\t\tkeys.push(inputData[keyRow][columnIndex]);\n\t\t}\n\n\t\treturn keys;\n\t}\n\n\tasync appendSheetData({\n\t\tinputData,\n\t\trange,\n\t\tkeyRowIndex,\n\t\tvalueInputMode,\n\t\tusePathForKeyRow,\n\t\tcolumnNamesList,\n\t\tlastRow,\n\t\tuseAppend,\n\t}: {\n\t\tinputData: IDataObject[];\n\t\trange: string;\n\t\tkeyRowIndex: number;\n\t\tvalueInputMode: ValueInputOption;\n\t\tusePathForKeyRow?: boolean;\n\t\tcolumnNamesList?: string[][];\n\t\tlastRow?: number;\n\t\tuseAppend?: boolean;\n\t}): Promise<string[][]> {\n\t\tconst data = await this.convertObjectArrayToSheetDataArray(\n\t\t\tinputData,\n\t\t\trange,\n\t\t\tkeyRowIndex,\n\t\t\tusePathForKeyRow,\n\t\t\tcolumnNamesList,\n\t\t\tuseAppend ? null : '',\n\t\t);\n\t\treturn await this.appendData(range, data, valueInputMode, lastRow, useAppend);\n\t}\n\n\tgetColumnWithOffset(startColumn: string, offset: number): string {\n\t\tconst columnIndex = xlsxUtils.decode_col(startColumn) + offset;\n\t\treturn xlsxUtils.encode_col(columnIndex);\n\t}\n\n\tasync getColumnValues({\n\t\trange,\n\t\tkeyIndex,\n\t\tdataStartRowIndex,\n\t\tvalueRenderMode,\n\t\tsheetData,\n\t}: {\n\t\trange: string;\n\t\tkeyIndex: number;\n\t\tdataStartRowIndex: number;\n\t\tvalueRenderMode: ValueRenderOption;\n\t\tsheetData?: string[][];\n\t}): Promise<string[]> {\n\t\tlet columnValuesList;\n\t\tif (sheetData) {\n\t\t\tcolumnValuesList = sheetData.slice(dataStartRowIndex - 1).map((row) => row[keyIndex]);\n\t\t} else {\n\t\t\tconst decodedRange = this.getDecodedSheetRange(range);\n\t\t\tconst startRowIndex = decodedRange.start?.row || dataStartRowIndex;\n\t\t\tconst endRowIndex = decodedRange.end?.row || '';\n\n\t\t\tconst keyColumn = this.getColumnWithOffset(decodedRange.start?.column || 'A', keyIndex);\n\t\t\tconst keyColumnRange = `${decodedRange.name}!${keyColumn}${startRowIndex}:${keyColumn}${endRowIndex}`;\n\t\t\tcolumnValuesList = await this.getData(keyColumnRange, valueRenderMode);\n\t\t}\n\n\t\tif (columnValuesList === undefined) {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.executeFunctions.getNode(),\n\t\t\t\t'Could not retrieve the data from key column',\n\t\t\t);\n\t\t}\n\n\t\t//Remove the first row which contains the key and flaten the array\n\t\treturn columnValuesList.splice(1).flatMap((value) => value);\n\t}\n\n\t/**\n\t * Updates data in a sheet\n\t *\n\t * @param {IDataObject[]} inputData Data to update Sheet with\n\t * @param {string} indexKey The name of the key which gets used to know which rows to update\n\t * @param {string} range The range to look for data\n\t * @param {number} keyRowIndex Index of the row which contains the keys\n\t * @param {number} dataStartRowIndex Index of the first row which contains data\n\t * @returns {Promise<string[][]>}\n\t * @memberof GoogleSheet\n\t */\n\tasync prepareDataForUpdateOrUpsert({\n\t\tinputData,\n\t\tindexKey,\n\t\trange,\n\t\tkeyRowIndex,\n\t\tdataStartRowIndex,\n\t\tvalueRenderMode,\n\t\tupsert = false,\n\t\tcolumnNamesList,\n\t\tcolumnValuesList,\n\t}: {\n\t\tinputData: IDataObject[];\n\t\tindexKey: string;\n\t\trange: string;\n\t\tkeyRowIndex: number;\n\t\tdataStartRowIndex: number;\n\t\tvalueRenderMode: ValueRenderOption;\n\t\tupsert?: boolean;\n\t\tcolumnNamesList?: string[][];\n\t\tcolumnValuesList?: string[];\n\t}) {\n\t\tconst decodedRange = this.getDecodedSheetRange(range);\n\t\tconst keyRowRange = `${decodedRange.name}!${decodedRange.start?.column || ''}${keyRowIndex + 1}:${decodedRange.end?.column || ''}${keyRowIndex + 1}`;\n\n\t\tconst sheetDatakeyRow = columnNamesList || (await this.getData(keyRowRange, valueRenderMode));\n\n\t\tif (sheetDatakeyRow === undefined) {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.executeFunctions.getNode(),\n\t\t\t\t'Could not retrieve the key row',\n\t\t\t);\n\t\t}\n\n\t\tconst columnNames = sheetDatakeyRow[0];\n\n\t\tconst keyIndex = columnNames.indexOf(indexKey);\n\n\t\tif (keyIndex === -1 && !upsert) {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.executeFunctions.getNode(),\n\t\t\t\t`Could not find column for key \"${indexKey}\"`,\n\t\t\t);\n\t\t}\n\n\t\tconst columnValues: Array<string | number> =\n\t\t\tcolumnValuesList ||\n\t\t\t(await this.getColumnValues({ range, keyIndex, dataStartRowIndex, valueRenderMode }));\n\n\t\tconst updateData: ISheetUpdateData[] = [];\n\t\tconst appendData: IDataObject[] = [];\n\n\t\tconst getKeyIndex = (key: string | number, data: Array<string | number>) => {\n\t\t\tlet index = -1;\n\t\t\tfor (let i = 0; i < data.length; i++) {\n\t\t\t\tif (data[i]?.toString() === key.toString()) {\n\t\t\t\t\tindex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn index;\n\t\t};\n\n\t\tfor (const item of inputData) {\n\t\t\tconst inputIndexKey = item[indexKey] as string;\n\n\t\t\tif (inputIndexKey === undefined || inputIndexKey === null) {\n\t\t\t\t// Item does not have the indexKey so we can ignore it or append it if upsert true\n\t\t\t\tif (upsert) {\n\t\t\t\t\tappendData.push(item);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Item does have the key so check if it exists in Sheet\n\t\t\tconst indexOfIndexKeyInSheet = getKeyIndex(inputIndexKey, columnValues);\n\n\t\t\tif (indexOfIndexKeyInSheet === -1) {\n\t\t\t\t// Key does not exist in the Sheet so it can not be updated so skip it or append it if upsert true\n\t\t\t\tif (upsert) {\n\t\t\t\t\tappendData.push(item);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get the row index in which the data should be updated\n\t\t\tconst updateRowIndex = indexOfIndexKeyInSheet + dataStartRowIndex + 1;\n\n\t\t\t// Check all the properties in the sheet and check which ones exist on the\n\t\t\t// item and should be updated\n\t\t\tfor (const name of columnNames) {\n\t\t\t\tif (name === indexKey) {\n\t\t\t\t\t// Ignore the key itself as that does not get changed it gets\n\t\t\t\t\t// only used to find the correct row to update\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (item[name] === undefined || item[name] === null) {\n\t\t\t\t\t// Property does not exist so skip it\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Property exists so add it to the data to update\n\t\t\t\t// Get the column name in which the property data can be found\n\t\t\t\tconst columnToUpdate = this.getColumnWithOffset(\n\t\t\t\t\tdecodedRange.start?.column || 'A',\n\t\t\t\t\tcolumnNames.indexOf(name),\n\t\t\t\t);\n\n\t\t\t\tlet updateValue = item[name] as string;\n\t\t\t\tif (typeof updateValue === 'object') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tupdateValue = JSON.stringify(updateValue);\n\t\t\t\t\t} catch (error) {}\n\t\t\t\t}\n\t\t\t\tupdateData.push({\n\t\t\t\t\trange: `${decodedRange.name}!${columnToUpdate}${updateRowIndex}`,\n\t\t\t\t\tvalues: [[updateValue]],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn { updateData, appendData };\n\t}\n\n\t/**\n\t * Updates data in a sheet\n\t *\n\t * @param {IDataObject[]} inputData Data to update Sheet with\n\t * @param {string} range The range to look for data\n\t * @param {number} dataStartRowIndex Index of the first row which contains data\n\t * @param {string[][]} columnNamesList The column names to use\n\t * @returns {Promise<string[][]>}\n\t * @memberof GoogleSheet\n\t */\n\tprepareDataForUpdatingByRowNumber(\n\t\tinputData: IDataObject[],\n\t\trange: string,\n\t\tcolumnNamesList: string[][],\n\t) {\n\t\tconst decodedRange = this.getDecodedSheetRange(range);\n\t\tconst columnNames = columnNamesList[0];\n\t\tconst updateData: ISheetUpdateData[] = [];\n\n\t\tfor (const item of inputData) {\n\t\t\tconst updateRowIndex = item.row_number as number;\n\n\t\t\tfor (const name of columnNames) {\n\t\t\t\tif (name === 'row_number') continue;\n\t\t\t\tif (item[name] === undefined || item[name] === null) continue;\n\n\t\t\t\tconst columnToUpdate = this.getColumnWithOffset(\n\t\t\t\t\tdecodedRange.start?.column || 'A',\n\t\t\t\t\tcolumnNames.indexOf(name),\n\t\t\t\t);\n\n\t\t\t\tlet updateValue = item[name] as string;\n\t\t\t\tif (typeof updateValue === 'object') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tupdateValue = JSON.stringify(updateValue);\n\t\t\t\t\t} catch (error) {}\n\t\t\t\t}\n\t\t\t\tupdateData.push({\n\t\t\t\t\trange: `${decodedRange.name}!${columnToUpdate}${updateRowIndex}`,\n\t\t\t\t\tvalues: [[updateValue]],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn { updateData };\n\t}\n\n\t/**\n\t * Looks for a specific value in a column and if it gets found it returns the whole row\n\t *\n\t * @param {string[][]} inputData Data to check for lookup value in\n\t * @param {number} keyRowIndex Index of the row which contains the keys\n\t * @param {number} dataStartRowIndex Index of the first row which contains data\n\t * @param {ILookupValues[]} lookupValues The lookup values which decide what data to return\n\t * @param {boolean} [returnAllMatches] Returns all the found matches instead of only the first one\n\t * @returns {Promise<IDataObject[]>}\n\t * @memberof GoogleSheet\n\t */\n\tasync lookupValues({\n\t\tinputData,\n\t\tkeyRowIndex,\n\t\tdataStartRowIndex,\n\t\tlookupValues,\n\t\treturnAllMatches,\n\t\tnodeVersion,\n\t\tcombineFilters = 'OR',\n\t}: {\n\t\tinputData: string[][];\n\t\tkeyRowIndex: number;\n\t\tdataStartRowIndex: number;\n\t\tlookupValues: ILookupValues[];\n\t\tnodeVersion: number;\n\t\treturnAllMatches?: boolean;\n\t\tcombineFilters?: 'AND' | 'OR';\n\t}): Promise<IDataObject[]> {\n\t\tconst keys: string[] = [];\n\n\t\tif (keyRowIndex < 0 || dataStartRowIndex < keyRowIndex || keyRowIndex >= inputData.length) {\n\t\t\t// The key row does not exist so it is not possible to look up the data\n\t\t\tthrow new NodeOperationError(this.executeFunctions.getNode(), 'The key row does not exist');\n\t\t}\n\n\t\t// Create the keys array\n\t\tfor (let columnIndex = 0; columnIndex < inputData[keyRowIndex].length; columnIndex++) {\n\t\t\tkeys.push(inputData[keyRowIndex][columnIndex] || `col_${columnIndex}`);\n\t\t}\n\n\t\t// Standardize values array, if rows is [[]], map it to [['']] (Keep the columns into consideration)\n\t\tfor (let rowIndex = 0; rowIndex < inputData?.length; rowIndex++) {\n\t\t\tif (inputData[rowIndex].length === 0) {\n\t\t\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\t\t\tinputData[rowIndex][i] = '';\n\t\t\t\t}\n\t\t\t} else if (inputData[rowIndex].length < keys.length) {\n\t\t\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\t\t\tif (inputData[rowIndex][i] === undefined) {\n\t\t\t\t\t\tinputData[rowIndex].push('');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Loop over all the lookup values and try to find a row to return\n\t\tlet rowIndex: number;\n\t\tlet returnColumnIndex: number;\n\t\tconst addedRows: number[] = [];\n\n\t\t// const returnData = [inputData[keyRowIndex]];\n\t\tconst returnData = [keys];\n\n\t\tif (combineFilters === 'OR') {\n\t\t\tlookupLoop: for (const lookupValue of lookupValues) {\n\t\t\t\treturnColumnIndex = keys.indexOf(lookupValue.lookupColumn);\n\n\t\t\t\tif (returnColumnIndex === -1) {\n\t\t\t\t\tthrow new NodeOperationError(\n\t\t\t\t\t\tthis.executeFunctions.getNode(),\n\t\t\t\t\t\t`The column \"${lookupValue.lookupColumn}\" could not be found`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Loop over all the items and find the one with the matching value\n\t\t\t\tfor (rowIndex = dataStartRowIndex; rowIndex < inputData.length; rowIndex++) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tinputData[rowIndex][returnColumnIndex]?.toString() ===\n\t\t\t\t\t\tlookupValue.lookupValue.toString()\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (addedRows.indexOf(rowIndex) === -1) {\n\t\t\t\t\t\t\treturnData.push(inputData[rowIndex]);\n\t\t\t\t\t\t\taddedRows.push(rowIndex);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (returnAllMatches !== true) {\n\t\t\t\t\t\t\tif (nodeVersion >= 4.6) {\n\t\t\t\t\t\t\t\tbreak lookupLoop;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue lookupLoop;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlookupLoop: for (rowIndex = dataStartRowIndex; rowIndex < inputData.length; rowIndex++) {\n\t\t\t\tlet allMatch = true;\n\n\t\t\t\tfor (const lookupValue of lookupValues) {\n\t\t\t\t\treturnColumnIndex = keys.indexOf(lookupValue.lookupColumn);\n\n\t\t\t\t\tif (returnColumnIndex === -1) {\n\t\t\t\t\t\tthrow new NodeOperationError(\n\t\t\t\t\t\t\tthis.executeFunctions.getNode(),\n\t\t\t\t\t\t\t`The column \"${lookupValue.lookupColumn}\" could not be found`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tinputData[rowIndex][returnColumnIndex]?.toString() !==\n\t\t\t\t\t\tlookupValue.lookupValue.toString()\n\t\t\t\t\t) {\n\t\t\t\t\t\tallMatch = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (allMatch) {\n\t\t\t\t\tif (addedRows.indexOf(rowIndex) === -1) {\n\t\t\t\t\t\treturnData.push(inputData[rowIndex]);\n\t\t\t\t\t\taddedRows.push(rowIndex);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (returnAllMatches !== true) {\n\t\t\t\t\t\tbreak lookupLoop;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst dataWithoutEmptyColumns = removeEmptyColumns(returnData);\n\t\treturn this.convertSheetDataArrayToObjectArray(\n\t\t\tdataWithoutEmptyColumns,\n\t\t\t1,\n\t\t\tdataWithoutEmptyColumns[0] as string[],\n\t\t\ttrue,\n\t\t);\n\t}\n\n\tprivate async convertObjectArrayToSheetDataArray(\n\t\tinputData: IDataObject[],\n\t\trange: string,\n\t\tkeyRowIndex: number,\n\t\tusePathForKeyRow?: boolean,\n\t\tcolumnNamesList?: string[][],\n\t\temptyValue: string | null = '',\n\t): Promise<string[][]> {\n\t\tconst decodedRange = this.getDecodedSheetRange(range);\n\n\t\tconst columnNamesRow =\n\t\t\tcolumnNamesList ||\n\t\t\t(await this.getData(\n\t\t\t\t`${decodedRange.name}!${keyRowIndex}:${keyRowIndex}`,\n\t\t\t\t'UNFORMATTED_VALUE',\n\t\t\t));\n\n\t\tif (columnNamesRow === undefined) {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.executeFunctions.getNode(),\n\t\t\t\t'Could not retrieve the column data',\n\t\t\t);\n\t\t}\n\n\t\tconst columnNames = columnNamesRow ? columnNamesRow[0] : [];\n\t\tconst setData: string[][] = [];\n\n\t\tinputData.forEach((item) => {\n\t\t\tconst rowData: string[] = [];\n\t\t\tcolumnNames.forEach((key) => {\n\t\t\t\tlet value;\n\t\t\t\tif (usePathForKeyRow) {\n\t\t\t\t\tvalue = get(item, key) as string;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = item[key] as string;\n\t\t\t\t}\n\t\t\t\tif (value === undefined || value === null) {\n\t\t\t\t\trowData.push(emptyValue as string);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (typeof value === 'object') {\n\t\t\t\t\trowData.push(JSON.stringify(value));\n\t\t\t\t} else {\n\t\t\t\t\trowData.push(value);\n\t\t\t\t}\n\t\t\t});\n\t\t\tsetData.push(rowData);\n\t\t});\n\t\treturn setData;\n\t}\n\n\tprivate getDecodedSheetRange(stringToDecode: string): SheetRangeDecoded {\n\t\tconst decodedRange: IDataObject = {};\n\t\tconst [name, range] = stringToDecode.split('!');\n\n\t\tdecodedRange.nameWithRange = stringToDecode;\n\t\tdecodedRange.name = name;\n\t\tdecodedRange.range = range || '';\n\t\tdecodedRange.start = {};\n\t\tdecodedRange.end = {};\n\n\t\tif (range) {\n\t\t\tconst [startCell, endCell] = range.split(':');\n\t\t\tif (startCell) {\n\t\t\t\tdecodedRange.start = this.splitCellRange(startCell, range);\n\t\t\t}\n\t\t\tif (endCell) {\n\t\t\t\tdecodedRange.end = this.splitCellRange(endCell, range);\n\t\t\t}\n\t\t}\n\n\t\treturn decodedRange as SheetRangeDecoded;\n\t}\n\n\tprivate splitCellRange(cell: string, range: string): SheetCellDecoded {\n\t\tconst cellData = cell.match(/([a-zA-Z]{1,10})([0-9]{0,10})/) || [];\n\n\t\tif (cellData === null || cellData.length !== 3) {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.executeFunctions.getNode(),\n\t\t\t\t`The range \"${range}\" is not valid`,\n\t\t\t);\n\t\t}\n\n\t\treturn { cell: cellData[0], column: cellData[1], row: +cellData[2] };\n\t}\n}\n"],"mappings":"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","names":["xlsxUtils","rowIndex","get"]}
1
+ {"version":3,"sources":["../../../../../../nodes/Google/Sheet/v2/helpers/GoogleSheet.ts"],"sourcesContent":["import get from 'lodash/get';\nimport type {\n\tIDataObject,\n\tIExecuteFunctions,\n\tILoadOptionsFunctions,\n\tINode,\n\tIPollFunctions,\n} from 'n8n-workflow';\nimport { ApplicationError, NodeOperationError } from 'n8n-workflow';\nimport { utils as xlsxUtils } from 'xlsx';\n\nimport type {\n\tILookupValues,\n\tISheetUpdateData,\n\tResourceLocator,\n\tSheetCellDecoded,\n\tSheetRangeData,\n\tSheetRangeDecoded,\n\tSpreadSheetResponse,\n\tValueInputOption,\n\tValueRenderOption,\n} from './GoogleSheets.types';\nimport { getSheetId, removeEmptyColumns } from './GoogleSheets.utils';\nimport { apiRequest } from '../transport';\n\nexport class GoogleSheet {\n\tid: string;\n\n\texecuteFunctions: IExecuteFunctions | ILoadOptionsFunctions | IPollFunctions;\n\n\tconstructor(\n\t\tspreadsheetId: string,\n\t\texecuteFunctions: IExecuteFunctions | ILoadOptionsFunctions | IPollFunctions,\n\t) {\n\t\tthis.executeFunctions = executeFunctions;\n\t\tthis.id = spreadsheetId;\n\t}\n\n\t/**\n\t * Encodes the range that also none latin character work\n\t *\n\t * @param {string} range\n\t * @returns {string}\n\t * @memberof GoogleSheet\n\t */\n\tprivate encodeRange(range: string): string {\n\t\tif (range.includes('!')) {\n\t\t\tconst [sheet, ranges] = range.split('!');\n\t\t\treturn `${encodeURIComponent(sheet)}!${ranges}`;\n\t\t}\n\t\t// Use '' so that sheet is not interpreted as range\n\t\treturn encodeURIComponent(`'${range}'`);\n\t}\n\n\t/**\n\t * Clears values from a sheet\n\t *\n\t * @param {string} range\n\t * @returns {Promise<object>}\n\t * @memberof GoogleSheet\n\t */\n\tasync clearData(range: string): Promise<object> {\n\t\tconst body = {\n\t\t\tspreadsheetId: this.id,\n\t\t\trange,\n\t\t};\n\n\t\tconst response = await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'POST',\n\t\t\t`/v4/spreadsheets/${this.id}/values/${this.encodeRange(range)}:clear`,\n\t\t\tbody,\n\t\t);\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Returns the cell values\n\t */\n\tasync getData(range: string, valueRenderMode: ValueRenderOption, dateTimeRenderOption?: string) {\n\t\tconst query: IDataObject = {\n\t\t\tvalueRenderOption: valueRenderMode,\n\t\t\tdateTimeRenderOption: 'FORMATTED_STRING',\n\t\t};\n\n\t\tif (dateTimeRenderOption) {\n\t\t\tquery.dateTimeRenderOption = dateTimeRenderOption;\n\t\t}\n\n\t\tconst response = await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'GET',\n\t\t\t`/v4/spreadsheets/${this.id}/values/${this.encodeRange(range)}`,\n\t\t\t{},\n\t\t\tquery,\n\t\t);\n\n\t\treturn response.values as string[][] | undefined;\n\t}\n\n\t/**\n\t * Returns the sheets in a Spreadsheet\n\t */\n\tasync spreadsheetGetSheets() {\n\t\tconst query = {\n\t\t\tfields: 'sheets.properties',\n\t\t};\n\n\t\tconst response = await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'GET',\n\t\t\t`/v4/spreadsheets/${this.id}`,\n\t\t\t{},\n\t\t\tquery,\n\t\t);\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Returns the sheet within a spreadsheet based on name or ID\n\t */\n\tasync spreadsheetGetSheet(node: INode, mode: ResourceLocator, value: string) {\n\t\tconst query = {\n\t\t\tfields: 'sheets.properties',\n\t\t};\n\n\t\tconst response = (await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'GET',\n\t\t\t`/v4/spreadsheets/${this.id}`,\n\t\t\t{},\n\t\t\tquery,\n\t\t)) as SpreadSheetResponse;\n\n\t\tconst foundItem = response.sheets.find((item) => {\n\t\t\tif (mode === 'name') return item.properties.title === value;\n\t\t\treturn item.properties.sheetId === getSheetId(value);\n\t\t});\n\n\t\tif (!foundItem?.properties?.title) {\n\t\t\tconst error = new Error(`Sheet with ${mode === 'name' ? 'name' : 'ID'} ${value} not found`);\n\t\t\tthrow new NodeOperationError(node, error, { level: 'warning' });\n\t\t}\n\n\t\treturn foundItem.properties;\n\t}\n\n\t/**\n\t * Returns the grid properties of a sheet\n\t */\n\tasync getDataRange(sheetId: string) {\n\t\tconst query = {\n\t\t\tfields: 'sheets.properties',\n\t\t};\n\n\t\tconst response = await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'GET',\n\t\t\t`/v4/spreadsheets/${this.id}`,\n\t\t\t{},\n\t\t\tquery,\n\t\t);\n\t\tconst foundItem = response.sheets.find(\n\t\t\t(item: { properties: { sheetId: string } }) => item.properties.sheetId === sheetId,\n\t\t);\n\t\treturn foundItem.properties.gridProperties;\n\t}\n\n\t/**\n\t * Sets values in one or more ranges of a spreadsheet.\n\t */\n\tasync spreadsheetBatchUpdate(requests: IDataObject[]) {\n\t\tconst body = {\n\t\t\trequests,\n\t\t};\n\n\t\tconst response = await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'POST',\n\t\t\t`/v4/spreadsheets/${this.id}:batchUpdate`,\n\t\t\tbody,\n\t\t);\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Sets the cell values\n\t */\n\tasync batchUpdate(updateData: ISheetUpdateData[], valueInputMode: ValueInputOption) {\n\t\tconst body = {\n\t\t\tdata: updateData,\n\t\t\tvalueInputOption: valueInputMode,\n\t\t};\n\n\t\tconst response = await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'POST',\n\t\t\t`/v4/spreadsheets/${this.id}/values:batchUpdate`,\n\t\t\tbody,\n\t\t);\n\n\t\treturn response;\n\t}\n\n\tasync appendEmptyRowsOrColumns(sheetId: string, rowsToAdd = 1, columnsToAdd = 1) {\n\t\tconst requests: IDataObject[] = [];\n\n\t\tif (rowsToAdd > 0) {\n\t\t\trequests.push({\n\t\t\t\tappendDimension: {\n\t\t\t\t\tsheetId,\n\t\t\t\t\tdimension: 'ROWS',\n\t\t\t\t\tlength: rowsToAdd,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tif (columnsToAdd > 0) {\n\t\t\trequests.push({\n\t\t\t\tappendDimension: {\n\t\t\t\t\tsheetId,\n\t\t\t\t\tdimension: 'COLUMNS',\n\t\t\t\t\tlength: columnsToAdd,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tif (requests.length === 0) {\n\t\t\tthrow new ApplicationError('Must specify at least one column or row to add', {\n\t\t\t\tlevel: 'warning',\n\t\t\t});\n\t\t}\n\n\t\tconst response = await apiRequest.call(\n\t\t\tthis.executeFunctions,\n\t\t\t'POST',\n\t\t\t`/v4/spreadsheets/${this.id}:batchUpdate`,\n\t\t\t{ requests },\n\t\t);\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Appends the cell values\n\t */\n\tasync appendData(\n\t\trange: string,\n\t\tdata: string[][],\n\t\tvalueInputMode: ValueInputOption,\n\t\tlastRow?: number,\n\t\tuseAppend?: boolean,\n\t) {\n\t\tconst lastRowWithData =\n\t\t\tlastRow ||\n\t\t\t(((await this.getData(range, 'UNFORMATTED_VALUE')) as string[][]) || []).length + 1;\n\n\t\tconst response = await this.updateRows(\n\t\t\trange,\n\t\t\tdata,\n\t\t\tvalueInputMode,\n\t\t\tlastRowWithData,\n\t\t\tdata.length,\n\t\t\tuseAppend,\n\t\t);\n\n\t\treturn response;\n\t}\n\n\tasync updateRows(\n\t\tsheetName: string,\n\t\tdata: string[][],\n\t\tvalueInputMode: ValueInputOption,\n\t\trow: number,\n\t\trowsLength?: number,\n\t\tuseAppend?: boolean,\n\t) {\n\t\tconst [name, _sheetRange] = sheetName.split('!');\n\t\tconst range = `${name}!${row}:${rowsLength ? row + rowsLength - 1 : row}`;\n\n\t\tconst body = {\n\t\t\trange,\n\t\t\tvalues: data,\n\t\t};\n\n\t\tconst query = {\n\t\t\tvalueInputOption: valueInputMode,\n\t\t};\n\n\t\tlet response;\n\n\t\tif (useAppend) {\n\t\t\tresponse = await apiRequest.call(\n\t\t\t\tthis.executeFunctions,\n\t\t\t\t'POST',\n\t\t\t\t`/v4/spreadsheets/${this.id}/values/${this.encodeRange(range)}:append`,\n\t\t\t\tbody,\n\t\t\t\tquery,\n\t\t\t);\n\t\t} else {\n\t\t\tresponse = await apiRequest.call(\n\t\t\t\tthis.executeFunctions,\n\t\t\t\t'PUT',\n\t\t\t\t`/v4/spreadsheets/${this.id}/values/${this.encodeRange(range)}`,\n\t\t\t\tbody,\n\t\t\t\tquery,\n\t\t\t);\n\t\t}\n\n\t\treturn response;\n\t}\n\n\t/**\n\t * Returns the given sheet data in a structured way\n\t */\n\tconvertSheetDataArrayToObjectArray(\n\t\tsheet: SheetRangeData,\n\t\tstartRow: number,\n\t\tcolumnKeys: string[],\n\t\taddEmpty?: boolean,\n\t\tincludeHeadersWithEmptyCells?: boolean,\n\t): IDataObject[] {\n\t\tconst returnData = [];\n\n\t\tfor (let rowIndex = startRow; rowIndex < sheet.length; rowIndex++) {\n\t\t\tconst item: IDataObject = {};\n\n\t\t\tconst rowCount = sheet[rowIndex].length;\n\t\t\tconst columnCount = includeHeadersWithEmptyCells ? columnKeys.length : rowCount;\n\n\t\t\tfor (let columnIndex = 0; columnIndex < columnCount; columnIndex++) {\n\t\t\t\tconst key = columnKeys[columnIndex];\n\t\t\t\tif (key) {\n\t\t\t\t\titem[key] = sheet[rowIndex][columnIndex] || '';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (Object.keys(item).length || addEmpty === true) {\n\t\t\t\treturnData.push(item);\n\t\t\t}\n\t\t}\n\n\t\treturn returnData;\n\t}\n\n\t/**\n\t * Returns the given sheet data in a structured way using\n\t * the startRow as the one with the name of the key\n\t */\n\tstructureArrayDataByColumn(\n\t\tinputData: string[][],\n\t\tkeyRow: number,\n\t\tdataStartRow: number,\n\t\tincludeHeadersWithEmptyCells?: boolean,\n\t): IDataObject[] {\n\t\tconst keys: string[] = [];\n\n\t\tif (keyRow < 0 || dataStartRow < keyRow || keyRow >= inputData.length) {\n\t\t\t// The key row does not exist so it is not possible to structure data\n\t\t\treturn [];\n\t\t}\n\n\t\tconst longestRow = inputData.reduce((a, b) => (a.length > b.length ? a : b), []).length;\n\t\tfor (let columnIndex = 0; columnIndex < longestRow; columnIndex++) {\n\t\t\tkeys.push(inputData[keyRow][columnIndex] || `col_${columnIndex}`);\n\t\t}\n\n\t\treturn this.convertSheetDataArrayToObjectArray(\n\t\t\tinputData,\n\t\t\tdataStartRow,\n\t\t\tkeys,\n\t\t\tfalse,\n\t\t\tincludeHeadersWithEmptyCells,\n\t\t);\n\t}\n\n\ttestFilter(inputData: string[][], keyRow: number, dataStartRow: number): string[] {\n\t\tconst keys: string[] = [];\n\t\t//const returnData = [];\n\n\t\tif (keyRow < 0 || dataStartRow < keyRow || keyRow >= inputData.length) {\n\t\t\t// The key row does not exist so it is not possible to structure data\n\t\t\treturn [];\n\t\t}\n\n\t\t// Create the keys array\n\t\tfor (let columnIndex = 0; columnIndex < inputData[keyRow].length; columnIndex++) {\n\t\t\tkeys.push(inputData[keyRow][columnIndex]);\n\t\t}\n\n\t\treturn keys;\n\t}\n\n\tasync appendSheetData({\n\t\tinputData,\n\t\trange,\n\t\tkeyRowIndex,\n\t\tvalueInputMode,\n\t\tusePathForKeyRow,\n\t\tcolumnNamesList,\n\t\tlastRow,\n\t\tuseAppend,\n\t}: {\n\t\tinputData: IDataObject[];\n\t\trange: string;\n\t\tkeyRowIndex: number;\n\t\tvalueInputMode: ValueInputOption;\n\t\tusePathForKeyRow?: boolean;\n\t\tcolumnNamesList?: string[][];\n\t\tlastRow?: number;\n\t\tuseAppend?: boolean;\n\t}): Promise<string[][]> {\n\t\tconst data = await this.convertObjectArrayToSheetDataArray(\n\t\t\tinputData,\n\t\t\trange,\n\t\t\tkeyRowIndex,\n\t\t\tusePathForKeyRow,\n\t\t\tcolumnNamesList,\n\t\t\tuseAppend ? null : '',\n\t\t);\n\t\treturn await this.appendData(range, data, valueInputMode, lastRow, useAppend);\n\t}\n\n\tgetColumnWithOffset(startColumn: string, offset: number): string {\n\t\tconst columnIndex = xlsxUtils.decode_col(startColumn) + offset;\n\t\treturn xlsxUtils.encode_col(columnIndex);\n\t}\n\n\tasync getColumnValues({\n\t\trange,\n\t\tkeyIndex,\n\t\tdataStartRowIndex,\n\t\tvalueRenderMode,\n\t\tsheetData,\n\t}: {\n\t\trange: string;\n\t\tkeyIndex: number;\n\t\tdataStartRowIndex: number;\n\t\tvalueRenderMode: ValueRenderOption;\n\t\tsheetData?: string[][];\n\t}): Promise<string[]> {\n\t\tlet columnValuesList;\n\t\tif (sheetData) {\n\t\t\tcolumnValuesList = sheetData.slice(dataStartRowIndex - 1).map((row) => row[keyIndex]);\n\t\t} else {\n\t\t\tconst decodedRange = this.getDecodedSheetRange(range);\n\t\t\tconst startRowIndex = decodedRange.start?.row || dataStartRowIndex;\n\t\t\tconst endRowIndex = decodedRange.end?.row || '';\n\n\t\t\tconst keyColumn = this.getColumnWithOffset(decodedRange.start?.column || 'A', keyIndex);\n\t\t\tconst keyColumnRange = `${decodedRange.name}!${keyColumn}${startRowIndex}:${keyColumn}${endRowIndex}`;\n\t\t\tcolumnValuesList = await this.getData(keyColumnRange, valueRenderMode);\n\t\t}\n\n\t\tif (columnValuesList === undefined) {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.executeFunctions.getNode(),\n\t\t\t\t'Could not retrieve the data from key column',\n\t\t\t);\n\t\t}\n\n\t\t//Remove the first row which contains the key and flaten the array\n\t\treturn columnValuesList.splice(1).flatMap((value) => value);\n\t}\n\n\t/**\n\t * Updates data in a sheet\n\t *\n\t * @param {IDataObject[]} inputData Data to update Sheet with\n\t * @param {string} indexKey The name of the key which gets used to know which rows to update\n\t * @param {string} range The range to look for data\n\t * @param {number} keyRowIndex Index of the row which contains the keys\n\t * @param {number} dataStartRowIndex Index of the first row which contains data\n\t * @returns {Promise<string[][]>}\n\t * @memberof GoogleSheet\n\t */\n\tasync prepareDataForUpdateOrUpsert({\n\t\tinputData,\n\t\tindexKey,\n\t\trange,\n\t\tkeyRowIndex,\n\t\tdataStartRowIndex,\n\t\tvalueRenderMode,\n\t\tupsert = false,\n\t\tcolumnNamesList,\n\t\tcolumnValuesList,\n\t}: {\n\t\tinputData: IDataObject[];\n\t\tindexKey: string;\n\t\trange: string;\n\t\tkeyRowIndex: number;\n\t\tdataStartRowIndex: number;\n\t\tvalueRenderMode: ValueRenderOption;\n\t\tupsert?: boolean;\n\t\tcolumnNamesList?: string[][];\n\t\tcolumnValuesList?: string[];\n\t}) {\n\t\tconst decodedRange = this.getDecodedSheetRange(range);\n\t\tconst keyRowRange = `${decodedRange.name}!${decodedRange.start?.column || ''}${keyRowIndex + 1}:${decodedRange.end?.column || ''}${keyRowIndex + 1}`;\n\n\t\tconst sheetDatakeyRow = columnNamesList || (await this.getData(keyRowRange, valueRenderMode));\n\n\t\tif (sheetDatakeyRow === undefined) {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.executeFunctions.getNode(),\n\t\t\t\t'Could not retrieve the key row',\n\t\t\t);\n\t\t}\n\n\t\tconst columnNames = sheetDatakeyRow[0];\n\n\t\tconst keyIndex = columnNames.indexOf(indexKey);\n\n\t\tif (keyIndex === -1 && !upsert) {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.executeFunctions.getNode(),\n\t\t\t\t`Could not find column for key \"${indexKey}\"`,\n\t\t\t);\n\t\t}\n\n\t\tconst columnValues: Array<string | number> =\n\t\t\tcolumnValuesList ||\n\t\t\t(await this.getColumnValues({ range, keyIndex, dataStartRowIndex, valueRenderMode }));\n\n\t\tconst updateData: ISheetUpdateData[] = [];\n\t\tconst appendData: IDataObject[] = [];\n\n\t\tconst getKeyIndex = (key: string | number, data: Array<string | number>) => {\n\t\t\tlet index = -1;\n\t\t\tfor (let i = 0; i < data.length; i++) {\n\t\t\t\tif (data[i]?.toString() === key.toString()) {\n\t\t\t\t\tindex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn index;\n\t\t};\n\n\t\tfor (const item of inputData) {\n\t\t\tconst inputIndexKey = item[indexKey] as string;\n\n\t\t\tif (inputIndexKey === undefined || inputIndexKey === null) {\n\t\t\t\t// Item does not have the indexKey so we can ignore it or append it if upsert true\n\t\t\t\tif (upsert) {\n\t\t\t\t\tappendData.push(item);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Item does have the key so check if it exists in Sheet\n\t\t\tconst indexOfIndexKeyInSheet = getKeyIndex(inputIndexKey, columnValues);\n\n\t\t\tif (indexOfIndexKeyInSheet === -1) {\n\t\t\t\t// Key does not exist in the Sheet so it can not be updated so skip it or append it if upsert true\n\t\t\t\tif (upsert) {\n\t\t\t\t\tappendData.push(item);\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Get the row index in which the data should be updated\n\t\t\tconst updateRowIndex = indexOfIndexKeyInSheet + dataStartRowIndex + 1;\n\n\t\t\t// Check all the properties in the sheet and check which ones exist on the\n\t\t\t// item and should be updated\n\t\t\tfor (const name of columnNames) {\n\t\t\t\tif (name === indexKey) {\n\t\t\t\t\t// Ignore the key itself as that does not get changed it gets\n\t\t\t\t\t// only used to find the correct row to update\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (item[name] === undefined || item[name] === null) {\n\t\t\t\t\t// Property does not exist so skip it\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Property exists so add it to the data to update\n\t\t\t\t// Get the column name in which the property data can be found\n\t\t\t\tconst columnToUpdate = this.getColumnWithOffset(\n\t\t\t\t\tdecodedRange.start?.column || 'A',\n\t\t\t\t\tcolumnNames.indexOf(name),\n\t\t\t\t);\n\n\t\t\t\tlet updateValue = item[name] as string;\n\t\t\t\tif (typeof updateValue === 'object') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tupdateValue = JSON.stringify(updateValue);\n\t\t\t\t\t} catch (error) {}\n\t\t\t\t}\n\t\t\t\tupdateData.push({\n\t\t\t\t\trange: `${decodedRange.name}!${columnToUpdate}${updateRowIndex}`,\n\t\t\t\t\tvalues: [[updateValue]],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn { updateData, appendData };\n\t}\n\n\t/**\n\t * Updates data in a sheet\n\t *\n\t * @param {IDataObject[]} inputData Data to update Sheet with\n\t * @param {string} range The range to look for data\n\t * @param {number} dataStartRowIndex Index of the first row which contains data\n\t * @param {string[][]} columnNamesList The column names to use\n\t * @returns {Promise<string[][]>}\n\t * @memberof GoogleSheet\n\t */\n\tprepareDataForUpdatingByRowNumber(\n\t\tinputData: IDataObject[],\n\t\trange: string,\n\t\tcolumnNamesList: string[][],\n\t) {\n\t\tconst decodedRange = this.getDecodedSheetRange(range);\n\t\tconst columnNames = columnNamesList[0];\n\t\tconst updateData: ISheetUpdateData[] = [];\n\n\t\tfor (const item of inputData) {\n\t\t\tconst updateRowIndex = item.row_number as number;\n\n\t\t\tfor (const name of columnNames) {\n\t\t\t\tif (name === 'row_number') continue;\n\t\t\t\tif (item[name] === undefined || item[name] === null) continue;\n\n\t\t\t\tconst columnToUpdate = this.getColumnWithOffset(\n\t\t\t\t\tdecodedRange.start?.column || 'A',\n\t\t\t\t\tcolumnNames.indexOf(name),\n\t\t\t\t);\n\n\t\t\t\tlet updateValue = item[name] as string;\n\t\t\t\tif (typeof updateValue === 'object') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tupdateValue = JSON.stringify(updateValue);\n\t\t\t\t\t} catch (error) {}\n\t\t\t\t}\n\t\t\t\tupdateData.push({\n\t\t\t\t\trange: `${decodedRange.name}!${columnToUpdate}${updateRowIndex}`,\n\t\t\t\t\tvalues: [[updateValue]],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn { updateData };\n\t}\n\n\t/**\n\t * Looks for a specific value in a column and if it gets found it returns the whole row\n\t *\n\t * @param {string[][]} inputData Data to check for lookup value in\n\t * @param {number} keyRowIndex Index of the row which contains the keys\n\t * @param {number} dataStartRowIndex Index of the first row which contains data\n\t * @param {ILookupValues[]} lookupValues The lookup values which decide what data to return\n\t * @param {boolean} [returnAllMatches] Returns all the found matches instead of only the first one\n\t * @returns {Promise<IDataObject[]>}\n\t * @memberof GoogleSheet\n\t */\n\tasync lookupValues({\n\t\tinputData,\n\t\tkeyRowIndex,\n\t\tdataStartRowIndex,\n\t\tlookupValues,\n\t\treturnAllMatches,\n\t\tnodeVersion,\n\t\tcombineFilters = 'OR',\n\t}: {\n\t\tinputData: string[][];\n\t\tkeyRowIndex: number;\n\t\tdataStartRowIndex: number;\n\t\tlookupValues: ILookupValues[];\n\t\tnodeVersion: number;\n\t\treturnAllMatches?: boolean;\n\t\tcombineFilters?: 'AND' | 'OR';\n\t}): Promise<IDataObject[]> {\n\t\tconst keys: string[] = [];\n\n\t\tif (keyRowIndex < 0 || dataStartRowIndex < keyRowIndex || keyRowIndex >= inputData.length) {\n\t\t\t// The key row does not exist so it is not possible to look up the data\n\t\t\tthrow new NodeOperationError(this.executeFunctions.getNode(), 'The key row does not exist');\n\t\t}\n\n\t\t// Create the keys array\n\t\tfor (let columnIndex = 0; columnIndex < inputData[keyRowIndex].length; columnIndex++) {\n\t\t\tkeys.push(inputData[keyRowIndex][columnIndex] || `col_${columnIndex}`);\n\t\t}\n\n\t\t// Standardize values array, if rows is [[]], map it to [['']] (Keep the columns into consideration)\n\t\tfor (let rowIndex = 0; rowIndex < inputData?.length; rowIndex++) {\n\t\t\tif (inputData[rowIndex].length === 0) {\n\t\t\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\t\t\tinputData[rowIndex][i] = '';\n\t\t\t\t}\n\t\t\t} else if (inputData[rowIndex].length < keys.length) {\n\t\t\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\t\t\tif (inputData[rowIndex][i] === undefined) {\n\t\t\t\t\t\tinputData[rowIndex].push('');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Loop over all the lookup values and try to find a row to return\n\t\tlet rowIndex: number;\n\t\tlet returnColumnIndex: number;\n\t\tconst addedRows: number[] = [];\n\n\t\t// const returnData = [inputData[keyRowIndex]];\n\t\tconst returnData = [keys];\n\n\t\tif (combineFilters === 'OR') {\n\t\t\tlookupLoop: for (const lookupValue of lookupValues) {\n\t\t\t\treturnColumnIndex = keys.indexOf(lookupValue.lookupColumn);\n\n\t\t\t\tif (returnColumnIndex === -1) {\n\t\t\t\t\tthrow new NodeOperationError(\n\t\t\t\t\t\tthis.executeFunctions.getNode(),\n\t\t\t\t\t\t`The column \"${lookupValue.lookupColumn}\" could not be found`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Loop over all the items and find the one with the matching value\n\t\t\t\tfor (rowIndex = dataStartRowIndex; rowIndex < inputData.length; rowIndex++) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tinputData[rowIndex][returnColumnIndex]?.toString() ===\n\t\t\t\t\t\tlookupValue.lookupValue.toString()\n\t\t\t\t\t) {\n\t\t\t\t\t\tif (addedRows.indexOf(rowIndex) === -1) {\n\t\t\t\t\t\t\treturnData.push(inputData[rowIndex]);\n\t\t\t\t\t\t\taddedRows.push(rowIndex);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (returnAllMatches !== true) {\n\t\t\t\t\t\t\tif (nodeVersion >= 4.6) {\n\t\t\t\t\t\t\t\tbreak lookupLoop;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue lookupLoop;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlookupLoop: for (rowIndex = dataStartRowIndex; rowIndex < inputData.length; rowIndex++) {\n\t\t\t\tlet allMatch = true;\n\n\t\t\t\tfor (const lookupValue of lookupValues) {\n\t\t\t\t\treturnColumnIndex = keys.indexOf(lookupValue.lookupColumn);\n\n\t\t\t\t\tif (returnColumnIndex === -1) {\n\t\t\t\t\t\tthrow new NodeOperationError(\n\t\t\t\t\t\t\tthis.executeFunctions.getNode(),\n\t\t\t\t\t\t\t`The column \"${lookupValue.lookupColumn}\" could not be found`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (\n\t\t\t\t\t\tinputData[rowIndex][returnColumnIndex]?.toString() !==\n\t\t\t\t\t\tlookupValue.lookupValue.toString()\n\t\t\t\t\t) {\n\t\t\t\t\t\tallMatch = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (allMatch) {\n\t\t\t\t\tif (addedRows.indexOf(rowIndex) === -1) {\n\t\t\t\t\t\treturnData.push(inputData[rowIndex]);\n\t\t\t\t\t\taddedRows.push(rowIndex);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (returnAllMatches !== true) {\n\t\t\t\t\t\tbreak lookupLoop;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst dataWithoutEmptyColumns = removeEmptyColumns(returnData);\n\t\treturn this.convertSheetDataArrayToObjectArray(\n\t\t\tdataWithoutEmptyColumns,\n\t\t\t1,\n\t\t\tdataWithoutEmptyColumns[0] as string[],\n\t\t\ttrue,\n\t\t);\n\t}\n\n\tprivate async convertObjectArrayToSheetDataArray(\n\t\tinputData: IDataObject[],\n\t\trange: string,\n\t\tkeyRowIndex: number,\n\t\tusePathForKeyRow?: boolean,\n\t\tcolumnNamesList?: string[][],\n\t\temptyValue: string | null = '',\n\t): Promise<string[][]> {\n\t\tconst decodedRange = this.getDecodedSheetRange(range);\n\n\t\tconst columnNamesRow =\n\t\t\tcolumnNamesList ||\n\t\t\t(await this.getData(\n\t\t\t\t`${decodedRange.name}!${keyRowIndex}:${keyRowIndex}`,\n\t\t\t\t'UNFORMATTED_VALUE',\n\t\t\t));\n\n\t\tif (columnNamesRow === undefined) {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.executeFunctions.getNode(),\n\t\t\t\t'Could not retrieve the column data',\n\t\t\t);\n\t\t}\n\n\t\tconst columnNames = columnNamesRow ? columnNamesRow[0] : [];\n\t\tconst setData: string[][] = [];\n\n\t\tinputData.forEach((item) => {\n\t\t\tconst rowData: string[] = [];\n\t\t\tcolumnNames.forEach((key) => {\n\t\t\t\tlet value;\n\t\t\t\tif (usePathForKeyRow) {\n\t\t\t\t\tvalue = get(item, key) as string;\n\t\t\t\t} else {\n\t\t\t\t\tvalue = item[key] as string;\n\t\t\t\t}\n\t\t\t\tif (value === undefined || value === null) {\n\t\t\t\t\trowData.push(emptyValue as string);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (typeof value === 'object') {\n\t\t\t\t\trowData.push(JSON.stringify(value));\n\t\t\t\t} else {\n\t\t\t\t\trowData.push(value);\n\t\t\t\t}\n\t\t\t});\n\t\t\tsetData.push(rowData);\n\t\t});\n\t\treturn setData;\n\t}\n\n\tprivate getDecodedSheetRange(stringToDecode: string): SheetRangeDecoded {\n\t\tconst decodedRange: IDataObject = {};\n\t\tconst [name, range] = stringToDecode.split('!');\n\n\t\tdecodedRange.nameWithRange = stringToDecode;\n\t\tdecodedRange.name = name;\n\t\tdecodedRange.range = range || '';\n\t\tdecodedRange.start = {};\n\t\tdecodedRange.end = {};\n\n\t\tif (range) {\n\t\t\tconst [startCell, endCell] = range.split(':');\n\t\t\tif (startCell) {\n\t\t\t\tdecodedRange.start = this.splitCellRange(startCell, range);\n\t\t\t}\n\t\t\tif (endCell) {\n\t\t\t\tdecodedRange.end = this.splitCellRange(endCell, range);\n\t\t\t}\n\t\t}\n\n\t\treturn decodedRange as SheetRangeDecoded;\n\t}\n\n\tprivate splitCellRange(cell: string, range: string): SheetCellDecoded {\n\t\tconst cellData = cell.match(/([a-zA-Z]{1,10})([0-9]{0,10})/) || [];\n\n\t\tif (cellData === null || cellData.length !== 3) {\n\t\t\tthrow new NodeOperationError(\n\t\t\t\tthis.executeFunctions.getNode(),\n\t\t\t\t`The range \"${range}\" is not valid`,\n\t\t\t);\n\t\t}\n\n\t\treturn { cell: cellData[0], column: cellData[1], row: +cellData[2] };\n\t}\n}\n"],"mappings":"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","names":["xlsxUtils","rowIndex","get"]}
@@ -70,7 +70,7 @@ async function getMappingColumns() {
70
70
  required: false,
71
71
  defaultMatch: false,
72
72
  display: true,
73
- type: "string",
73
+ type: "number",
74
74
  canBeUsedToMatch: true,
75
75
  readOnly: true,
76
76
  removed: true