Browse Source

feat: add google sheets option in loop data block

Ahmad Kholid 3 years ago
parent
commit
5cb0d4df2c

+ 1 - 1
src/background/workflow-engine/blocks-handler/handler-google-sheets.js

@@ -25,7 +25,7 @@ export default async function ({ data, outputs }) {
       throw new Error('empty-spreadsheet-id');
     if (isWhitespace(data.range)) throw new Error('empty-spreadsheet-range');
 
-    let result = '';
+    let result = [];
 
     if (data.type === 'get') {
       const spreadsheetValues = await getSpreadsheetValues(data);

+ 14 - 2
src/background/workflow-engine/blocks-handler/handler-loop-data.js

@@ -2,8 +2,9 @@ import { generateJSON } from '@/utils/data-exporter';
 import { getBlockConnection } from '../helper';
 
 function loopData(block) {
-  return new Promise((resolve) => {
+  return new Promise((resolve, reject) => {
     const { data } = block;
+    const nextBlockId = getBlockConnection(block);
 
     if (this.loopList[data.loopId]) {
       this.loopList[data.loopId].index += 1;
@@ -28,12 +29,23 @@ function loopData(block) {
         case 'data-columns':
           currLoopData = generateJSON(Object.keys(this.data), this.data);
           break;
+        case 'google-sheets':
+          currLoopData = this.googleSheets[data.referenceKey];
+          break;
         case 'custom-data':
           currLoopData = JSON.parse(data.loopData);
           break;
         default:
       }
 
+      if (data.loopThrough !== 'number' && !Array.isArray(currLoopData)) {
+        const error = new Error('invalid-loop-data');
+        error.nextBlockId = nextBlockId;
+
+        reject(error);
+        return;
+      }
+
       this.loopList[data.loopId] = {
         index: 0,
         data: currLoopData,
@@ -50,8 +62,8 @@ function loopData(block) {
     }
 
     resolve({
+      nextBlockId,
       data: this.loopData[data.loopId],
-      nextBlockId: getBlockConnection(block),
     });
   });
 }

+ 2 - 2
src/components/newtab/workflow/edit/EditGoogleSheets.vue

@@ -22,7 +22,7 @@
       <template #label>
         {{ t('workflow.blocks.google-sheets.spreadsheetId.label') }}
         <a
-          href="https://developers.google.com/sheets/api/guides/concepts#:~:text=the%20Sheets%20API%3A-,Spreadsheet,-The%20primary%20object"
+          href="https://github.com/Kholid060/automa/wiki/Blocks#spreadsheet-id"
           target="_blank"
           rel="noopener"
           :title="t('workflow.blocks.google-sheets.spreadsheetId.link')"
@@ -40,7 +40,7 @@
       <template #label>
         {{ t('workflow.blocks.google-sheets.range.label') }}
         <a
-          href="https://developers.google.com/sheets/api/guides/concepts#expandable-1"
+          href="https://github.com/Kholid060/automa/wiki/Blocks#range"
           target="_blank"
           rel="noopener"
           :title="t('workflow.blocks.google-sheets.range.link')"

+ 8 - 1
src/components/newtab/workflow/edit/EditLoopData.vue

@@ -46,6 +46,13 @@
     >
       {{ t('workflow.blocks.loop-data.buttons.insert') }}
     </ui-button>
+    <ui-input
+      v-else-if="data.loopThrough === 'google-sheets'"
+      :model-value="data.referenceKey"
+      :label="t('workflow.blocks.loop-data.refKey')"
+      class="w-full"
+      @change="updateData({ referenceKey: $event })"
+    />
     <div
       v-else-if="data.loopThrough === 'numbers'"
       class="flex items-center space-x-2"
@@ -135,7 +142,7 @@ const emit = defineEmits(['update:data']);
 const { t } = useI18n();
 
 const maxFileSize = 1024 * 1024;
-const loopTypes = ['data-columns', 'numbers', 'custom-data'];
+const loopTypes = ['data-columns', 'numbers', 'google-sheets', 'custom-data'];
 
 const state = shallowReactive({
   showOptions: false,

+ 3 - 1
src/locales/en/blocks.json

@@ -314,6 +314,7 @@
         "name": "Loop data",
         "description": "Iterate through data columns or your custom data",
         "loopId": "Loop ID",
+        "refKey": "Reference key",
         "modal": {
           "fileTooLarge": "File too large to edit",
           "maxFile": "Max file size is 1MB",
@@ -337,7 +338,8 @@
           "options": {
             "numbers": "Numbers",
             "data-columns": "Data columns",
-            "custom-data": "Custom data"
+            "custom-data": "Custom data",
+            "google-sheets": "Google sheets"
           }
         }
       },

+ 2 - 1
src/locales/en/newtab.json

@@ -98,9 +98,10 @@
       "invalid-proxy-host": "Invalid proxy host",
       "workflow-disabled": "Workflow is disabled",
       "selector-empty": "Element selector is empty",
-      "empty-spreadsheet-id": "Spreadsheet Id is empty",
       "invalid-body": "Content body is not valid JSON",
       "invalid-active-tab": "\"{url}\" is invalid URL",
+      "empty-spreadsheet-id": "Spreadsheet Id is empty",
+      "invalid-loop-data": "Invalid data to loop through",
       "empty-workflow": "You must select a workflow first",
       "empty-spreadsheet-range": "Spreadsheet range is empty",
       "active-tab-removed": "Workflow active tab is removed",

+ 2 - 0
src/utils/shared.js

@@ -422,6 +422,7 @@ export const tasks = {
     category: 'onlineServices',
     inputs: 1,
     outputs: 1,
+    docs: true,
     allowedInputs: true,
     maxConnection: 1,
     data: {
@@ -504,6 +505,7 @@ export const tasks = {
       toNumber: 10,
       loopData: '[]',
       description: '',
+      referenceKey: '',
       loopThrough: 'data-columns',
     },
   },