handler-google-sheets.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import { getBlockConnection } from '../helper';
  2. import { googleSheets } from '@/utils/api';
  3. import {
  4. convert2DArrayToArrayObj,
  5. convertArrObjTo2DArr,
  6. isWhitespace,
  7. parseJSON,
  8. } from '@/utils/helper';
  9. async function getSpreadsheetValues({ spreadsheetId, range, firstRowAsKey }) {
  10. const response = await googleSheets.getValues({ spreadsheetId, range });
  11. if (response.status !== 200) {
  12. throw new Error(response.statusText);
  13. }
  14. const { values } = await response.json();
  15. const sheetsData = firstRowAsKey ? convert2DArrayToArrayObj(values) : values;
  16. return sheetsData;
  17. }
  18. async function updateSpreadsheetValues(
  19. {
  20. spreadsheetId,
  21. range,
  22. valueInputOption,
  23. keysAsFirstRow,
  24. dataFrom,
  25. customData,
  26. },
  27. columns
  28. ) {
  29. let values = [];
  30. if (['data-columns', 'table'].includes(dataFrom)) {
  31. if (keysAsFirstRow) {
  32. values = convertArrObjTo2DArr(columns);
  33. } else {
  34. values = columns.map(Object.values);
  35. }
  36. } else if (dataFrom === 'custom') {
  37. values = parseJSON(customData, customData);
  38. }
  39. const response = await googleSheets.updateValues({
  40. range,
  41. spreadsheetId,
  42. valueInputOption,
  43. options: {
  44. body: JSON.stringify({ values }),
  45. },
  46. });
  47. if (response.status !== 200) {
  48. throw new Error(response.statusText);
  49. }
  50. }
  51. export default async function ({ data, outputs }) {
  52. const nextBlockId = getBlockConnection({ outputs });
  53. try {
  54. if (isWhitespace(data.spreadsheetId))
  55. throw new Error('empty-spreadsheet-id');
  56. if (isWhitespace(data.range)) throw new Error('empty-spreadsheet-range');
  57. let result = [];
  58. if (data.type === 'get') {
  59. const spreadsheetValues = await getSpreadsheetValues(data);
  60. result = spreadsheetValues;
  61. if (data.refKey && !isWhitespace(data.refKey)) {
  62. this.referenceData.googleSheets[data.refKey] = spreadsheetValues;
  63. }
  64. } else if (data.type === 'update') {
  65. result = await updateSpreadsheetValues(data, this.referenceData.table);
  66. }
  67. return {
  68. nextBlockId,
  69. data: result,
  70. };
  71. } catch (error) {
  72. error.nextBlockId = nextBlockId;
  73. throw error;
  74. }
  75. }