From 5ddae56d03e6e5ae018a9d51da56fd5ea0510796 Mon Sep 17 00:00:00 2001 From: Thomas Pohl Date: Sat, 16 May 2026 07:12:15 +0200 Subject: [PATCH 1/6] Add feature readCells #475 --- README.md | 1 + admin/blockly.js | 1 + admin/blocks/readCells.js | 56 +++++++++++++++++++ build/lib/google.js | 31 ++++++++++ build/lib/google.js.map | 4 +- build/lib/messageHandlers/cellHandlers.js | 22 ++++++++ build/lib/messageHandlers/cellHandlers.js.map | 4 +- build/lib/messageHandlers/index.js | 2 + build/lib/messageHandlers/index.js.map | 4 +- build/lib/messageHandlers/uploadHandlers.js | 4 +- .../lib/messageHandlers/uploadHandlers.js.map | 4 +- build/main.js | 3 +- build/main.js.map | 4 +- docs/features/read-cells.md | 37 ++++++++++++ package-lock.json | 2 +- src/lib/google.ts | 35 ++++++++++++ src/lib/messageHandlers/cellHandlers.ts | 34 +++++++++++ src/lib/messageHandlers/index.ts | 2 +- src/main.ts | 2 + test/unit/messageHandlers/readCells.test.ts | 35 ++++++++++++ 20 files changed, 272 insertions(+), 15 deletions(-) create mode 100644 admin/blocks/readCells.js create mode 100644 docs/features/read-cells.md create mode 100644 test/unit/messageHandlers/readCells.test.ts diff --git a/README.md b/README.md index 0c7e0c7..deb4719 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ This adapter can be used to automatically interact with google sheets. * [Delete sheets](docs/features/delete-sheets.md) * [Duplicate sheets](docs/features/duplicate-sheet.md) * [Read cell](docs/features/read-cell.md) +* [Read cells](docs/features/read-cells.md) * [Write cell](docs/features/write-cell.md) * [Write cells](docs/features/write-cells.md) diff --git a/admin/blockly.js b/admin/blockly.js index 1635b41..36fd0e3 100644 --- a/admin/blockly.js +++ b/admin/blockly.js @@ -128,5 +128,6 @@ loadJS('../google-spreadsheet/blocks/deleteSheet.js'); loadJS('../google-spreadsheet/blocks/deleteSheets.js'); loadJS('../google-spreadsheet/blocks/duplicateSheet.js'); loadJS('../google-spreadsheet/blocks/readCell.js'); +loadJS('../google-spreadsheet/blocks/readCells.js'); loadJS('../google-spreadsheet/blocks/writeCell.js'); loadJS('../google-spreadsheet/blocks/writeCells.js'); diff --git a/admin/blocks/readCells.js b/admin/blocks/readCells.js new file mode 100644 index 0000000..75bee74 --- /dev/null +++ b/admin/blocks/readCells.js @@ -0,0 +1,56 @@ +'use strict'; +/*global Blockly */ +/*global getInstances */ +/*global getInstanceAndAlias */ + +/// --- Read Cells -------------------------------------------------- + +Blockly.Words['google-spreadsheet_readcells_read-from'] = { en: 'read from', de: 'Lies von' }; +Blockly.Words['google-spreadsheet_readcells_on-sheetName'] = { en: 'sheet', de: 'Tabellenblatt' }; +Blockly.Words['google-spreadsheet_readcells_in-range'] = { en: 'range', de: 'Bereich' }; +Blockly.GoogleSheets.blocks['google-spreadsheet.readCells'] = + '' + + ' ' + + ' ' + + ' ' + + ' text' + + ' ' + + ' ' + + ' ' + + ' ' + + ' A1:A7' + + ' ' + + ' ' + + ''; + +Blockly.Blocks['google-spreadsheet.readCells'] = { + init: function () { + const instances = getInstances(false); + + this.appendDummyInput('NAME') + .appendField(Blockly.Translate('google-spreadsheet_readcells_read-from')) + .appendField(new Blockly.FieldDropdown(instances), 'INSTANCE'); + + this.appendValueInput('SHEET_NAME').appendField(Blockly.Translate('google-spreadsheet_readcells_on-sheetName')); + + this.appendValueInput('RANGE').appendField(Blockly.Translate('google-spreadsheet_readcells_in-range')); + + this.setInputsInline(true); + this.setPreviousStatement(false, null); + this.setNextStatement(false, null); + this.setOutput(true, 'Array'); + + this.setColour(Blockly.GoogleSheets.HUE); + }, +}; + +Blockly.JavaScript.forBlock['google-spreadsheet.readCells'] = function (block) { + const { instance, alias } = getInstanceAndAlias(block); + const sheetName = Blockly.JavaScript.valueToCode(block, 'SHEET_NAME', Blockly.JavaScript.ORDER_ATOMIC); + const range = Blockly.JavaScript.valueToCode(block, 'RANGE', Blockly.JavaScript.ORDER_ATOMIC); + + return [ + `await new Promise((resolve)=>{sendTo("google-spreadsheet${instance}", "readCells", {sheet: ${sheetName}, range: ${range}, alias: "${alias}"}, (response)=>{resolve(response)}, (response)=>{console.log('Error: ' + response.error); resolve([]);}); })`, + Blockly.JavaScript.ORDER_ATOMIC, + ]; +}; diff --git a/build/lib/google.js b/build/lib/google.js index c953c8b..d6d2762 100644 --- a/build/lib/google.js +++ b/build/lib/google.js @@ -456,6 +456,37 @@ class SpreadsheetUtils { }); }); } + /** + * Read data from a range of cells in a Google Spreadsheet + * + * @param sheetName Name of the sheet + * @param range A1 notation range to read (e.g. "A1:A7") + * @param sheetAlias Alias of the sheet to use (optional) + * @returns The data from the range as 2D array + */ + async readCells(sheetName, range, sheetAlias = null) { + const sheets = this.init(); + const spreadsheetId = this.getSpreadsheetId(sheetAlias); + return new Promise((resolve, reject) => { + if (range.startsWith("'") && range.endsWith("'")) { + range = range.substring(1, range.length - 1); + } + sheets.spreadsheets.values.get({ + range: `${sheetName}!${range}`, + spreadsheetId + }).then((response) => { + this.log.debug("Data successfully retrieved from google spreadsheet"); + if (response.data.values && response.data.values.length > 0) { + resolve(response.data.values); + } else { + resolve([]); + } + }).catch((error) => { + this.log.error(`Error while retrieving data from Google Spreadsheet:${error}`); + reject(new Error(`Error while retrieving data from Google Spreadsheet: ${error.message}`)); + }); + }); + } prepareValues(message) { if (Array.isArray(message)) { return [message]; diff --git a/build/lib/google.js.map b/build/lib/google.js.map index c0c11fa..a49e10a 100644 --- a/build/lib/google.js.map +++ b/build/lib/google.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../src/lib/google.ts"], - "sourcesContent": ["import { google } from 'googleapis';\nimport type { sheets_v4 } from 'googleapis/build/src/apis/sheets/v4';\n/**\n * This class provides utility functions to interact with Google Sheets\n *\n * @param config The adapter configuration\n * @param log The logger\n */\nexport class SpreadsheetUtils {\n /**\n * Constructor\n *\n * @param config The adapter configuration\n * @param log The logger\n */\n public constructor(\n private config: ioBroker.AdapterConfig,\n private log: ioBroker.Log,\n ) {}\n\n private init(): sheets_v4.Sheets {\n const auth = new google.auth.GoogleAuth({\n credentials: {\n client_email: this.config.serviceAccountEmail,\n private_key: this.formatPrivateKey(this.config.privateKey),\n },\n scopes: ['https://www.googleapis.com/auth/spreadsheets'],\n });\n return google.sheets({ version: 'v4', auth });\n }\n\n /**\n * Delete rows from a Google Spreadsheet\n *\n * @param sheetName Name of the sheet\n * @param start First row to delete\n * @param end Last row to delete\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public deleteRows(sheetName: string, start: number, end: number, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .get({ spreadsheetId })\n .then(spreadsheet => {\n if (spreadsheet && spreadsheet.data.sheets) {\n const sheet = spreadsheet.data.sheets.find(\n sheet => sheet.properties && sheet.properties.title == sheetName,\n );\n if (sheet && sheet.properties) {\n const sheetId = sheet.properties.sheetId;\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: [\n {\n deleteDimension: {\n range: {\n dimension: 'ROWS',\n endIndex: end,\n sheetId: sheetId,\n startIndex: start - 1,\n },\n },\n },\n ],\n },\n })\n .then(() => {\n this.log.debug('Rows successfully deleted from google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while deleting rows from Google Spreadsheet:${error}`);\n reject(\n new Error(\n `Error while deleting rows from Google Spreadsheet: ${error.message}`,\n ),\n );\n });\n } else {\n reject(new Error('Sheet not found'));\n }\n } else {\n reject(new Error('No sheets found in spreadsheet'));\n }\n })\n .catch(error => {\n this.log.error(`Error while deleting rows from Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting rows from Google Spreadsheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Create a new sheet in the Google Sheets\n *\n * @param title The title of the new sheet\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public createSheet(title: string, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: [\n {\n addSheet: {\n properties: {\n title: title,\n },\n },\n },\n ],\n },\n })\n .then(() => {\n this.log.debug('Sheet created successfully');\n resolve();\n })\n .catch(error => {\n reject(new Error(`Error while creating sheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Duplicate a sheet in the Google Spreadsheet\n *\n * @param source Name of the source sheet\n * @param target Name of the target sheet\n * @param index Position of the new sheet\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public duplicateSheet(\n source: string,\n target: string,\n index: number,\n sheetAlias: string | null = null,\n ): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .get({ spreadsheetId })\n .then(spreadsheet => {\n if (spreadsheet && spreadsheet.data.sheets) {\n const sheet = spreadsheet.data.sheets.find(\n sheet => sheet.properties && sheet.properties.title == source,\n );\n if (sheet && sheet.properties) {\n let insertIndex = index;\n if (insertIndex == -1 || insertIndex == undefined) {\n insertIndex = spreadsheet.data.sheets.length;\n }\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: [\n {\n duplicateSheet: {\n sourceSheetId: sheet.properties.sheetId,\n newSheetName: target,\n insertSheetIndex: insertIndex,\n },\n },\n ],\n },\n })\n .then(() => {\n this.log.debug('Data successfully sent to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while duplicating sheet: ${error.message}`));\n });\n } else {\n this.log.warn(`Cannot find sheet: ${source}`);\n reject(new Error(`Cannot find sheet: ${source}`));\n }\n } else {\n reject(new Error('No sheets found in spreadsheet'));\n }\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while duplicating sheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Upload a file to the Google Drive\n *\n * @param target Name of the target file\n * @param parentFolder Name of the parent folder\n * @param filecontent Data of the file\n */\n public upload(target: string, parentFolder: string, filecontent: any): Promise {\n const auth = new google.auth.GoogleAuth({\n credentials: {\n client_email: this.config.serviceAccountEmail,\n private_key: this.formatPrivateKey(this.config.privateKey),\n },\n scopes: ['https://www.googleapis.com/auth/spreadsheets'],\n });\n const driveapi = google.drive({ version: 'v3', auth });\n return new Promise((resolve, reject) => {\n driveapi.files\n .create({\n requestBody: {\n parents: [parentFolder],\n name: target,\n },\n media: {\n mimeType: 'application/octet-stream',\n body: filecontent,\n },\n fields: 'id',\n })\n .then(() => {\n this.log.debug('Data successfully uploaded to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while uploading data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while uploading data to Google Spreadsheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Delete a sheet from the Google Spreadsheet\n *\n * @param title The title of the sheet to delete\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public deleteSheet(title: string, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .get({ spreadsheetId })\n .then(spreadsheet => {\n if (spreadsheet && spreadsheet.data.sheets) {\n const sheet = spreadsheet.data.sheets.find(\n sheet => sheet.properties && sheet.properties.title == title,\n );\n if (sheet && sheet.properties) {\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: [\n {\n deleteSheet: {\n sheetId: sheet.properties.sheetId,\n },\n },\n ],\n },\n })\n .then(() => {\n this.log.debug('Data successfully sent to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting sheet: ${error.message}`));\n });\n } else {\n reject(new Error('Sheet not found'));\n }\n } else {\n reject(new Error('No sheets found in spreadsheet'));\n }\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting sheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Delete multiple sheets from the Google Spreadsheet\n *\n * @param titles The titles of the sheets to delete\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public deleteSheets(titles: string[], sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .get({ spreadsheetId })\n .then(spreadsheet => {\n if (spreadsheet && spreadsheet.data.sheets) {\n const requests: sheets_v4.Schema$Request[] = [];\n for (const title of titles) {\n const sheet = spreadsheet.data.sheets.find(\n sheet => sheet.properties && sheet.properties.title == title,\n );\n if (sheet && sheet.properties) {\n requests.push({\n deleteSheet: {\n sheetId: sheet.properties.sheetId,\n },\n });\n }\n }\n if (requests.length > 0) {\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: requests,\n },\n })\n .then(() => {\n this.log.debug('Sheets successfully deleted from google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while deleting sheets from Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting sheets: ${error.message}`));\n });\n } else {\n reject(new Error('No matching sheets found to delete'));\n }\n } else {\n reject(new Error('No sheets found in spreadsheet'));\n }\n })\n .catch(error => {\n this.log.error(`Error while deleting sheets from Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting sheets: ${error.message}`));\n });\n });\n }\n\n /**\n * Send data to a Google Spreadsheet\n *\n * @param sheetName Name of the sheet\n * @param data Data to send\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public append(sheetName: string, data: any, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n return new Promise((resolve, reject) => {\n sheets.spreadsheets.values\n .append({\n // The [A1 notation](/sheets/api/guides/concepts#cell) of a range to search for a logical table of data. Values are appended after the last row of the table.\n range: sheetName,\n spreadsheetId: this.getSpreadsheetId(sheetAlias),\n valueInputOption: 'USER_ENTERED',\n // Request body metadata\n requestBody: {\n values: this.prepareValues(data),\n },\n })\n .then(() => {\n this.log.debug('Data successfully sent to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while appending data: ${error.message}`));\n });\n });\n }\n\n /**\n * Get the spreadsheetId based on the alias or default\n *\n * @param sheetAlias Alias of the sheet to use (optional)\n * @returns The spreadsheetId\n */\n getSpreadsheetId(sheetAlias: string | null): string {\n if (sheetAlias) {\n const sheet = this.config.spreadsheets.find(s => s.alias === sheetAlias);\n if (sheet) {\n return sheet.spreadsheetId;\n }\n this.log.warn(`No spreadsheet found for alias ${sheetAlias}, using default spreadsheetId`);\n }\n const defaultSheet = this.config.spreadsheets.find(s => s.isDefault);\n if (defaultSheet) {\n return defaultSheet.spreadsheetId;\n }\n throw new Error('No default spreadsheetId found in configuration');\n }\n\n /**\n * Write data to a cell in a Google Spreadsheet\n *\n * @param sheet Name of the sheet\n * @param cell Cell to write to\n * @param value Value to write\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public writeCell(sheet: string, cell: string, value: any, sheetAlias: string | null = null): Promise {\n return this.writeCells([{ sheet, cell, value }], sheetAlias);\n }\n\n /**\n * Write multiple cells in a Google Spreadsheet\n *\n * @param cells Array of objects: { sheet, cell, value }\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public writeCells(\n cells: Array<{ sheet: string; cell: string; value: any }>,\n sheetAlias: string | null = null,\n ): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n this.log.info(`Writing cells to spreadsheetId: ${spreadsheetId}`);\n // Gruppiere nach sheetName, da batchUpdate mehrere Bereiche pro Sheet erlaubt\n const grouped: { [sheet: string]: Array<{ cell: string; data: any }> } = {};\n for (const cellObj of cells) {\n if (!grouped[cellObj.sheet]) {\n grouped[cellObj.sheet] = [];\n }\n grouped[cellObj.sheet].push({ cell: cellObj.cell, data: cellObj.value });\n }\n const data: Array<{ range: string; values: any[][] }> = [];\n for (const sheetName in grouped) {\n for (const entry of grouped[sheetName]) {\n let cell = entry.cell;\n if (cell.startsWith(\"'\") && cell.endsWith(\"'\")) {\n cell = cell.substring(1, cell.length - 1);\n }\n data.push({\n range: `${sheetName}!${cell}`,\n values: this.prepareValues(entry.data),\n });\n }\n }\n this.log.debug(`Prepared data for writing: ${JSON.stringify(data)}`);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets.values\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n valueInputOption: 'USER_ENTERED',\n data,\n },\n })\n .then(() => {\n this.log.debug('Cells successfully written to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while writing cells to Google Spreadsheet:${error}`);\n reject(new Error(`Error while writing cells: ${error.message}`));\n });\n });\n }\n\n /**\n * Read data from a cell in a Google Spreadsheet\n *\n * @param sheetName Name of the sheet\n * @param cell Cell to read from\n * @param sheetAlias Alias of the sheet to use (optional)\n * @returns The data from the cell\n */\n public async readCell(sheetName: string, cell: string, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n if (cell.startsWith(\"'\") && cell.endsWith(\"'\")) {\n cell = cell.substring(1, cell.length - 1);\n }\n sheets.spreadsheets.values\n .get({\n range: `${sheetName}!${cell}`,\n spreadsheetId,\n })\n .then(response => {\n this.log.debug('Data successfully retrieved from google spreadsheet');\n if (response.data.values && response.data.values.length > 0) {\n resolve(response.data.values[0][0]);\n } else {\n reject(new Error('No data found'));\n }\n })\n .catch(error => {\n this.log.error(`Error while retrieving data from Google Spreadsheet:${error}`);\n reject(new Error(`Error while retrieving data from Google Spreadsheet: ${error.message}`));\n });\n });\n }\n private prepareValues(message: any): any {\n if (Array.isArray(message)) {\n return [message];\n }\n return [[message]];\n }\n private formatPrivateKey(privateKey: string): string | undefined {\n //replace all \\n with line breaks\n if (privateKey) {\n return privateKey.replace(/\\\\n/g, '\\n');\n }\n return undefined;\n }\n}\n"], - "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wBAAuB;AAQhB,MAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOnB,YACK,QACA,KACV;AAFU;AACA;AAAA,EACT;AAAA,EAEK,OAAyB;AAC7B,UAAM,OAAO,IAAI,yBAAO,KAAK,WAAW;AAAA,MACpC,aAAa;AAAA,QACT,cAAc,KAAK,OAAO;AAAA,QAC1B,aAAa,KAAK,iBAAiB,KAAK,OAAO,UAAU;AAAA,MAC7D;AAAA,MACA,QAAQ,CAAC,8CAA8C;AAAA,IAC3D,CAAC;AACD,WAAO,yBAAO,OAAO,EAAE,SAAS,MAAM,KAAK,CAAC;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,WAAW,WAAmB,OAAe,KAAa,aAA4B,MAAqB;AAC9G,UAAM,SAAS,KAAK,KAAK;AACzB,UAAM,gBAAgB,KAAK,iBAAiB,UAAU;AACtD,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC1C,aAAO,aACF,IAAI,EAAE,cAAc,CAAC,EACrB,KAAK,iBAAe;AACjB,YAAI,eAAe,YAAY,KAAK,QAAQ;AACxC,gBAAM,QAAQ,YAAY,KAAK,OAAO;AAAA,YAClC,CAAAA,WAASA,OAAM,cAAcA,OAAM,WAAW,SAAS;AAAA,UAC3D;AACA,cAAI,SAAS,MAAM,YAAY;AAC3B,kBAAM,UAAU,MAAM,WAAW;AACjC,mBAAO,aACF,YAAY;AAAA,cACT;AAAA,cACA,aAAa;AAAA,gBACT,UAAU;AAAA,kBACN;AAAA,oBACI,iBAAiB;AAAA,sBACb,OAAO;AAAA,wBACH,WAAW;AAAA,wBACX,UAAU;AAAA,wBACV;AAAA,wBACA,YAAY,QAAQ;AAAA,sBACxB;AAAA,oBACJ;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ,CAAC,EACA,KAAK,MAAM;AACR,mBAAK,IAAI,MAAM,mDAAmD;AAClE,sBAAQ;AAAA,YACZ,CAAC,EACA,MAAM,WAAS;AACZ,mBAAK,IAAI,MAAM,qDAAqD,KAAK,EAAE;AAC3E;AAAA,gBACI,IAAI;AAAA,kBACA,sDAAsD,MAAM,OAAO;AAAA,gBACvE;AAAA,cACJ;AAAA,YACJ,CAAC;AAAA,UACT,OAAO;AACH,mBAAO,IAAI,MAAM,iBAAiB,CAAC;AAAA,UACvC;AAAA,QACJ,OAAO;AACH,iBAAO,IAAI,MAAM,gCAAgC,CAAC;AAAA,QACtD;AAAA,MACJ,CAAC,EACA,MAAM,WAAS;AACZ,aAAK,IAAI,MAAM,qDAAqD,KAAK,EAAE;AAC3E,eAAO,IAAI,MAAM,sDAAsD,MAAM,OAAO,EAAE,CAAC;AAAA,MAC3F,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,YAAY,OAAe,aAA4B,MAAqB;AAC/E,UAAM,SAAS,KAAK,KAAK;AACzB,UAAM,gBAAgB,KAAK,iBAAiB,UAAU;AACtD,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC1C,aAAO,aACF,YAAY;AAAA,QACT;AAAA,QACA,aAAa;AAAA,UACT,UAAU;AAAA,YACN;AAAA,cACI,UAAU;AAAA,gBACN,YAAY;AAAA,kBACR;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ,CAAC,EACA,KAAK,MAAM;AACR,aAAK,IAAI,MAAM,4BAA4B;AAC3C,gBAAQ;AAAA,MACZ,CAAC,EACA,MAAM,WAAS;AACZ,eAAO,IAAI,MAAM,+BAA+B,MAAM,OAAO,EAAE,CAAC;AAAA,MACpE,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,eACH,QACA,QACA,OACA,aAA4B,MACf;AACb,UAAM,SAAS,KAAK,KAAK;AACzB,UAAM,gBAAgB,KAAK,iBAAiB,UAAU;AACtD,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC1C,aAAO,aACF,IAAI,EAAE,cAAc,CAAC,EACrB,KAAK,iBAAe;AACjB,YAAI,eAAe,YAAY,KAAK,QAAQ;AACxC,gBAAM,QAAQ,YAAY,KAAK,OAAO;AAAA,YAClC,CAAAA,WAASA,OAAM,cAAcA,OAAM,WAAW,SAAS;AAAA,UAC3D;AACA,cAAI,SAAS,MAAM,YAAY;AAC3B,gBAAI,cAAc;AAClB,gBAAI,eAAe,MAAM,eAAe,QAAW;AAC/C,4BAAc,YAAY,KAAK,OAAO;AAAA,YAC1C;AACA,mBAAO,aACF,YAAY;AAAA,cACT;AAAA,cACA,aAAa;AAAA,gBACT,UAAU;AAAA,kBACN;AAAA,oBACI,gBAAgB;AAAA,sBACZ,eAAe,MAAM,WAAW;AAAA,sBAChC,cAAc;AAAA,sBACd,kBAAkB;AAAA,oBACtB;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ,CAAC,EACA,KAAK,MAAM;AACR,mBAAK,IAAI,MAAM,8CAA8C;AAC7D,sBAAQ;AAAA,YACZ,CAAC,EACA,MAAM,WAAS;AACZ,mBAAK,IAAI,MAAM,kDAAkD,KAAK,EAAE;AACxE,qBAAO,IAAI,MAAM,kCAAkC,MAAM,OAAO,EAAE,CAAC;AAAA,YACvE,CAAC;AAAA,UACT,OAAO;AACH,iBAAK,IAAI,KAAK,sBAAsB,MAAM,EAAE;AAC5C,mBAAO,IAAI,MAAM,sBAAsB,MAAM,EAAE,CAAC;AAAA,UACpD;AAAA,QACJ,OAAO;AACH,iBAAO,IAAI,MAAM,gCAAgC,CAAC;AAAA,QACtD;AAAA,MACJ,CAAC,EACA,MAAM,WAAS;AACZ,aAAK,IAAI,MAAM,kDAAkD,KAAK,EAAE;AACxE,eAAO,IAAI,MAAM,kCAAkC,MAAM,OAAO,EAAE,CAAC;AAAA,MACvE,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,OAAO,QAAgB,cAAsB,aAAiC;AACjF,UAAM,OAAO,IAAI,yBAAO,KAAK,WAAW;AAAA,MACpC,aAAa;AAAA,QACT,cAAc,KAAK,OAAO;AAAA,QAC1B,aAAa,KAAK,iBAAiB,KAAK,OAAO,UAAU;AAAA,MAC7D;AAAA,MACA,QAAQ,CAAC,8CAA8C;AAAA,IAC3D,CAAC;AACD,UAAM,WAAW,yBAAO,MAAM,EAAE,SAAS,MAAM,KAAK,CAAC;AACrD,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC1C,eAAS,MACJ,OAAO;AAAA,QACJ,aAAa;AAAA,UACT,SAAS,CAAC,YAAY;AAAA,UACtB,MAAM;AAAA,QACV;AAAA,QACA,OAAO;AAAA,UACH,UAAU;AAAA,UACV,MAAM;AAAA,QACV;AAAA,QACA,QAAQ;AAAA,MACZ,CAAC,EACA,KAAK,MAAM;AACR,aAAK,IAAI,MAAM,kDAAkD;AACjE,gBAAQ;AAAA,MACZ,CAAC,EACA,MAAM,WAAS;AACZ,aAAK,IAAI,MAAM,oDAAoD,KAAK,EAAE;AAC1E,eAAO,IAAI,MAAM,qDAAqD,MAAM,OAAO,EAAE,CAAC;AAAA,MAC1F,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,YAAY,OAAe,aAA4B,MAAqB;AAC/E,UAAM,SAAS,KAAK,KAAK;AACzB,UAAM,gBAAgB,KAAK,iBAAiB,UAAU;AACtD,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC1C,aAAO,aACF,IAAI,EAAE,cAAc,CAAC,EACrB,KAAK,iBAAe;AACjB,YAAI,eAAe,YAAY,KAAK,QAAQ;AACxC,gBAAM,QAAQ,YAAY,KAAK,OAAO;AAAA,YAClC,CAAAA,WAASA,OAAM,cAAcA,OAAM,WAAW,SAAS;AAAA,UAC3D;AACA,cAAI,SAAS,MAAM,YAAY;AAC3B,mBAAO,aACF,YAAY;AAAA,cACT;AAAA,cACA,aAAa;AAAA,gBACT,UAAU;AAAA,kBACN;AAAA,oBACI,aAAa;AAAA,sBACT,SAAS,MAAM,WAAW;AAAA,oBAC9B;AAAA,kBACJ;AAAA,gBACJ;AAAA,cACJ;AAAA,YACJ,CAAC,EACA,KAAK,MAAM;AACR,mBAAK,IAAI,MAAM,8CAA8C;AAC7D,sBAAQ;AAAA,YACZ,CAAC,EACA,MAAM,WAAS;AACZ,mBAAK,IAAI,MAAM,kDAAkD,KAAK,EAAE;AACxE,qBAAO,IAAI,MAAM,+BAA+B,MAAM,OAAO,EAAE,CAAC;AAAA,YACpE,CAAC;AAAA,UACT,OAAO;AACH,mBAAO,IAAI,MAAM,iBAAiB,CAAC;AAAA,UACvC;AAAA,QACJ,OAAO;AACH,iBAAO,IAAI,MAAM,gCAAgC,CAAC;AAAA,QACtD;AAAA,MACJ,CAAC,EACA,MAAM,WAAS;AACZ,aAAK,IAAI,MAAM,kDAAkD,KAAK,EAAE;AACxE,eAAO,IAAI,MAAM,+BAA+B,MAAM,OAAO,EAAE,CAAC;AAAA,MACpE,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,aAAa,QAAkB,aAA4B,MAAqB;AACnF,UAAM,SAAS,KAAK,KAAK;AACzB,UAAM,gBAAgB,KAAK,iBAAiB,UAAU;AACtD,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC1C,aAAO,aACF,IAAI,EAAE,cAAc,CAAC,EACrB,KAAK,iBAAe;AACjB,YAAI,eAAe,YAAY,KAAK,QAAQ;AACxC,gBAAM,WAAuC,CAAC;AAC9C,qBAAW,SAAS,QAAQ;AACxB,kBAAM,QAAQ,YAAY,KAAK,OAAO;AAAA,cAClC,CAAAA,WAASA,OAAM,cAAcA,OAAM,WAAW,SAAS;AAAA,YAC3D;AACA,gBAAI,SAAS,MAAM,YAAY;AAC3B,uBAAS,KAAK;AAAA,gBACV,aAAa;AAAA,kBACT,SAAS,MAAM,WAAW;AAAA,gBAC9B;AAAA,cACJ,CAAC;AAAA,YACL;AAAA,UACJ;AACA,cAAI,SAAS,SAAS,GAAG;AACrB,mBAAO,aACF,YAAY;AAAA,cACT;AAAA,cACA,aAAa;AAAA,gBACT;AAAA,cACJ;AAAA,YACJ,CAAC,EACA,KAAK,MAAM;AACR,mBAAK,IAAI,MAAM,qDAAqD;AACpE,sBAAQ;AAAA,YACZ,CAAC,EACA,MAAM,WAAS;AACZ,mBAAK,IAAI,MAAM,uDAAuD,KAAK,EAAE;AAC7E,qBAAO,IAAI,MAAM,gCAAgC,MAAM,OAAO,EAAE,CAAC;AAAA,YACrE,CAAC;AAAA,UACT,OAAO;AACH,mBAAO,IAAI,MAAM,oCAAoC,CAAC;AAAA,UAC1D;AAAA,QACJ,OAAO;AACH,iBAAO,IAAI,MAAM,gCAAgC,CAAC;AAAA,QACtD;AAAA,MACJ,CAAC,EACA,MAAM,WAAS;AACZ,aAAK,IAAI,MAAM,uDAAuD,KAAK,EAAE;AAC7E,eAAO,IAAI,MAAM,gCAAgC,MAAM,OAAO,EAAE,CAAC;AAAA,MACrE,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,OAAO,WAAmB,MAAW,aAA4B,MAAqB;AACzF,UAAM,SAAS,KAAK,KAAK;AACzB,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC1C,aAAO,aAAa,OACf,OAAO;AAAA;AAAA,QAEJ,OAAO;AAAA,QACP,eAAe,KAAK,iBAAiB,UAAU;AAAA,QAC/C,kBAAkB;AAAA;AAAA,QAElB,aAAa;AAAA,UACT,QAAQ,KAAK,cAAc,IAAI;AAAA,QACnC;AAAA,MACJ,CAAC,EACA,KAAK,MAAM;AACR,aAAK,IAAI,MAAM,8CAA8C;AAC7D,gBAAQ;AAAA,MACZ,CAAC,EACA,MAAM,WAAS;AACZ,aAAK,IAAI,MAAM,kDAAkD,KAAK,EAAE;AACxE,eAAO,IAAI,MAAM,+BAA+B,MAAM,OAAO,EAAE,CAAC;AAAA,MACpE,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,iBAAiB,YAAmC;AAChD,QAAI,YAAY;AACZ,YAAM,QAAQ,KAAK,OAAO,aAAa,KAAK,OAAK,EAAE,UAAU,UAAU;AACvE,UAAI,OAAO;AACP,eAAO,MAAM;AAAA,MACjB;AACA,WAAK,IAAI,KAAK,kCAAkC,UAAU,+BAA+B;AAAA,IAC7F;AACA,UAAM,eAAe,KAAK,OAAO,aAAa,KAAK,OAAK,EAAE,SAAS;AACnE,QAAI,cAAc;AACd,aAAO,aAAa;AAAA,IACxB;AACA,UAAM,IAAI,MAAM,iDAAiD;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUO,UAAU,OAAe,MAAc,OAAY,aAA4B,MAAqB;AACvG,WAAO,KAAK,WAAW,CAAC,EAAE,OAAO,MAAM,MAAM,CAAC,GAAG,UAAU;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,WACH,OACA,aAA4B,MACf;AACb,UAAM,SAAS,KAAK,KAAK;AACzB,UAAM,gBAAgB,KAAK,iBAAiB,UAAU;AACtD,SAAK,IAAI,KAAK,mCAAmC,aAAa,EAAE;AAEhE,UAAM,UAAmE,CAAC;AAC1E,eAAW,WAAW,OAAO;AACzB,UAAI,CAAC,QAAQ,QAAQ,KAAK,GAAG;AACzB,gBAAQ,QAAQ,KAAK,IAAI,CAAC;AAAA,MAC9B;AACA,cAAQ,QAAQ,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,QAAQ,MAAM,CAAC;AAAA,IAC3E;AACA,UAAM,OAAkD,CAAC;AACzD,eAAW,aAAa,SAAS;AAC7B,iBAAW,SAAS,QAAQ,SAAS,GAAG;AACpC,YAAI,OAAO,MAAM;AACjB,YAAI,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAAG;AAC5C,iBAAO,KAAK,UAAU,GAAG,KAAK,SAAS,CAAC;AAAA,QAC5C;AACA,aAAK,KAAK;AAAA,UACN,OAAO,GAAG,SAAS,IAAI,IAAI;AAAA,UAC3B,QAAQ,KAAK,cAAc,MAAM,IAAI;AAAA,QACzC,CAAC;AAAA,MACL;AAAA,IACJ;AACA,SAAK,IAAI,MAAM,8BAA8B,KAAK,UAAU,IAAI,CAAC,EAAE;AACnE,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC1C,aAAO,aAAa,OACf,YAAY;AAAA,QACT;AAAA,QACA,aAAa;AAAA,UACT,kBAAkB;AAAA,UAClB;AAAA,QACJ;AAAA,MACJ,CAAC,EACA,KAAK,MAAM;AACR,aAAK,IAAI,MAAM,kDAAkD;AACjE,gBAAQ;AAAA,MACZ,CAAC,EACA,MAAM,WAAS;AACZ,aAAK,IAAI,MAAM,mDAAmD,KAAK,EAAE;AACzE,eAAO,IAAI,MAAM,8BAA8B,MAAM,OAAO,EAAE,CAAC;AAAA,MACnE,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAa,SAAS,WAAmB,MAAc,aAA4B,MAAoB;AACnG,UAAM,SAAS,KAAK,KAAK;AACzB,UAAM,gBAAgB,KAAK,iBAAiB,UAAU;AACtD,WAAO,IAAI,QAAa,CAAC,SAAS,WAAW;AACzC,UAAI,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAAG;AAC5C,eAAO,KAAK,UAAU,GAAG,KAAK,SAAS,CAAC;AAAA,MAC5C;AACA,aAAO,aAAa,OACf,IAAI;AAAA,QACD,OAAO,GAAG,SAAS,IAAI,IAAI;AAAA,QAC3B;AAAA,MACJ,CAAC,EACA,KAAK,cAAY;AACd,aAAK,IAAI,MAAM,qDAAqD;AACpE,YAAI,SAAS,KAAK,UAAU,SAAS,KAAK,OAAO,SAAS,GAAG;AACzD,kBAAQ,SAAS,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;AAAA,QACtC,OAAO;AACH,iBAAO,IAAI,MAAM,eAAe,CAAC;AAAA,QACrC;AAAA,MACJ,CAAC,EACA,MAAM,WAAS;AACZ,aAAK,IAAI,MAAM,uDAAuD,KAAK,EAAE;AAC7E,eAAO,IAAI,MAAM,wDAAwD,MAAM,OAAO,EAAE,CAAC;AAAA,MAC7F,CAAC;AAAA,IACT,CAAC;AAAA,EACL;AAAA,EACQ,cAAc,SAAmB;AACrC,QAAI,MAAM,QAAQ,OAAO,GAAG;AACxB,aAAO,CAAC,OAAO;AAAA,IACnB;AACA,WAAO,CAAC,CAAC,OAAO,CAAC;AAAA,EACrB;AAAA,EACQ,iBAAiB,YAAwC;AAE7D,QAAI,YAAY;AACZ,aAAO,WAAW,QAAQ,QAAQ,IAAI;AAAA,IAC1C;AACA,WAAO;AAAA,EACX;AACJ;", + "sourcesContent": ["import { google } from 'googleapis';\nimport type { sheets_v4 } from 'googleapis/build/src/apis/sheets/v4';\n/**\n * This class provides utility functions to interact with Google Sheets\n *\n * @param config The adapter configuration\n * @param log The logger\n */\nexport class SpreadsheetUtils {\n /**\n * Constructor\n *\n * @param config The adapter configuration\n * @param log The logger\n */\n public constructor(\n private config: ioBroker.AdapterConfig,\n private log: ioBroker.Log,\n ) {}\n\n private init(): sheets_v4.Sheets {\n const auth = new google.auth.GoogleAuth({\n credentials: {\n client_email: this.config.serviceAccountEmail,\n private_key: this.formatPrivateKey(this.config.privateKey),\n },\n scopes: ['https://www.googleapis.com/auth/spreadsheets'],\n });\n return google.sheets({ version: 'v4', auth });\n }\n\n /**\n * Delete rows from a Google Spreadsheet\n *\n * @param sheetName Name of the sheet\n * @param start First row to delete\n * @param end Last row to delete\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public deleteRows(sheetName: string, start: number, end: number, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .get({ spreadsheetId })\n .then(spreadsheet => {\n if (spreadsheet && spreadsheet.data.sheets) {\n const sheet = spreadsheet.data.sheets.find(\n sheet => sheet.properties && sheet.properties.title == sheetName,\n );\n if (sheet && sheet.properties) {\n const sheetId = sheet.properties.sheetId;\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: [\n {\n deleteDimension: {\n range: {\n dimension: 'ROWS',\n endIndex: end,\n sheetId: sheetId,\n startIndex: start - 1,\n },\n },\n },\n ],\n },\n })\n .then(() => {\n this.log.debug('Rows successfully deleted from google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while deleting rows from Google Spreadsheet:${error}`);\n reject(\n new Error(\n `Error while deleting rows from Google Spreadsheet: ${error.message}`,\n ),\n );\n });\n } else {\n reject(new Error('Sheet not found'));\n }\n } else {\n reject(new Error('No sheets found in spreadsheet'));\n }\n })\n .catch(error => {\n this.log.error(`Error while deleting rows from Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting rows from Google Spreadsheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Create a new sheet in the Google Sheets\n *\n * @param title The title of the new sheet\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public createSheet(title: string, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: [\n {\n addSheet: {\n properties: {\n title: title,\n },\n },\n },\n ],\n },\n })\n .then(() => {\n this.log.debug('Sheet created successfully');\n resolve();\n })\n .catch(error => {\n reject(new Error(`Error while creating sheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Duplicate a sheet in the Google Spreadsheet\n *\n * @param source Name of the source sheet\n * @param target Name of the target sheet\n * @param index Position of the new sheet\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public duplicateSheet(\n source: string,\n target: string,\n index: number,\n sheetAlias: string | null = null,\n ): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .get({ spreadsheetId })\n .then(spreadsheet => {\n if (spreadsheet && spreadsheet.data.sheets) {\n const sheet = spreadsheet.data.sheets.find(\n sheet => sheet.properties && sheet.properties.title == source,\n );\n if (sheet && sheet.properties) {\n let insertIndex = index;\n if (insertIndex == -1 || insertIndex == undefined) {\n insertIndex = spreadsheet.data.sheets.length;\n }\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: [\n {\n duplicateSheet: {\n sourceSheetId: sheet.properties.sheetId,\n newSheetName: target,\n insertSheetIndex: insertIndex,\n },\n },\n ],\n },\n })\n .then(() => {\n this.log.debug('Data successfully sent to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while duplicating sheet: ${error.message}`));\n });\n } else {\n this.log.warn(`Cannot find sheet: ${source}`);\n reject(new Error(`Cannot find sheet: ${source}`));\n }\n } else {\n reject(new Error('No sheets found in spreadsheet'));\n }\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while duplicating sheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Upload a file to the Google Drive\n *\n * @param target Name of the target file\n * @param parentFolder Name of the parent folder\n * @param filecontent Data of the file\n */\n public upload(target: string, parentFolder: string, filecontent: any): Promise {\n const auth = new google.auth.GoogleAuth({\n credentials: {\n client_email: this.config.serviceAccountEmail,\n private_key: this.formatPrivateKey(this.config.privateKey),\n },\n scopes: ['https://www.googleapis.com/auth/spreadsheets'],\n });\n const driveapi = google.drive({ version: 'v3', auth });\n return new Promise((resolve, reject) => {\n driveapi.files\n .create({\n requestBody: {\n parents: [parentFolder],\n name: target,\n },\n media: {\n mimeType: 'application/octet-stream',\n body: filecontent,\n },\n fields: 'id',\n })\n .then(() => {\n this.log.debug('Data successfully uploaded to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while uploading data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while uploading data to Google Spreadsheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Delete a sheet from the Google Spreadsheet\n *\n * @param title The title of the sheet to delete\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public deleteSheet(title: string, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .get({ spreadsheetId })\n .then(spreadsheet => {\n if (spreadsheet && spreadsheet.data.sheets) {\n const sheet = spreadsheet.data.sheets.find(\n sheet => sheet.properties && sheet.properties.title == title,\n );\n if (sheet && sheet.properties) {\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: [\n {\n deleteSheet: {\n sheetId: sheet.properties.sheetId,\n },\n },\n ],\n },\n })\n .then(() => {\n this.log.debug('Data successfully sent to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting sheet: ${error.message}`));\n });\n } else {\n reject(new Error('Sheet not found'));\n }\n } else {\n reject(new Error('No sheets found in spreadsheet'));\n }\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting sheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Delete multiple sheets from the Google Spreadsheet\n *\n * @param titles The titles of the sheets to delete\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public deleteSheets(titles: string[], sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .get({ spreadsheetId })\n .then(spreadsheet => {\n if (spreadsheet && spreadsheet.data.sheets) {\n const requests: sheets_v4.Schema$Request[] = [];\n for (const title of titles) {\n const sheet = spreadsheet.data.sheets.find(\n sheet => sheet.properties && sheet.properties.title == title,\n );\n if (sheet && sheet.properties) {\n requests.push({\n deleteSheet: {\n sheetId: sheet.properties.sheetId,\n },\n });\n }\n }\n if (requests.length > 0) {\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: requests,\n },\n })\n .then(() => {\n this.log.debug('Sheets successfully deleted from google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while deleting sheets from Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting sheets: ${error.message}`));\n });\n } else {\n reject(new Error('No matching sheets found to delete'));\n }\n } else {\n reject(new Error('No sheets found in spreadsheet'));\n }\n })\n .catch(error => {\n this.log.error(`Error while deleting sheets from Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting sheets: ${error.message}`));\n });\n });\n }\n\n /**\n * Send data to a Google Spreadsheet\n *\n * @param sheetName Name of the sheet\n * @param data Data to send\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public append(sheetName: string, data: any, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n return new Promise((resolve, reject) => {\n sheets.spreadsheets.values\n .append({\n // The [A1 notation](/sheets/api/guides/concepts#cell) of a range to search for a logical table of data. Values are appended after the last row of the table.\n range: sheetName,\n spreadsheetId: this.getSpreadsheetId(sheetAlias),\n valueInputOption: 'USER_ENTERED',\n // Request body metadata\n requestBody: {\n values: this.prepareValues(data),\n },\n })\n .then(() => {\n this.log.debug('Data successfully sent to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while appending data: ${error.message}`));\n });\n });\n }\n\n /**\n * Get the spreadsheetId based on the alias or default\n *\n * @param sheetAlias Alias of the sheet to use (optional)\n * @returns The spreadsheetId\n */\n getSpreadsheetId(sheetAlias: string | null): string {\n if (sheetAlias) {\n const sheet = this.config.spreadsheets.find(s => s.alias === sheetAlias);\n if (sheet) {\n return sheet.spreadsheetId;\n }\n this.log.warn(`No spreadsheet found for alias ${sheetAlias}, using default spreadsheetId`);\n }\n const defaultSheet = this.config.spreadsheets.find(s => s.isDefault);\n if (defaultSheet) {\n return defaultSheet.spreadsheetId;\n }\n throw new Error('No default spreadsheetId found in configuration');\n }\n\n /**\n * Write data to a cell in a Google Spreadsheet\n *\n * @param sheet Name of the sheet\n * @param cell Cell to write to\n * @param value Value to write\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public writeCell(sheet: string, cell: string, value: any, sheetAlias: string | null = null): Promise {\n return this.writeCells([{ sheet, cell, value }], sheetAlias);\n }\n\n /**\n * Write multiple cells in a Google Spreadsheet\n *\n * @param cells Array of objects: { sheet, cell, value }\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public writeCells(\n cells: Array<{ sheet: string; cell: string; value: any }>,\n sheetAlias: string | null = null,\n ): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n this.log.info(`Writing cells to spreadsheetId: ${spreadsheetId}`);\n // Gruppiere nach sheetName, da batchUpdate mehrere Bereiche pro Sheet erlaubt\n const grouped: { [sheet: string]: Array<{ cell: string; data: any }> } = {};\n for (const cellObj of cells) {\n if (!grouped[cellObj.sheet]) {\n grouped[cellObj.sheet] = [];\n }\n grouped[cellObj.sheet].push({ cell: cellObj.cell, data: cellObj.value });\n }\n const data: Array<{ range: string; values: any[][] }> = [];\n for (const sheetName in grouped) {\n for (const entry of grouped[sheetName]) {\n let cell = entry.cell;\n if (cell.startsWith(\"'\") && cell.endsWith(\"'\")) {\n cell = cell.substring(1, cell.length - 1);\n }\n data.push({\n range: `${sheetName}!${cell}`,\n values: this.prepareValues(entry.data),\n });\n }\n }\n this.log.debug(`Prepared data for writing: ${JSON.stringify(data)}`);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets.values\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n valueInputOption: 'USER_ENTERED',\n data,\n },\n })\n .then(() => {\n this.log.debug('Cells successfully written to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while writing cells to Google Spreadsheet:${error}`);\n reject(new Error(`Error while writing cells: ${error.message}`));\n });\n });\n }\n\n /**\n * Read data from a cell in a Google Spreadsheet\n *\n * @param sheetName Name of the sheet\n * @param cell Cell to read from\n * @param sheetAlias Alias of the sheet to use (optional)\n * @returns The data from the cell\n */\n public async readCell(sheetName: string, cell: string, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n if (cell.startsWith(\"'\") && cell.endsWith(\"'\")) {\n cell = cell.substring(1, cell.length - 1);\n }\n sheets.spreadsheets.values\n .get({\n range: `${sheetName}!${cell}`,\n spreadsheetId,\n })\n .then(response => {\n this.log.debug('Data successfully retrieved from google spreadsheet');\n if (response.data.values && response.data.values.length > 0) {\n resolve(response.data.values[0][0]);\n } else {\n reject(new Error('No data found'));\n }\n })\n .catch(error => {\n this.log.error(`Error while retrieving data from Google Spreadsheet:${error}`);\n reject(new Error(`Error while retrieving data from Google Spreadsheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Read data from a range of cells in a Google Spreadsheet\n *\n * @param sheetName Name of the sheet\n * @param range A1 notation range to read (e.g. \"A1:A7\")\n * @param sheetAlias Alias of the sheet to use (optional)\n * @returns The data from the range as 2D array\n */\n public async readCells(sheetName: string, range: string, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n if (range.startsWith(\"'\") && range.endsWith(\"'\")) {\n range = range.substring(1, range.length - 1);\n }\n sheets.spreadsheets.values\n .get({\n range: `${sheetName}!${range}`,\n spreadsheetId,\n })\n .then(response => {\n this.log.debug('Data successfully retrieved from google spreadsheet');\n if (response.data.values && response.data.values.length > 0) {\n resolve(response.data.values);\n } else {\n resolve([]);\n }\n })\n .catch(error => {\n this.log.error(`Error while retrieving data from Google Spreadsheet:${error}`);\n reject(new Error(`Error while retrieving data from Google Spreadsheet: ${error.message}`));\n });\n });\n }\n private prepareValues(message: any): any {\n if (Array.isArray(message)) {\n return [message];\n }\n return [[message]];\n }\n private formatPrivateKey(privateKey: string): string | undefined {\n //replace all \\n with line breaks\n if (privateKey) {\n return privateKey.replace(/\\\\n/g, '\\n');\n }\n return undefined;\n }\n}\n"], + "mappings": "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", "names": ["sheet"] } diff --git a/build/lib/messageHandlers/cellHandlers.js b/build/lib/messageHandlers/cellHandlers.js index 70331f9..edb0c4f 100644 --- a/build/lib/messageHandlers/cellHandlers.js +++ b/build/lib/messageHandlers/cellHandlers.js @@ -19,10 +19,31 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru var cellHandlers_exports = {}; __export(cellHandlers_exports, { handleReadCell: () => handleReadCell, + handleReadCells: () => handleReadCells, handleWriteCell: () => handleWriteCell, handleWriteCells: () => handleWriteCells }); module.exports = __toCommonJS(cellHandlers_exports); +function handleReadCells(spreadsheet, log, message) { + const messageData = message.message; + let sheet = messageData.sheet; + const range = messageData.range; + const alias = messageData.alias; + if (!sheet && messageData.sheetName) { + log.warn("Parameter 'sheetName' is deprecated, please use 'sheet' instead!"); + sheet = messageData.sheetName; + } + if (!sheet || !range) { + log.error("Missing parameters for readCells: 'sheet', 'range'"); + return Promise.reject(new Error("Missing parameters for readCells")); + } + const rangePattern = new RegExp("^[A-Z]+[0-9]+:[A-Z]+[0-9]+$"); + if (!rangePattern.test(range)) { + log.error(`Invalid range pattern ${range}. Expected: A1:A7`); + return Promise.reject(new Error(`Invalid range pattern ${range}. Expected: A1:A7`)); + } + return spreadsheet.readCells(sheet, range, alias); +} function handleWriteCell(spreadsheet, log, message) { const messageData = message.message; let sheet = messageData.sheet; @@ -100,6 +121,7 @@ function handleReadCell(spreadsheet, log, message) { // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { handleReadCell, + handleReadCells, handleWriteCell, handleWriteCells }); diff --git a/build/lib/messageHandlers/cellHandlers.js.map b/build/lib/messageHandlers/cellHandlers.js.map index aac9102..c7be2ab 100644 --- a/build/lib/messageHandlers/cellHandlers.js.map +++ b/build/lib/messageHandlers/cellHandlers.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../src/lib/messageHandlers/cellHandlers.ts"], - "sourcesContent": ["import type { SpreadsheetUtils } from '../google';\n\n/**\n * Handles writing to a single cell of a spreadsheet sheet.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleWriteCell(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n let sheet = messageData.sheet;\n const cell = messageData.cell;\n let value = messageData.value;\n const alias = messageData.alias;\n if (!sheet && messageData.sheetName) {\n log.warn(\"Parameter 'sheetName' is deprecated, please use 'sheet' instead!\");\n sheet = messageData.sheetName;\n }\n if (!value && messageData.data) {\n log.warn(\"Parameter 'data' is deprecated, please use 'value' instead!\");\n value = messageData.data;\n }\n if (!sheet || !cell || typeof value === 'undefined') {\n log.error(\"Missing parameters for writeCell: 'sheet', 'cell', 'value'\");\n return Promise.reject(new Error('Missing parameters for writeCell'));\n }\n const cellPattern = new RegExp('^[A-Z]+[0-9]+$');\n if (!cellPattern.test(cell)) {\n log.error(`Invalid cell pattern ${cell}. Expected: A1`);\n return Promise.reject(new Error(`Invalid cell pattern ${cell}. Expected: A1`));\n }\n return spreadsheet.writeCell(sheet, cell, value, alias);\n}\n\n/**\n * Handles writing to multiple cells of one or more spreadsheet sheets.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleWriteCells(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n const cells = messageData.cells;\n const alias = messageData.alias;\n if (!cells) {\n log.error(\"Missing parameter for writeCells: 'cells'\");\n return Promise.reject(new Error('Missing parameters for writeCells'));\n }\n const cellPattern = new RegExp('^[A-Z]+[0-9]+$');\n for (const cellObj of cells) {\n if (!cellObj.sheet && cellObj.sheetName) {\n log.warn(\"Parameter 'sheetName' in cells is deprecated, please use 'sheet' instead!\");\n cellObj.sheet = cellObj.sheetName;\n }\n if (!cellObj.value && typeof cellObj.data !== 'undefined') {\n log.warn(\"Parameter 'data' in cells is deprecated, please use 'value' instead!\");\n cellObj.value = cellObj.data;\n }\n if (!cellObj.sheet || !cellObj.cell || typeof cellObj.value === 'undefined') {\n log.error(\"Missing parameters for writeCells: 'sheet', 'cell', 'value' in cells\");\n return Promise.reject(new Error('Missing parameters for writeCells'));\n }\n if (!cellPattern.test(cellObj.cell)) {\n log.error(`Invalid cell pattern ${cellObj.cell}. Expected: A1`);\n return Promise.reject(new Error(`Invalid cell pattern ${cellObj.cell}. Expected: A1`));\n }\n }\n return spreadsheet.writeCells(cells, alias);\n}\n\n/**\n * Handles reading a single cell of a spreadsheet sheet.\n * Returns the value of the cell.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleReadCell(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n let sheet = messageData.sheet;\n const cell = messageData.cell;\n const alias = messageData.alias;\n if (!sheet && messageData.sheetName) {\n log.warn(\"Parameter 'sheetName' is deprecated, please use 'sheet' instead!\");\n sheet = messageData.sheetName;\n }\n if (!sheet || !cell) {\n log.error(\"Missing parameters for readCell: 'sheet', 'cell'\");\n return Promise.reject(new Error('Missing parameters for readCell'));\n }\n const cellPattern = new RegExp('^[A-Z]+[0-9]+$');\n if (!cellPattern.test(cell)) {\n log.error(`Invalid cell pattern ${cell}. Expected: A1`);\n return Promise.reject(new Error(`Invalid cell pattern ${cell}. Expected: A1`));\n }\n return spreadsheet.readCell(sheet, cell, alias);\n}\n"], - "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASO,SAAS,gBACZ,aACA,KACA,SACa;AACb,QAAM,cAAmC,QAAQ;AACjD,MAAI,QAAQ,YAAY;AACxB,QAAM,OAAO,YAAY;AACzB,MAAI,QAAQ,YAAY;AACxB,QAAM,QAAQ,YAAY;AAC1B,MAAI,CAAC,SAAS,YAAY,WAAW;AACjC,QAAI,KAAK,kEAAkE;AAC3E,YAAQ,YAAY;AAAA,EACxB;AACA,MAAI,CAAC,SAAS,YAAY,MAAM;AAC5B,QAAI,KAAK,6DAA6D;AACtE,YAAQ,YAAY;AAAA,EACxB;AACA,MAAI,CAAC,SAAS,CAAC,QAAQ,OAAO,UAAU,aAAa;AACjD,QAAI,MAAM,4DAA4D;AACtE,WAAO,QAAQ,OAAO,IAAI,MAAM,kCAAkC,CAAC;AAAA,EACvE;AACA,QAAM,cAAc,IAAI,OAAO,gBAAgB;AAC/C,MAAI,CAAC,YAAY,KAAK,IAAI,GAAG;AACzB,QAAI,MAAM,wBAAwB,IAAI,gBAAgB;AACtD,WAAO,QAAQ,OAAO,IAAI,MAAM,wBAAwB,IAAI,gBAAgB,CAAC;AAAA,EACjF;AACA,SAAO,YAAY,UAAU,OAAO,MAAM,OAAO,KAAK;AAC1D;AASO,SAAS,iBACZ,aACA,KACA,SACa;AACb,QAAM,cAAmC,QAAQ;AACjD,QAAM,QAAQ,YAAY;AAC1B,QAAM,QAAQ,YAAY;AAC1B,MAAI,CAAC,OAAO;AACR,QAAI,MAAM,2CAA2C;AACrD,WAAO,QAAQ,OAAO,IAAI,MAAM,mCAAmC,CAAC;AAAA,EACxE;AACA,QAAM,cAAc,IAAI,OAAO,gBAAgB;AAC/C,aAAW,WAAW,OAAO;AACzB,QAAI,CAAC,QAAQ,SAAS,QAAQ,WAAW;AACrC,UAAI,KAAK,2EAA2E;AACpF,cAAQ,QAAQ,QAAQ;AAAA,IAC5B;AACA,QAAI,CAAC,QAAQ,SAAS,OAAO,QAAQ,SAAS,aAAa;AACvD,UAAI,KAAK,sEAAsE;AAC/E,cAAQ,QAAQ,QAAQ;AAAA,IAC5B;AACA,QAAI,CAAC,QAAQ,SAAS,CAAC,QAAQ,QAAQ,OAAO,QAAQ,UAAU,aAAa;AACzE,UAAI,MAAM,sEAAsE;AAChF,aAAO,QAAQ,OAAO,IAAI,MAAM,mCAAmC,CAAC;AAAA,IACxE;AACA,QAAI,CAAC,YAAY,KAAK,QAAQ,IAAI,GAAG;AACjC,UAAI,MAAM,wBAAwB,QAAQ,IAAI,gBAAgB;AAC9D,aAAO,QAAQ,OAAO,IAAI,MAAM,wBAAwB,QAAQ,IAAI,gBAAgB,CAAC;AAAA,IACzF;AAAA,EACJ;AACA,SAAO,YAAY,WAAW,OAAO,KAAK;AAC9C;AAUO,SAAS,eACZ,aACA,KACA,SACY;AACZ,QAAM,cAAmC,QAAQ;AACjD,MAAI,QAAQ,YAAY;AACxB,QAAM,OAAO,YAAY;AACzB,QAAM,QAAQ,YAAY;AAC1B,MAAI,CAAC,SAAS,YAAY,WAAW;AACjC,QAAI,KAAK,kEAAkE;AAC3E,YAAQ,YAAY;AAAA,EACxB;AACA,MAAI,CAAC,SAAS,CAAC,MAAM;AACjB,QAAI,MAAM,kDAAkD;AAC5D,WAAO,QAAQ,OAAO,IAAI,MAAM,iCAAiC,CAAC;AAAA,EACtE;AACA,QAAM,cAAc,IAAI,OAAO,gBAAgB;AAC/C,MAAI,CAAC,YAAY,KAAK,IAAI,GAAG;AACzB,QAAI,MAAM,wBAAwB,IAAI,gBAAgB;AACtD,WAAO,QAAQ,OAAO,IAAI,MAAM,wBAAwB,IAAI,gBAAgB,CAAC;AAAA,EACjF;AACA,SAAO,YAAY,SAAS,OAAO,MAAM,KAAK;AAClD;", + "sourcesContent": ["/**\n * Handles reading a range of cells of a spreadsheet sheet.\n * Returns the values as 2D array.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleReadCells(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n let sheet = messageData.sheet;\n const range = messageData.range;\n const alias = messageData.alias;\n if (!sheet && messageData.sheetName) {\n log.warn(\"Parameter 'sheetName' is deprecated, please use 'sheet' instead!\");\n sheet = messageData.sheetName;\n }\n if (!sheet || !range) {\n log.error(\"Missing parameters for readCells: 'sheet', 'range'\");\n return Promise.reject(new Error('Missing parameters for readCells'));\n }\n // A1 Notation f\u00FCr Range, z.B. A1:A7 oder A1:B10\n const rangePattern = new RegExp('^[A-Z]+[0-9]+:[A-Z]+[0-9]+$');\n if (!rangePattern.test(range)) {\n log.error(`Invalid range pattern ${range}. Expected: A1:A7`);\n return Promise.reject(new Error(`Invalid range pattern ${range}. Expected: A1:A7`));\n }\n return spreadsheet.readCells(sheet, range, alias);\n}\nimport type { SpreadsheetUtils } from '../google';\n\n/**\n * Handles writing to a single cell of a spreadsheet sheet.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleWriteCell(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n let sheet = messageData.sheet;\n const cell = messageData.cell;\n let value = messageData.value;\n const alias = messageData.alias;\n if (!sheet && messageData.sheetName) {\n log.warn(\"Parameter 'sheetName' is deprecated, please use 'sheet' instead!\");\n sheet = messageData.sheetName;\n }\n if (!value && messageData.data) {\n log.warn(\"Parameter 'data' is deprecated, please use 'value' instead!\");\n value = messageData.data;\n }\n if (!sheet || !cell || typeof value === 'undefined') {\n log.error(\"Missing parameters for writeCell: 'sheet', 'cell', 'value'\");\n return Promise.reject(new Error('Missing parameters for writeCell'));\n }\n const cellPattern = new RegExp('^[A-Z]+[0-9]+$');\n if (!cellPattern.test(cell)) {\n log.error(`Invalid cell pattern ${cell}. Expected: A1`);\n return Promise.reject(new Error(`Invalid cell pattern ${cell}. Expected: A1`));\n }\n return spreadsheet.writeCell(sheet, cell, value, alias);\n}\n\n/**\n * Handles writing to multiple cells of one or more spreadsheet sheets.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleWriteCells(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n const cells = messageData.cells;\n const alias = messageData.alias;\n if (!cells) {\n log.error(\"Missing parameter for writeCells: 'cells'\");\n return Promise.reject(new Error('Missing parameters for writeCells'));\n }\n const cellPattern = new RegExp('^[A-Z]+[0-9]+$');\n for (const cellObj of cells) {\n if (!cellObj.sheet && cellObj.sheetName) {\n log.warn(\"Parameter 'sheetName' in cells is deprecated, please use 'sheet' instead!\");\n cellObj.sheet = cellObj.sheetName;\n }\n if (!cellObj.value && typeof cellObj.data !== 'undefined') {\n log.warn(\"Parameter 'data' in cells is deprecated, please use 'value' instead!\");\n cellObj.value = cellObj.data;\n }\n if (!cellObj.sheet || !cellObj.cell || typeof cellObj.value === 'undefined') {\n log.error(\"Missing parameters for writeCells: 'sheet', 'cell', 'value' in cells\");\n return Promise.reject(new Error('Missing parameters for writeCells'));\n }\n if (!cellPattern.test(cellObj.cell)) {\n log.error(`Invalid cell pattern ${cellObj.cell}. Expected: A1`);\n return Promise.reject(new Error(`Invalid cell pattern ${cellObj.cell}. Expected: A1`));\n }\n }\n return spreadsheet.writeCells(cells, alias);\n}\n\n/**\n * Handles reading a single cell of a spreadsheet sheet.\n * Returns the value of the cell.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleReadCell(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n let sheet = messageData.sheet;\n const cell = messageData.cell;\n const alias = messageData.alias;\n if (!sheet && messageData.sheetName) {\n log.warn(\"Parameter 'sheetName' is deprecated, please use 'sheet' instead!\");\n sheet = messageData.sheetName;\n }\n if (!sheet || !cell) {\n log.error(\"Missing parameters for readCell: 'sheet', 'cell'\");\n return Promise.reject(new Error('Missing parameters for readCell'));\n }\n const cellPattern = new RegExp('^[A-Z]+[0-9]+$');\n if (!cellPattern.test(cell)) {\n log.error(`Invalid cell pattern ${cell}. Expected: A1`);\n return Promise.reject(new Error(`Invalid cell pattern ${cell}. Expected: A1`));\n }\n return spreadsheet.readCell(sheet, cell, alias);\n}\n\n"], + "mappings": "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", "names": [] } diff --git a/build/lib/messageHandlers/index.js b/build/lib/messageHandlers/index.js index ed1c7a9..b9bcb22 100644 --- a/build/lib/messageHandlers/index.js +++ b/build/lib/messageHandlers/index.js @@ -25,6 +25,7 @@ __export(messageHandlers_exports, { handleDeleteSheets: () => import_sheetHandlers.handleDeleteSheets, handleDuplicateSheet: () => import_sheetHandlers.handleDuplicateSheet, handleReadCell: () => import_cellHandlers.handleReadCell, + handleReadCells: () => import_cellHandlers.handleReadCells, handleUpload: () => import_uploadHandlers.handleUpload, handleWriteCell: () => import_cellHandlers.handleWriteCell, handleWriteCells: () => import_cellHandlers.handleWriteCells @@ -42,6 +43,7 @@ var import_uploadHandlers = require("./uploadHandlers"); handleDeleteSheets, handleDuplicateSheet, handleReadCell, + handleReadCells, handleUpload, handleWriteCell, handleWriteCells diff --git a/build/lib/messageHandlers/index.js.map b/build/lib/messageHandlers/index.js.map index 76fc75d..a59c084 100644 --- a/build/lib/messageHandlers/index.js.map +++ b/build/lib/messageHandlers/index.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../src/lib/messageHandlers/index.ts"], - "sourcesContent": ["export {\n handleAppend,\n handleDeleteRows,\n handleCreateSheet,\n handleDeleteSheet,\n handleDeleteSheets,\n handleDuplicateSheet,\n} from './sheetHandlers';\nexport { handleWriteCell, handleWriteCells, handleReadCell } from './cellHandlers';\nexport { handleUpload } from './uploadHandlers';\n"], - "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAOO;AACP,0BAAkE;AAClE,4BAA6B;", + "sourcesContent": ["export {\n handleAppend,\n handleDeleteRows,\n handleCreateSheet,\n handleDeleteSheet,\n handleDeleteSheets,\n handleDuplicateSheet,\n} from './sheetHandlers';\nexport { handleWriteCell, handleWriteCells, handleReadCell, handleReadCells } from './cellHandlers';\nexport { handleUpload } from './uploadHandlers';\n"], + "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAOO;AACP,0BAAmF;AACnF,4BAA6B;", "names": [] } diff --git a/build/lib/messageHandlers/uploadHandlers.js b/build/lib/messageHandlers/uploadHandlers.js index 5216d22..d1e25b9 100644 --- a/build/lib/messageHandlers/uploadHandlers.js +++ b/build/lib/messageHandlers/uploadHandlers.js @@ -31,7 +31,7 @@ __export(uploadHandlers_exports, { handleUpload: () => handleUpload }); module.exports = __toCommonJS(uploadHandlers_exports); -var import_fs = __toESM(require("fs")); +var import_node_fs = __toESM(require("node:fs")); function handleUpload(spreadsheet, log, message) { const messageData = message.message; const target = messageData.target; @@ -41,7 +41,7 @@ function handleUpload(spreadsheet, log, message) { log.error("Missing parameters for upload: 'target', 'parentFolder', 'source'"); return Promise.reject(new Error("Missing parameters for upload")); } - return spreadsheet.upload(target, parentFolder, import_fs.default.createReadStream(source)); + return spreadsheet.upload(target, parentFolder, import_node_fs.default.createReadStream(source)); } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { diff --git a/build/lib/messageHandlers/uploadHandlers.js.map b/build/lib/messageHandlers/uploadHandlers.js.map index ba4d019..4529470 100644 --- a/build/lib/messageHandlers/uploadHandlers.js.map +++ b/build/lib/messageHandlers/uploadHandlers.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../../../src/lib/messageHandlers/uploadHandlers.ts"], - "sourcesContent": ["import type { SpreadsheetUtils } from '../google';\nimport fs from 'fs';\n\n/**\n * Handles uploading a file to a Google Drive folder.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleUpload(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n const target = messageData.target;\n const parentFolder = messageData.parentFolder;\n const source = messageData.source;\n if (!target || !parentFolder || !source) {\n log.error(\"Missing parameters for upload: 'target', 'parentFolder', 'source'\");\n return Promise.reject(new Error('Missing parameters for upload'));\n }\n return spreadsheet.upload(target, parentFolder, fs.createReadStream(source));\n}\n"], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,gBAAe;AASR,SAAS,aACZ,aACA,KACA,SACa;AACb,QAAM,cAAmC,QAAQ;AACjD,QAAM,SAAS,YAAY;AAC3B,QAAM,eAAe,YAAY;AACjC,QAAM,SAAS,YAAY;AAC3B,MAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ;AACrC,QAAI,MAAM,mEAAmE;AAC7E,WAAO,QAAQ,OAAO,IAAI,MAAM,+BAA+B,CAAC;AAAA,EACpE;AACA,SAAO,YAAY,OAAO,QAAQ,cAAc,UAAAA,QAAG,iBAAiB,MAAM,CAAC;AAC/E;", + "sourcesContent": ["import type { SpreadsheetUtils } from '../google';\nimport fs from 'node:fs';\n\n/**\n * Handles uploading a file to a Google Drive folder.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleUpload(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n const target = messageData.target;\n const parentFolder = messageData.parentFolder;\n const source = messageData.source;\n if (!target || !parentFolder || !source) {\n log.error(\"Missing parameters for upload: 'target', 'parentFolder', 'source'\");\n return Promise.reject(new Error('Missing parameters for upload'));\n }\n return spreadsheet.upload(target, parentFolder, fs.createReadStream(source));\n}\n"], + "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAAe;AASR,SAAS,aACZ,aACA,KACA,SACa;AACb,QAAM,cAAmC,QAAQ;AACjD,QAAM,SAAS,YAAY;AAC3B,QAAM,eAAe,YAAY;AACjC,QAAM,SAAS,YAAY;AAC3B,MAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ;AACrC,QAAI,MAAM,mEAAmE;AAC7E,WAAO,QAAQ,OAAO,IAAI,MAAM,+BAA+B,CAAC;AAAA,EACpE;AACA,SAAO,YAAY,OAAO,QAAQ,cAAc,eAAAA,QAAG,iBAAiB,MAAM,CAAC;AAC/E;", "names": ["fs"] } diff --git a/build/main.js b/build/main.js index 78ab254..50ebac6 100644 --- a/build/main.js +++ b/build/main.js @@ -126,7 +126,8 @@ class GoogleSpreadsheet extends utils.Adapter { upload: { handler: import_messageHandlers.handleUpload, logMessage: "upload file" }, writeCell: { handler: import_messageHandlers.handleWriteCell, logMessage: "write cell" }, writeCells: { handler: import_messageHandlers.handleWriteCells, logMessage: "write cells" }, - readCell: { handler: import_messageHandlers.handleReadCell, logMessage: "read cell" } + readCell: { handler: import_messageHandlers.handleReadCell, logMessage: "read cell" }, + readCells: { handler: import_messageHandlers.handleReadCells, logMessage: "read cells" } }; this.log.debug(`Received message: ${JSON.stringify(obj)}`); if (typeof obj === "object" && obj.message) { diff --git a/build/main.js.map b/build/main.js.map index d5c77b3..2c5b942 100644 --- a/build/main.js.map +++ b/build/main.js.map @@ -1,7 +1,7 @@ { "version": 3, "sources": ["../src/main.ts"], - "sourcesContent": ["import * as utils from '@iobroker/adapter-core';\n\nimport { SpreadsheetUtils } from './lib/google';\nimport {\n handleAppend,\n handleDeleteRows,\n handleCreateSheet,\n handleDeleteSheet,\n handleDeleteSheets,\n handleDuplicateSheet,\n handleUpload,\n handleWriteCell,\n handleWriteCells,\n handleReadCell,\n} from './lib/messageHandlers/index';\n\n/**\n * The adapter class\n */\nclass GoogleSpreadsheet extends utils.Adapter {\n private spreadsheet: SpreadsheetUtils;\n\n /**\n * Creates an instance of the adapter class.\n *\n * @param options The adapter options\n */\n public constructor(options: Partial = {}) {\n super({\n ...options,\n name: 'google-spreadsheet',\n });\n this.on('ready', this.onReady.bind(this));\n this.on('message', this.onMessage.bind(this));\n this.on('unload', this.onUnload.bind(this));\n this.spreadsheet = new SpreadsheetUtils(this.config, this.log);\n }\n\n private migrateSpreadhseetIdToTableIfNeeded(): void {\n if (\n this.config.spreadsheetId &&\n this.config.spreadsheetId.length > 0 &&\n (!this.config.spreadsheets || this.config.spreadsheets.length === 0)\n ) {\n this.log.info(`Migrating spreadsheetId ${this.config.spreadsheetId} to spreadsheets table`);\n this.config.spreadsheets = [\n {\n spreadsheetId: this.config.spreadsheetId,\n alias: 'default',\n isDefault: true,\n },\n ];\n this.config.spreadsheetId = '';\n this.extendForeignObject(`system.adapter.${this.name}.${this.instance}`, { native: this.config }, () => {\n this.log.info('Migration completed');\n });\n }\n }\n /**\n * Is called when databases are connected and adapter received configuration.\n */\n private async onReady(): Promise {\n // Initialize your adapter here\n this.migrateSpreadhseetIdToTableIfNeeded();\n\n if (this.config.privateKey && this.config.serviceAccountEmail && this.config.spreadsheets.length > 0) {\n await this.setState('info.connection', true, true);\n this.log.info('Google-spreadsheet adapter configured');\n } else {\n await this.setState('info.connection', false, true);\n this.log.warn('Google-spreadsheet adapter not configured');\n }\n await this.encryptPrivateKeyIfNeeded();\n\n this.spreadsheet = new SpreadsheetUtils(this.config, this.log);\n }\n\n private async encryptPrivateKeyIfNeeded(): Promise {\n if (this.config.privateKey && this.config.privateKey.length > 0) {\n await this.getForeignObjectAsync(`system.adapter.${this.name}.${this.instance}`).then(data => {\n if (data && data.native && data.native.privateKey && !data.native.privateKey.startsWith('$/aes')) {\n this.config.privateKey = data.native.privateKey;\n data.native.privateKey = this.encrypt(data.native.privateKey);\n this.extendForeignObject(`system.adapter.${this.name}.${this.instance}`, data)\n .then(() => {\n this.log.info('privateKey is stored now encrypted');\n })\n .catch(err => {\n this.log.error(`Cannot store encrypted privateKey: ${err}`);\n });\n }\n });\n }\n }\n\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n *\n * @param callback Callback so the adapter can shut down\n */\n private onUnload(callback: () => void): void {\n try {\n callback();\n } catch (e) {\n this.log.error(`Error during unload: ${JSON.stringify(e)}`);\n callback();\n }\n }\n\n /**\n * Some message was sent to this instance over message box. Used by email, pushover, text2speech, ...\n * Using this method requires \"common.messagebox\" property to be set to true in io-package.json\n *\n * @param obj The message object\n */\n private onMessage(obj: ioBroker.Message): void {\n const handlers = {\n append: { handler: handleAppend, logMessage: 'append to spreadsheet' },\n deleteRows: { handler: handleDeleteRows, logMessage: 'delete rows from spreadsheet' },\n createSheet: { handler: handleCreateSheet, logMessage: 'create sheet' },\n deleteSheet: { handler: handleDeleteSheet, logMessage: 'delete sheet' },\n deleteSheets: { handler: handleDeleteSheets, logMessage: 'delete sheets' },\n duplicateSheet: { handler: handleDuplicateSheet, logMessage: 'duplicate sheet' },\n upload: { handler: handleUpload, logMessage: 'upload file' },\n writeCell: { handler: handleWriteCell, logMessage: 'write cell' },\n writeCells: { handler: handleWriteCells, logMessage: 'write cells' },\n readCell: { handler: handleReadCell, logMessage: 'read cell' },\n };\n\n this.log.debug(`Received message: ${JSON.stringify(obj)}`);\n if (typeof obj === 'object' && obj.message) {\n if (obj.command && obj.command in handlers) {\n const command = obj.command as keyof typeof handlers;\n this.log.debug(handlers[command].logMessage);\n handlers[command]\n .handler(this.spreadsheet, this.log, obj)\n .then((result: any) => {\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result ? result : 'Message received', obj.callback);\n }\n })\n .catch((error: Error) => {\n this.log.error(`Cannot ${obj.command}: ${error}`);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { error: error.message }, obj.callback);\n }\n });\n } else {\n this.log.warn(`unknown command: ${obj.command}`);\n }\n }\n }\n}\n\nexport { GoogleSpreadsheet };\n\nif (require.main !== module) {\n module.exports = (options: Partial | undefined) => new GoogleSpreadsheet(options);\n module.exports.GoogleSpreadsheet = GoogleSpreadsheet;\n} else {\n (() => new GoogleSpreadsheet())();\n}\n"], - "mappings": "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", + "sourcesContent": ["import * as utils from '@iobroker/adapter-core';\n\nimport { SpreadsheetUtils } from './lib/google';\nimport {\n handleAppend,\n handleDeleteRows,\n handleCreateSheet,\n handleDeleteSheet,\n handleDeleteSheets,\n handleDuplicateSheet,\n handleUpload,\n handleWriteCell,\n handleWriteCells,\n handleReadCell,\n handleReadCells,\n} from './lib/messageHandlers/index';\n\n/**\n * The adapter class\n */\nclass GoogleSpreadsheet extends utils.Adapter {\n private spreadsheet: SpreadsheetUtils;\n\n /**\n * Creates an instance of the adapter class.\n *\n * @param options The adapter options\n */\n public constructor(options: Partial = {}) {\n super({\n ...options,\n name: 'google-spreadsheet',\n });\n this.on('ready', this.onReady.bind(this));\n this.on('message', this.onMessage.bind(this));\n this.on('unload', this.onUnload.bind(this));\n this.spreadsheet = new SpreadsheetUtils(this.config, this.log);\n }\n\n private migrateSpreadhseetIdToTableIfNeeded(): void {\n if (\n this.config.spreadsheetId &&\n this.config.spreadsheetId.length > 0 &&\n (!this.config.spreadsheets || this.config.spreadsheets.length === 0)\n ) {\n this.log.info(`Migrating spreadsheetId ${this.config.spreadsheetId} to spreadsheets table`);\n this.config.spreadsheets = [\n {\n spreadsheetId: this.config.spreadsheetId,\n alias: 'default',\n isDefault: true,\n },\n ];\n this.config.spreadsheetId = '';\n this.extendForeignObject(`system.adapter.${this.name}.${this.instance}`, { native: this.config }, () => {\n this.log.info('Migration completed');\n });\n }\n }\n /**\n * Is called when databases are connected and adapter received configuration.\n */\n private async onReady(): Promise {\n // Initialize your adapter here\n this.migrateSpreadhseetIdToTableIfNeeded();\n\n if (this.config.privateKey && this.config.serviceAccountEmail && this.config.spreadsheets.length > 0) {\n await this.setState('info.connection', true, true);\n this.log.info('Google-spreadsheet adapter configured');\n } else {\n await this.setState('info.connection', false, true);\n this.log.warn('Google-spreadsheet adapter not configured');\n }\n await this.encryptPrivateKeyIfNeeded();\n\n this.spreadsheet = new SpreadsheetUtils(this.config, this.log);\n }\n\n private async encryptPrivateKeyIfNeeded(): Promise {\n if (this.config.privateKey && this.config.privateKey.length > 0) {\n await this.getForeignObjectAsync(`system.adapter.${this.name}.${this.instance}`).then(data => {\n if (data && data.native && data.native.privateKey && !data.native.privateKey.startsWith('$/aes')) {\n this.config.privateKey = data.native.privateKey;\n data.native.privateKey = this.encrypt(data.native.privateKey);\n this.extendForeignObject(`system.adapter.${this.name}.${this.instance}`, data)\n .then(() => {\n this.log.info('privateKey is stored now encrypted');\n })\n .catch(err => {\n this.log.error(`Cannot store encrypted privateKey: ${err}`);\n });\n }\n });\n }\n }\n\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n *\n * @param callback Callback so the adapter can shut down\n */\n private onUnload(callback: () => void): void {\n try {\n callback();\n } catch (e) {\n this.log.error(`Error during unload: ${JSON.stringify(e)}`);\n callback();\n }\n }\n\n /**\n * Some message was sent to this instance over message box. Used by email, pushover, text2speech, ...\n * Using this method requires \"common.messagebox\" property to be set to true in io-package.json\n *\n * @param obj The message object\n */\n private onMessage(obj: ioBroker.Message): void {\n const handlers = {\n append: { handler: handleAppend, logMessage: 'append to spreadsheet' },\n deleteRows: { handler: handleDeleteRows, logMessage: 'delete rows from spreadsheet' },\n createSheet: { handler: handleCreateSheet, logMessage: 'create sheet' },\n deleteSheet: { handler: handleDeleteSheet, logMessage: 'delete sheet' },\n deleteSheets: { handler: handleDeleteSheets, logMessage: 'delete sheets' },\n duplicateSheet: { handler: handleDuplicateSheet, logMessage: 'duplicate sheet' },\n upload: { handler: handleUpload, logMessage: 'upload file' },\n writeCell: { handler: handleWriteCell, logMessage: 'write cell' },\n writeCells: { handler: handleWriteCells, logMessage: 'write cells' },\n readCell: { handler: handleReadCell, logMessage: 'read cell' },\n readCells: { handler: handleReadCells, logMessage: 'read cells' },\n };\n\n this.log.debug(`Received message: ${JSON.stringify(obj)}`);\n if (typeof obj === 'object' && obj.message) {\n if (obj.command && obj.command in handlers) {\n const command = obj.command as keyof typeof handlers;\n this.log.debug(handlers[command].logMessage);\n handlers[command]\n .handler(this.spreadsheet, this.log, obj)\n .then((result: any) => {\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result ? result : 'Message received', obj.callback);\n }\n })\n .catch((error: Error) => {\n this.log.error(`Cannot ${obj.command}: ${error}`);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { error: error.message }, obj.callback);\n }\n });\n } else {\n this.log.warn(`unknown command: ${obj.command}`);\n }\n }\n }\n}\n\nexport { GoogleSpreadsheet };\n\nif (require.main !== module) {\n module.exports = (options: Partial | undefined) => new GoogleSpreadsheet(options);\n module.exports.GoogleSpreadsheet = GoogleSpreadsheet;\n} else {\n (() => new GoogleSpreadsheet())();\n}\n"], + "mappings": "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", "names": [] } diff --git a/docs/features/read-cells.md b/docs/features/read-cells.md new file mode 100644 index 0000000..9491ac6 --- /dev/null +++ b/docs/features/read-cells.md @@ -0,0 +1,37 @@ +--- +# Read Multiple Cells (`readCells`) + +➡️ See the [sendTo API documentation](../sendTo-API.md) for general usage and all available commands. +The `readCells` feature allows you to read data from a range of cells in a Google spreadsheet using A1 notation (e.g. `A1:A7` or `A1:B10`). + +Used API endpoint: https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/get + +## Parameters + +| Name | Type | Description | +|---------|---------|--------------------------------------------------------| +| sheet | string | The name of the sheet | +| range | string | The range in A1 notation, e.g. `A1:A7` or `A1:B10` | +| alias | string | (optional) The spreadsheet alias if you use multiple | + +## Callback result + +Returns a 2D array with the values from the specified range. Empty cells are returned as empty strings. On error, `{ error: string }` is returned. + +**Example:** + +```javascript +sendTo('google-spreadsheet.0', 'readCells', { + sheet: 'Sheet1', + range: 'A1:B10', +}, (result) => { + console.log(result); + // result is a 2D array with the values from the range +}); +``` + +## Blockly + +![Blockly](../img/blockly-read-cells.png) + +A Blockly block for `readCells` is available. You can specify the sheet and the range in A1 notation. diff --git a/package-lock.json b/package-lock.json index 1e7e873..9557acf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "typescript": "~5.9.3" }, "engines": { - "node": ">= 20" + "node": ">= 22" } }, "node_modules/@alcalzone/esbuild-register": { diff --git a/src/lib/google.ts b/src/lib/google.ts index b6ba7d0..91766a5 100644 --- a/src/lib/google.ts +++ b/src/lib/google.ts @@ -500,6 +500,41 @@ export class SpreadsheetUtils { }); }); } + + /** + * Read data from a range of cells in a Google Spreadsheet + * + * @param sheetName Name of the sheet + * @param range A1 notation range to read (e.g. "A1:A7") + * @param sheetAlias Alias of the sheet to use (optional) + * @returns The data from the range as 2D array + */ + public async readCells(sheetName: string, range: string, sheetAlias: string | null = null): Promise { + const sheets = this.init(); + const spreadsheetId = this.getSpreadsheetId(sheetAlias); + return new Promise((resolve, reject) => { + if (range.startsWith("'") && range.endsWith("'")) { + range = range.substring(1, range.length - 1); + } + sheets.spreadsheets.values + .get({ + range: `${sheetName}!${range}`, + spreadsheetId, + }) + .then(response => { + this.log.debug('Data successfully retrieved from google spreadsheet'); + if (response.data.values && response.data.values.length > 0) { + resolve(response.data.values); + } else { + resolve([]); + } + }) + .catch(error => { + this.log.error(`Error while retrieving data from Google Spreadsheet:${error}`); + reject(new Error(`Error while retrieving data from Google Spreadsheet: ${error.message}`)); + }); + }); + } private prepareValues(message: any): any { if (Array.isArray(message)) { return [message]; diff --git a/src/lib/messageHandlers/cellHandlers.ts b/src/lib/messageHandlers/cellHandlers.ts index ce65004..bb7fedd 100644 --- a/src/lib/messageHandlers/cellHandlers.ts +++ b/src/lib/messageHandlers/cellHandlers.ts @@ -1,3 +1,36 @@ +/** + * Handles reading a range of cells of a spreadsheet sheet. + * Returns the values as 2D array. + * + * @param spreadsheet The SpreadsheetUtils instance to use. + * @param log The logger instance for logging. + * @param message The message containing parameters for the operation. + */ +export function handleReadCells( + spreadsheet: SpreadsheetUtils, + log: ioBroker.Logger, + message: Record, +): Promise { + const messageData: Record = message.message as Record; + let sheet = messageData.sheet; + const range = messageData.range; + const alias = messageData.alias; + if (!sheet && messageData.sheetName) { + log.warn("Parameter 'sheetName' is deprecated, please use 'sheet' instead!"); + sheet = messageData.sheetName; + } + if (!sheet || !range) { + log.error("Missing parameters for readCells: 'sheet', 'range'"); + return Promise.reject(new Error('Missing parameters for readCells')); + } + // A1 Notation für Range, z.B. A1:A7 oder A1:B10 + const rangePattern = new RegExp('^[A-Z]+[0-9]+:[A-Z]+[0-9]+$'); + if (!rangePattern.test(range)) { + log.error(`Invalid range pattern ${range}. Expected: A1:A7`); + return Promise.reject(new Error(`Invalid range pattern ${range}. Expected: A1:A7`)); + } + return spreadsheet.readCells(sheet, range, alias); +} import type { SpreadsheetUtils } from '../google'; /** @@ -110,3 +143,4 @@ export function handleReadCell( } return spreadsheet.readCell(sheet, cell, alias); } + diff --git a/src/lib/messageHandlers/index.ts b/src/lib/messageHandlers/index.ts index a4fa2d3..3273130 100644 --- a/src/lib/messageHandlers/index.ts +++ b/src/lib/messageHandlers/index.ts @@ -6,5 +6,5 @@ export { handleDeleteSheets, handleDuplicateSheet, } from './sheetHandlers'; -export { handleWriteCell, handleWriteCells, handleReadCell } from './cellHandlers'; +export { handleWriteCell, handleWriteCells, handleReadCell, handleReadCells } from './cellHandlers'; export { handleUpload } from './uploadHandlers'; diff --git a/src/main.ts b/src/main.ts index 3e5c31c..4ac50eb 100644 --- a/src/main.ts +++ b/src/main.ts @@ -12,6 +12,7 @@ import { handleWriteCell, handleWriteCells, handleReadCell, + handleReadCells, } from './lib/messageHandlers/index'; /** @@ -125,6 +126,7 @@ class GoogleSpreadsheet extends utils.Adapter { writeCell: { handler: handleWriteCell, logMessage: 'write cell' }, writeCells: { handler: handleWriteCells, logMessage: 'write cells' }, readCell: { handler: handleReadCell, logMessage: 'read cell' }, + readCells: { handler: handleReadCells, logMessage: 'read cells' }, }; this.log.debug(`Received message: ${JSON.stringify(obj)}`); diff --git a/test/unit/messageHandlers/readCells.test.ts b/test/unit/messageHandlers/readCells.test.ts new file mode 100644 index 0000000..64cb25a --- /dev/null +++ b/test/unit/messageHandlers/readCells.test.ts @@ -0,0 +1,35 @@ + +import { handleReadCells } from '../../../src/lib/messageHandlers/cellHandlers.ts'; +import sinon from 'sinon'; +import { expect } from 'chai'; + +describe('handleReadCells', () => { + let spreadsheet: any; + let log: any; + + beforeEach(() => { + spreadsheet = { + readCells: sinon.stub().resolves([[1, 2], [3, 4]]), + }; + log = { error: sinon.stub(), warn: sinon.stub() }; + }); + + it('should call readCells on spreadsheet and return values', async () => { + const message = { message: { sheet: 'Tabelle1', range: 'A1:B2' } }; + const result = await handleReadCells(spreadsheet, log, message); + sinon.assert.calledWith(spreadsheet.readCells, 'Tabelle1', 'A1:B2', undefined); + expect(result).to.deep.equal([[1, 2], [3, 4]]); + }); + + it('should reject if parameters are missing', async () => { + const message = { message: { sheet: 'Tabelle1' } }; + await expect(handleReadCells(spreadsheet, log, message)).to.be.rejected; + sinon.assert.calledOnce(log.error); + }); + + it('should reject if range is invalid', async () => { + const message = { message: { sheet: 'Tabelle1', range: 'foo' } }; + await expect(handleReadCells(spreadsheet, log, message)).to.be.rejected; + sinon.assert.calledOnce(log.error); + }); +}); From 6c06a7b473ccc5871a1ead05b21bbfce6142d4d4 Mon Sep 17 00:00:00 2001 From: Thomas Pohl Date: Sat, 16 May 2026 07:15:09 +0200 Subject: [PATCH 2/6] remove build from git --- .gitignore | 4 +- build/lib/google.js | 507 ------------------ build/lib/google.js.map | 7 - build/lib/messageHandlers/cellHandlers.js | 128 ----- build/lib/messageHandlers/cellHandlers.js.map | 7 - build/lib/messageHandlers/index.js | 51 -- build/lib/messageHandlers/index.js.map | 7 - build/lib/messageHandlers/sheetHandlers.js | 145 ----- .../lib/messageHandlers/sheetHandlers.js.map | 7 - build/lib/messageHandlers/uploadHandlers.js | 50 -- .../lib/messageHandlers/uploadHandlers.js.map | 7 - build/main.js | 163 ------ build/main.js.map | 7 - 13 files changed, 3 insertions(+), 1087 deletions(-) delete mode 100644 build/lib/google.js delete mode 100644 build/lib/google.js.map delete mode 100644 build/lib/messageHandlers/cellHandlers.js delete mode 100644 build/lib/messageHandlers/cellHandlers.js.map delete mode 100644 build/lib/messageHandlers/index.js delete mode 100644 build/lib/messageHandlers/index.js.map delete mode 100644 build/lib/messageHandlers/sheetHandlers.js delete mode 100644 build/lib/messageHandlers/sheetHandlers.js.map delete mode 100644 build/lib/messageHandlers/uploadHandlers.js delete mode 100644 build/lib/messageHandlers/uploadHandlers.js.map delete mode 100644 build/main.js delete mode 100644 build/main.js.map diff --git a/.gitignore b/.gitignore index e3b2bb4..26c3cc8 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,6 @@ admin/i18n/*/flat.txt #ignore .commitinfo created by ioBroker release script .commitinfo -coverage \ No newline at end of file +coverage +build + diff --git a/build/lib/google.js b/build/lib/google.js deleted file mode 100644 index d6d2762..0000000 --- a/build/lib/google.js +++ /dev/null @@ -1,507 +0,0 @@ -"use strict"; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -var google_exports = {}; -__export(google_exports, { - SpreadsheetUtils: () => SpreadsheetUtils -}); -module.exports = __toCommonJS(google_exports); -var import_googleapis = require("googleapis"); -class SpreadsheetUtils { - /** - * Constructor - * - * @param config The adapter configuration - * @param log The logger - */ - constructor(config, log) { - this.config = config; - this.log = log; - } - init() { - const auth = new import_googleapis.google.auth.GoogleAuth({ - credentials: { - client_email: this.config.serviceAccountEmail, - private_key: this.formatPrivateKey(this.config.privateKey) - }, - scopes: ["https://www.googleapis.com/auth/spreadsheets"] - }); - return import_googleapis.google.sheets({ version: "v4", auth }); - } - /** - * Delete rows from a Google Spreadsheet - * - * @param sheetName Name of the sheet - * @param start First row to delete - * @param end Last row to delete - * @param sheetAlias Alias of the sheet to use (optional) - */ - deleteRows(sheetName, start, end, sheetAlias = null) { - const sheets = this.init(); - const spreadsheetId = this.getSpreadsheetId(sheetAlias); - return new Promise((resolve, reject) => { - sheets.spreadsheets.get({ spreadsheetId }).then((spreadsheet) => { - if (spreadsheet && spreadsheet.data.sheets) { - const sheet = spreadsheet.data.sheets.find( - (sheet2) => sheet2.properties && sheet2.properties.title == sheetName - ); - if (sheet && sheet.properties) { - const sheetId = sheet.properties.sheetId; - sheets.spreadsheets.batchUpdate({ - spreadsheetId, - requestBody: { - requests: [ - { - deleteDimension: { - range: { - dimension: "ROWS", - endIndex: end, - sheetId, - startIndex: start - 1 - } - } - } - ] - } - }).then(() => { - this.log.debug("Rows successfully deleted from google spreadsheet"); - resolve(); - }).catch((error) => { - this.log.error(`Error while deleting rows from Google Spreadsheet:${error}`); - reject( - new Error( - `Error while deleting rows from Google Spreadsheet: ${error.message}` - ) - ); - }); - } else { - reject(new Error("Sheet not found")); - } - } else { - reject(new Error("No sheets found in spreadsheet")); - } - }).catch((error) => { - this.log.error(`Error while deleting rows from Google Spreadsheet:${error}`); - reject(new Error(`Error while deleting rows from Google Spreadsheet: ${error.message}`)); - }); - }); - } - /** - * Create a new sheet in the Google Sheets - * - * @param title The title of the new sheet - * @param sheetAlias Alias of the sheet to use (optional) - */ - createSheet(title, sheetAlias = null) { - const sheets = this.init(); - const spreadsheetId = this.getSpreadsheetId(sheetAlias); - return new Promise((resolve, reject) => { - sheets.spreadsheets.batchUpdate({ - spreadsheetId, - requestBody: { - requests: [ - { - addSheet: { - properties: { - title - } - } - } - ] - } - }).then(() => { - this.log.debug("Sheet created successfully"); - resolve(); - }).catch((error) => { - reject(new Error(`Error while creating sheet: ${error.message}`)); - }); - }); - } - /** - * Duplicate a sheet in the Google Spreadsheet - * - * @param source Name of the source sheet - * @param target Name of the target sheet - * @param index Position of the new sheet - * @param sheetAlias Alias of the sheet to use (optional) - */ - duplicateSheet(source, target, index, sheetAlias = null) { - const sheets = this.init(); - const spreadsheetId = this.getSpreadsheetId(sheetAlias); - return new Promise((resolve, reject) => { - sheets.spreadsheets.get({ spreadsheetId }).then((spreadsheet) => { - if (spreadsheet && spreadsheet.data.sheets) { - const sheet = spreadsheet.data.sheets.find( - (sheet2) => sheet2.properties && sheet2.properties.title == source - ); - if (sheet && sheet.properties) { - let insertIndex = index; - if (insertIndex == -1 || insertIndex == void 0) { - insertIndex = spreadsheet.data.sheets.length; - } - sheets.spreadsheets.batchUpdate({ - spreadsheetId, - requestBody: { - requests: [ - { - duplicateSheet: { - sourceSheetId: sheet.properties.sheetId, - newSheetName: target, - insertSheetIndex: insertIndex - } - } - ] - } - }).then(() => { - this.log.debug("Data successfully sent to google spreadsheet"); - resolve(); - }).catch((error) => { - this.log.error(`Error while sending data to Google Spreadsheet:${error}`); - reject(new Error(`Error while duplicating sheet: ${error.message}`)); - }); - } else { - this.log.warn(`Cannot find sheet: ${source}`); - reject(new Error(`Cannot find sheet: ${source}`)); - } - } else { - reject(new Error("No sheets found in spreadsheet")); - } - }).catch((error) => { - this.log.error(`Error while sending data to Google Spreadsheet:${error}`); - reject(new Error(`Error while duplicating sheet: ${error.message}`)); - }); - }); - } - /** - * Upload a file to the Google Drive - * - * @param target Name of the target file - * @param parentFolder Name of the parent folder - * @param filecontent Data of the file - */ - upload(target, parentFolder, filecontent) { - const auth = new import_googleapis.google.auth.GoogleAuth({ - credentials: { - client_email: this.config.serviceAccountEmail, - private_key: this.formatPrivateKey(this.config.privateKey) - }, - scopes: ["https://www.googleapis.com/auth/spreadsheets"] - }); - const driveapi = import_googleapis.google.drive({ version: "v3", auth }); - return new Promise((resolve, reject) => { - driveapi.files.create({ - requestBody: { - parents: [parentFolder], - name: target - }, - media: { - mimeType: "application/octet-stream", - body: filecontent - }, - fields: "id" - }).then(() => { - this.log.debug("Data successfully uploaded to google spreadsheet"); - resolve(); - }).catch((error) => { - this.log.error(`Error while uploading data to Google Spreadsheet:${error}`); - reject(new Error(`Error while uploading data to Google Spreadsheet: ${error.message}`)); - }); - }); - } - /** - * Delete a sheet from the Google Spreadsheet - * - * @param title The title of the sheet to delete - * @param sheetAlias Alias of the sheet to use (optional) - */ - deleteSheet(title, sheetAlias = null) { - const sheets = this.init(); - const spreadsheetId = this.getSpreadsheetId(sheetAlias); - return new Promise((resolve, reject) => { - sheets.spreadsheets.get({ spreadsheetId }).then((spreadsheet) => { - if (spreadsheet && spreadsheet.data.sheets) { - const sheet = spreadsheet.data.sheets.find( - (sheet2) => sheet2.properties && sheet2.properties.title == title - ); - if (sheet && sheet.properties) { - sheets.spreadsheets.batchUpdate({ - spreadsheetId, - requestBody: { - requests: [ - { - deleteSheet: { - sheetId: sheet.properties.sheetId - } - } - ] - } - }).then(() => { - this.log.debug("Data successfully sent to google spreadsheet"); - resolve(); - }).catch((error) => { - this.log.error(`Error while sending data to Google Spreadsheet:${error}`); - reject(new Error(`Error while deleting sheet: ${error.message}`)); - }); - } else { - reject(new Error("Sheet not found")); - } - } else { - reject(new Error("No sheets found in spreadsheet")); - } - }).catch((error) => { - this.log.error(`Error while sending data to Google Spreadsheet:${error}`); - reject(new Error(`Error while deleting sheet: ${error.message}`)); - }); - }); - } - /** - * Delete multiple sheets from the Google Spreadsheet - * - * @param titles The titles of the sheets to delete - * @param sheetAlias Alias of the sheet to use (optional) - */ - deleteSheets(titles, sheetAlias = null) { - const sheets = this.init(); - const spreadsheetId = this.getSpreadsheetId(sheetAlias); - return new Promise((resolve, reject) => { - sheets.spreadsheets.get({ spreadsheetId }).then((spreadsheet) => { - if (spreadsheet && spreadsheet.data.sheets) { - const requests = []; - for (const title of titles) { - const sheet = spreadsheet.data.sheets.find( - (sheet2) => sheet2.properties && sheet2.properties.title == title - ); - if (sheet && sheet.properties) { - requests.push({ - deleteSheet: { - sheetId: sheet.properties.sheetId - } - }); - } - } - if (requests.length > 0) { - sheets.spreadsheets.batchUpdate({ - spreadsheetId, - requestBody: { - requests - } - }).then(() => { - this.log.debug("Sheets successfully deleted from google spreadsheet"); - resolve(); - }).catch((error) => { - this.log.error(`Error while deleting sheets from Google Spreadsheet:${error}`); - reject(new Error(`Error while deleting sheets: ${error.message}`)); - }); - } else { - reject(new Error("No matching sheets found to delete")); - } - } else { - reject(new Error("No sheets found in spreadsheet")); - } - }).catch((error) => { - this.log.error(`Error while deleting sheets from Google Spreadsheet:${error}`); - reject(new Error(`Error while deleting sheets: ${error.message}`)); - }); - }); - } - /** - * Send data to a Google Spreadsheet - * - * @param sheetName Name of the sheet - * @param data Data to send - * @param sheetAlias Alias of the sheet to use (optional) - */ - append(sheetName, data, sheetAlias = null) { - const sheets = this.init(); - return new Promise((resolve, reject) => { - sheets.spreadsheets.values.append({ - // The [A1 notation](/sheets/api/guides/concepts#cell) of a range to search for a logical table of data. Values are appended after the last row of the table. - range: sheetName, - spreadsheetId: this.getSpreadsheetId(sheetAlias), - valueInputOption: "USER_ENTERED", - // Request body metadata - requestBody: { - values: this.prepareValues(data) - } - }).then(() => { - this.log.debug("Data successfully sent to google spreadsheet"); - resolve(); - }).catch((error) => { - this.log.error(`Error while sending data to Google Spreadsheet:${error}`); - reject(new Error(`Error while appending data: ${error.message}`)); - }); - }); - } - /** - * Get the spreadsheetId based on the alias or default - * - * @param sheetAlias Alias of the sheet to use (optional) - * @returns The spreadsheetId - */ - getSpreadsheetId(sheetAlias) { - if (sheetAlias) { - const sheet = this.config.spreadsheets.find((s) => s.alias === sheetAlias); - if (sheet) { - return sheet.spreadsheetId; - } - this.log.warn(`No spreadsheet found for alias ${sheetAlias}, using default spreadsheetId`); - } - const defaultSheet = this.config.spreadsheets.find((s) => s.isDefault); - if (defaultSheet) { - return defaultSheet.spreadsheetId; - } - throw new Error("No default spreadsheetId found in configuration"); - } - /** - * Write data to a cell in a Google Spreadsheet - * - * @param sheet Name of the sheet - * @param cell Cell to write to - * @param value Value to write - * @param sheetAlias Alias of the sheet to use (optional) - */ - writeCell(sheet, cell, value, sheetAlias = null) { - return this.writeCells([{ sheet, cell, value }], sheetAlias); - } - /** - * Write multiple cells in a Google Spreadsheet - * - * @param cells Array of objects: { sheet, cell, value } - * @param sheetAlias Alias of the sheet to use (optional) - */ - writeCells(cells, sheetAlias = null) { - const sheets = this.init(); - const spreadsheetId = this.getSpreadsheetId(sheetAlias); - this.log.info(`Writing cells to spreadsheetId: ${spreadsheetId}`); - const grouped = {}; - for (const cellObj of cells) { - if (!grouped[cellObj.sheet]) { - grouped[cellObj.sheet] = []; - } - grouped[cellObj.sheet].push({ cell: cellObj.cell, data: cellObj.value }); - } - const data = []; - for (const sheetName in grouped) { - for (const entry of grouped[sheetName]) { - let cell = entry.cell; - if (cell.startsWith("'") && cell.endsWith("'")) { - cell = cell.substring(1, cell.length - 1); - } - data.push({ - range: `${sheetName}!${cell}`, - values: this.prepareValues(entry.data) - }); - } - } - this.log.debug(`Prepared data for writing: ${JSON.stringify(data)}`); - return new Promise((resolve, reject) => { - sheets.spreadsheets.values.batchUpdate({ - spreadsheetId, - requestBody: { - valueInputOption: "USER_ENTERED", - data - } - }).then(() => { - this.log.debug("Cells successfully written to google spreadsheet"); - resolve(); - }).catch((error) => { - this.log.error(`Error while writing cells to Google Spreadsheet:${error}`); - reject(new Error(`Error while writing cells: ${error.message}`)); - }); - }); - } - /** - * Read data from a cell in a Google Spreadsheet - * - * @param sheetName Name of the sheet - * @param cell Cell to read from - * @param sheetAlias Alias of the sheet to use (optional) - * @returns The data from the cell - */ - async readCell(sheetName, cell, sheetAlias = null) { - const sheets = this.init(); - const spreadsheetId = this.getSpreadsheetId(sheetAlias); - return new Promise((resolve, reject) => { - if (cell.startsWith("'") && cell.endsWith("'")) { - cell = cell.substring(1, cell.length - 1); - } - sheets.spreadsheets.values.get({ - range: `${sheetName}!${cell}`, - spreadsheetId - }).then((response) => { - this.log.debug("Data successfully retrieved from google spreadsheet"); - if (response.data.values && response.data.values.length > 0) { - resolve(response.data.values[0][0]); - } else { - reject(new Error("No data found")); - } - }).catch((error) => { - this.log.error(`Error while retrieving data from Google Spreadsheet:${error}`); - reject(new Error(`Error while retrieving data from Google Spreadsheet: ${error.message}`)); - }); - }); - } - /** - * Read data from a range of cells in a Google Spreadsheet - * - * @param sheetName Name of the sheet - * @param range A1 notation range to read (e.g. "A1:A7") - * @param sheetAlias Alias of the sheet to use (optional) - * @returns The data from the range as 2D array - */ - async readCells(sheetName, range, sheetAlias = null) { - const sheets = this.init(); - const spreadsheetId = this.getSpreadsheetId(sheetAlias); - return new Promise((resolve, reject) => { - if (range.startsWith("'") && range.endsWith("'")) { - range = range.substring(1, range.length - 1); - } - sheets.spreadsheets.values.get({ - range: `${sheetName}!${range}`, - spreadsheetId - }).then((response) => { - this.log.debug("Data successfully retrieved from google spreadsheet"); - if (response.data.values && response.data.values.length > 0) { - resolve(response.data.values); - } else { - resolve([]); - } - }).catch((error) => { - this.log.error(`Error while retrieving data from Google Spreadsheet:${error}`); - reject(new Error(`Error while retrieving data from Google Spreadsheet: ${error.message}`)); - }); - }); - } - prepareValues(message) { - if (Array.isArray(message)) { - return [message]; - } - return [[message]]; - } - formatPrivateKey(privateKey) { - if (privateKey) { - return privateKey.replace(/\\n/g, "\n"); - } - return void 0; - } -} -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - SpreadsheetUtils -}); -//# sourceMappingURL=google.js.map diff --git a/build/lib/google.js.map b/build/lib/google.js.map deleted file mode 100644 index a49e10a..0000000 --- a/build/lib/google.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../src/lib/google.ts"], - "sourcesContent": ["import { google } from 'googleapis';\nimport type { sheets_v4 } from 'googleapis/build/src/apis/sheets/v4';\n/**\n * This class provides utility functions to interact with Google Sheets\n *\n * @param config The adapter configuration\n * @param log The logger\n */\nexport class SpreadsheetUtils {\n /**\n * Constructor\n *\n * @param config The adapter configuration\n * @param log The logger\n */\n public constructor(\n private config: ioBroker.AdapterConfig,\n private log: ioBroker.Log,\n ) {}\n\n private init(): sheets_v4.Sheets {\n const auth = new google.auth.GoogleAuth({\n credentials: {\n client_email: this.config.serviceAccountEmail,\n private_key: this.formatPrivateKey(this.config.privateKey),\n },\n scopes: ['https://www.googleapis.com/auth/spreadsheets'],\n });\n return google.sheets({ version: 'v4', auth });\n }\n\n /**\n * Delete rows from a Google Spreadsheet\n *\n * @param sheetName Name of the sheet\n * @param start First row to delete\n * @param end Last row to delete\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public deleteRows(sheetName: string, start: number, end: number, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .get({ spreadsheetId })\n .then(spreadsheet => {\n if (spreadsheet && spreadsheet.data.sheets) {\n const sheet = spreadsheet.data.sheets.find(\n sheet => sheet.properties && sheet.properties.title == sheetName,\n );\n if (sheet && sheet.properties) {\n const sheetId = sheet.properties.sheetId;\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: [\n {\n deleteDimension: {\n range: {\n dimension: 'ROWS',\n endIndex: end,\n sheetId: sheetId,\n startIndex: start - 1,\n },\n },\n },\n ],\n },\n })\n .then(() => {\n this.log.debug('Rows successfully deleted from google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while deleting rows from Google Spreadsheet:${error}`);\n reject(\n new Error(\n `Error while deleting rows from Google Spreadsheet: ${error.message}`,\n ),\n );\n });\n } else {\n reject(new Error('Sheet not found'));\n }\n } else {\n reject(new Error('No sheets found in spreadsheet'));\n }\n })\n .catch(error => {\n this.log.error(`Error while deleting rows from Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting rows from Google Spreadsheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Create a new sheet in the Google Sheets\n *\n * @param title The title of the new sheet\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public createSheet(title: string, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: [\n {\n addSheet: {\n properties: {\n title: title,\n },\n },\n },\n ],\n },\n })\n .then(() => {\n this.log.debug('Sheet created successfully');\n resolve();\n })\n .catch(error => {\n reject(new Error(`Error while creating sheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Duplicate a sheet in the Google Spreadsheet\n *\n * @param source Name of the source sheet\n * @param target Name of the target sheet\n * @param index Position of the new sheet\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public duplicateSheet(\n source: string,\n target: string,\n index: number,\n sheetAlias: string | null = null,\n ): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .get({ spreadsheetId })\n .then(spreadsheet => {\n if (spreadsheet && spreadsheet.data.sheets) {\n const sheet = spreadsheet.data.sheets.find(\n sheet => sheet.properties && sheet.properties.title == source,\n );\n if (sheet && sheet.properties) {\n let insertIndex = index;\n if (insertIndex == -1 || insertIndex == undefined) {\n insertIndex = spreadsheet.data.sheets.length;\n }\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: [\n {\n duplicateSheet: {\n sourceSheetId: sheet.properties.sheetId,\n newSheetName: target,\n insertSheetIndex: insertIndex,\n },\n },\n ],\n },\n })\n .then(() => {\n this.log.debug('Data successfully sent to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while duplicating sheet: ${error.message}`));\n });\n } else {\n this.log.warn(`Cannot find sheet: ${source}`);\n reject(new Error(`Cannot find sheet: ${source}`));\n }\n } else {\n reject(new Error('No sheets found in spreadsheet'));\n }\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while duplicating sheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Upload a file to the Google Drive\n *\n * @param target Name of the target file\n * @param parentFolder Name of the parent folder\n * @param filecontent Data of the file\n */\n public upload(target: string, parentFolder: string, filecontent: any): Promise {\n const auth = new google.auth.GoogleAuth({\n credentials: {\n client_email: this.config.serviceAccountEmail,\n private_key: this.formatPrivateKey(this.config.privateKey),\n },\n scopes: ['https://www.googleapis.com/auth/spreadsheets'],\n });\n const driveapi = google.drive({ version: 'v3', auth });\n return new Promise((resolve, reject) => {\n driveapi.files\n .create({\n requestBody: {\n parents: [parentFolder],\n name: target,\n },\n media: {\n mimeType: 'application/octet-stream',\n body: filecontent,\n },\n fields: 'id',\n })\n .then(() => {\n this.log.debug('Data successfully uploaded to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while uploading data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while uploading data to Google Spreadsheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Delete a sheet from the Google Spreadsheet\n *\n * @param title The title of the sheet to delete\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public deleteSheet(title: string, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .get({ spreadsheetId })\n .then(spreadsheet => {\n if (spreadsheet && spreadsheet.data.sheets) {\n const sheet = spreadsheet.data.sheets.find(\n sheet => sheet.properties && sheet.properties.title == title,\n );\n if (sheet && sheet.properties) {\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: [\n {\n deleteSheet: {\n sheetId: sheet.properties.sheetId,\n },\n },\n ],\n },\n })\n .then(() => {\n this.log.debug('Data successfully sent to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting sheet: ${error.message}`));\n });\n } else {\n reject(new Error('Sheet not found'));\n }\n } else {\n reject(new Error('No sheets found in spreadsheet'));\n }\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting sheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Delete multiple sheets from the Google Spreadsheet\n *\n * @param titles The titles of the sheets to delete\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public deleteSheets(titles: string[], sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets\n .get({ spreadsheetId })\n .then(spreadsheet => {\n if (spreadsheet && spreadsheet.data.sheets) {\n const requests: sheets_v4.Schema$Request[] = [];\n for (const title of titles) {\n const sheet = spreadsheet.data.sheets.find(\n sheet => sheet.properties && sheet.properties.title == title,\n );\n if (sheet && sheet.properties) {\n requests.push({\n deleteSheet: {\n sheetId: sheet.properties.sheetId,\n },\n });\n }\n }\n if (requests.length > 0) {\n sheets.spreadsheets\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n requests: requests,\n },\n })\n .then(() => {\n this.log.debug('Sheets successfully deleted from google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while deleting sheets from Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting sheets: ${error.message}`));\n });\n } else {\n reject(new Error('No matching sheets found to delete'));\n }\n } else {\n reject(new Error('No sheets found in spreadsheet'));\n }\n })\n .catch(error => {\n this.log.error(`Error while deleting sheets from Google Spreadsheet:${error}`);\n reject(new Error(`Error while deleting sheets: ${error.message}`));\n });\n });\n }\n\n /**\n * Send data to a Google Spreadsheet\n *\n * @param sheetName Name of the sheet\n * @param data Data to send\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public append(sheetName: string, data: any, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n return new Promise((resolve, reject) => {\n sheets.spreadsheets.values\n .append({\n // The [A1 notation](/sheets/api/guides/concepts#cell) of a range to search for a logical table of data. Values are appended after the last row of the table.\n range: sheetName,\n spreadsheetId: this.getSpreadsheetId(sheetAlias),\n valueInputOption: 'USER_ENTERED',\n // Request body metadata\n requestBody: {\n values: this.prepareValues(data),\n },\n })\n .then(() => {\n this.log.debug('Data successfully sent to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while sending data to Google Spreadsheet:${error}`);\n reject(new Error(`Error while appending data: ${error.message}`));\n });\n });\n }\n\n /**\n * Get the spreadsheetId based on the alias or default\n *\n * @param sheetAlias Alias of the sheet to use (optional)\n * @returns The spreadsheetId\n */\n getSpreadsheetId(sheetAlias: string | null): string {\n if (sheetAlias) {\n const sheet = this.config.spreadsheets.find(s => s.alias === sheetAlias);\n if (sheet) {\n return sheet.spreadsheetId;\n }\n this.log.warn(`No spreadsheet found for alias ${sheetAlias}, using default spreadsheetId`);\n }\n const defaultSheet = this.config.spreadsheets.find(s => s.isDefault);\n if (defaultSheet) {\n return defaultSheet.spreadsheetId;\n }\n throw new Error('No default spreadsheetId found in configuration');\n }\n\n /**\n * Write data to a cell in a Google Spreadsheet\n *\n * @param sheet Name of the sheet\n * @param cell Cell to write to\n * @param value Value to write\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public writeCell(sheet: string, cell: string, value: any, sheetAlias: string | null = null): Promise {\n return this.writeCells([{ sheet, cell, value }], sheetAlias);\n }\n\n /**\n * Write multiple cells in a Google Spreadsheet\n *\n * @param cells Array of objects: { sheet, cell, value }\n * @param sheetAlias Alias of the sheet to use (optional)\n */\n public writeCells(\n cells: Array<{ sheet: string; cell: string; value: any }>,\n sheetAlias: string | null = null,\n ): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n this.log.info(`Writing cells to spreadsheetId: ${spreadsheetId}`);\n // Gruppiere nach sheetName, da batchUpdate mehrere Bereiche pro Sheet erlaubt\n const grouped: { [sheet: string]: Array<{ cell: string; data: any }> } = {};\n for (const cellObj of cells) {\n if (!grouped[cellObj.sheet]) {\n grouped[cellObj.sheet] = [];\n }\n grouped[cellObj.sheet].push({ cell: cellObj.cell, data: cellObj.value });\n }\n const data: Array<{ range: string; values: any[][] }> = [];\n for (const sheetName in grouped) {\n for (const entry of grouped[sheetName]) {\n let cell = entry.cell;\n if (cell.startsWith(\"'\") && cell.endsWith(\"'\")) {\n cell = cell.substring(1, cell.length - 1);\n }\n data.push({\n range: `${sheetName}!${cell}`,\n values: this.prepareValues(entry.data),\n });\n }\n }\n this.log.debug(`Prepared data for writing: ${JSON.stringify(data)}`);\n return new Promise((resolve, reject) => {\n sheets.spreadsheets.values\n .batchUpdate({\n spreadsheetId,\n requestBody: {\n valueInputOption: 'USER_ENTERED',\n data,\n },\n })\n .then(() => {\n this.log.debug('Cells successfully written to google spreadsheet');\n resolve();\n })\n .catch(error => {\n this.log.error(`Error while writing cells to Google Spreadsheet:${error}`);\n reject(new Error(`Error while writing cells: ${error.message}`));\n });\n });\n }\n\n /**\n * Read data from a cell in a Google Spreadsheet\n *\n * @param sheetName Name of the sheet\n * @param cell Cell to read from\n * @param sheetAlias Alias of the sheet to use (optional)\n * @returns The data from the cell\n */\n public async readCell(sheetName: string, cell: string, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n if (cell.startsWith(\"'\") && cell.endsWith(\"'\")) {\n cell = cell.substring(1, cell.length - 1);\n }\n sheets.spreadsheets.values\n .get({\n range: `${sheetName}!${cell}`,\n spreadsheetId,\n })\n .then(response => {\n this.log.debug('Data successfully retrieved from google spreadsheet');\n if (response.data.values && response.data.values.length > 0) {\n resolve(response.data.values[0][0]);\n } else {\n reject(new Error('No data found'));\n }\n })\n .catch(error => {\n this.log.error(`Error while retrieving data from Google Spreadsheet:${error}`);\n reject(new Error(`Error while retrieving data from Google Spreadsheet: ${error.message}`));\n });\n });\n }\n\n /**\n * Read data from a range of cells in a Google Spreadsheet\n *\n * @param sheetName Name of the sheet\n * @param range A1 notation range to read (e.g. \"A1:A7\")\n * @param sheetAlias Alias of the sheet to use (optional)\n * @returns The data from the range as 2D array\n */\n public async readCells(sheetName: string, range: string, sheetAlias: string | null = null): Promise {\n const sheets = this.init();\n const spreadsheetId = this.getSpreadsheetId(sheetAlias);\n return new Promise((resolve, reject) => {\n if (range.startsWith(\"'\") && range.endsWith(\"'\")) {\n range = range.substring(1, range.length - 1);\n }\n sheets.spreadsheets.values\n .get({\n range: `${sheetName}!${range}`,\n spreadsheetId,\n })\n .then(response => {\n this.log.debug('Data successfully retrieved from google spreadsheet');\n if (response.data.values && response.data.values.length > 0) {\n resolve(response.data.values);\n } else {\n resolve([]);\n }\n })\n .catch(error => {\n this.log.error(`Error while retrieving data from Google Spreadsheet:${error}`);\n reject(new Error(`Error while retrieving data from Google Spreadsheet: ${error.message}`));\n });\n });\n }\n private prepareValues(message: any): any {\n if (Array.isArray(message)) {\n return [message];\n }\n return [[message]];\n }\n private formatPrivateKey(privateKey: string): string | undefined {\n //replace all \\n with line breaks\n if (privateKey) {\n return privateKey.replace(/\\\\n/g, '\\n');\n }\n return undefined;\n }\n}\n"], - "mappings": "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", - "names": ["sheet"] -} diff --git a/build/lib/messageHandlers/cellHandlers.js b/build/lib/messageHandlers/cellHandlers.js deleted file mode 100644 index edb0c4f..0000000 --- a/build/lib/messageHandlers/cellHandlers.js +++ /dev/null @@ -1,128 +0,0 @@ -"use strict"; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -var cellHandlers_exports = {}; -__export(cellHandlers_exports, { - handleReadCell: () => handleReadCell, - handleReadCells: () => handleReadCells, - handleWriteCell: () => handleWriteCell, - handleWriteCells: () => handleWriteCells -}); -module.exports = __toCommonJS(cellHandlers_exports); -function handleReadCells(spreadsheet, log, message) { - const messageData = message.message; - let sheet = messageData.sheet; - const range = messageData.range; - const alias = messageData.alias; - if (!sheet && messageData.sheetName) { - log.warn("Parameter 'sheetName' is deprecated, please use 'sheet' instead!"); - sheet = messageData.sheetName; - } - if (!sheet || !range) { - log.error("Missing parameters for readCells: 'sheet', 'range'"); - return Promise.reject(new Error("Missing parameters for readCells")); - } - const rangePattern = new RegExp("^[A-Z]+[0-9]+:[A-Z]+[0-9]+$"); - if (!rangePattern.test(range)) { - log.error(`Invalid range pattern ${range}. Expected: A1:A7`); - return Promise.reject(new Error(`Invalid range pattern ${range}. Expected: A1:A7`)); - } - return spreadsheet.readCells(sheet, range, alias); -} -function handleWriteCell(spreadsheet, log, message) { - const messageData = message.message; - let sheet = messageData.sheet; - const cell = messageData.cell; - let value = messageData.value; - const alias = messageData.alias; - if (!sheet && messageData.sheetName) { - log.warn("Parameter 'sheetName' is deprecated, please use 'sheet' instead!"); - sheet = messageData.sheetName; - } - if (!value && messageData.data) { - log.warn("Parameter 'data' is deprecated, please use 'value' instead!"); - value = messageData.data; - } - if (!sheet || !cell || typeof value === "undefined") { - log.error("Missing parameters for writeCell: 'sheet', 'cell', 'value'"); - return Promise.reject(new Error("Missing parameters for writeCell")); - } - const cellPattern = new RegExp("^[A-Z]+[0-9]+$"); - if (!cellPattern.test(cell)) { - log.error(`Invalid cell pattern ${cell}. Expected: A1`); - return Promise.reject(new Error(`Invalid cell pattern ${cell}. Expected: A1`)); - } - return spreadsheet.writeCell(sheet, cell, value, alias); -} -function handleWriteCells(spreadsheet, log, message) { - const messageData = message.message; - const cells = messageData.cells; - const alias = messageData.alias; - if (!cells) { - log.error("Missing parameter for writeCells: 'cells'"); - return Promise.reject(new Error("Missing parameters for writeCells")); - } - const cellPattern = new RegExp("^[A-Z]+[0-9]+$"); - for (const cellObj of cells) { - if (!cellObj.sheet && cellObj.sheetName) { - log.warn("Parameter 'sheetName' in cells is deprecated, please use 'sheet' instead!"); - cellObj.sheet = cellObj.sheetName; - } - if (!cellObj.value && typeof cellObj.data !== "undefined") { - log.warn("Parameter 'data' in cells is deprecated, please use 'value' instead!"); - cellObj.value = cellObj.data; - } - if (!cellObj.sheet || !cellObj.cell || typeof cellObj.value === "undefined") { - log.error("Missing parameters for writeCells: 'sheet', 'cell', 'value' in cells"); - return Promise.reject(new Error("Missing parameters for writeCells")); - } - if (!cellPattern.test(cellObj.cell)) { - log.error(`Invalid cell pattern ${cellObj.cell}. Expected: A1`); - return Promise.reject(new Error(`Invalid cell pattern ${cellObj.cell}. Expected: A1`)); - } - } - return spreadsheet.writeCells(cells, alias); -} -function handleReadCell(spreadsheet, log, message) { - const messageData = message.message; - let sheet = messageData.sheet; - const cell = messageData.cell; - const alias = messageData.alias; - if (!sheet && messageData.sheetName) { - log.warn("Parameter 'sheetName' is deprecated, please use 'sheet' instead!"); - sheet = messageData.sheetName; - } - if (!sheet || !cell) { - log.error("Missing parameters for readCell: 'sheet', 'cell'"); - return Promise.reject(new Error("Missing parameters for readCell")); - } - const cellPattern = new RegExp("^[A-Z]+[0-9]+$"); - if (!cellPattern.test(cell)) { - log.error(`Invalid cell pattern ${cell}. Expected: A1`); - return Promise.reject(new Error(`Invalid cell pattern ${cell}. Expected: A1`)); - } - return spreadsheet.readCell(sheet, cell, alias); -} -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - handleReadCell, - handleReadCells, - handleWriteCell, - handleWriteCells -}); -//# sourceMappingURL=cellHandlers.js.map diff --git a/build/lib/messageHandlers/cellHandlers.js.map b/build/lib/messageHandlers/cellHandlers.js.map deleted file mode 100644 index c7be2ab..0000000 --- a/build/lib/messageHandlers/cellHandlers.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../../src/lib/messageHandlers/cellHandlers.ts"], - "sourcesContent": ["/**\n * Handles reading a range of cells of a spreadsheet sheet.\n * Returns the values as 2D array.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleReadCells(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n let sheet = messageData.sheet;\n const range = messageData.range;\n const alias = messageData.alias;\n if (!sheet && messageData.sheetName) {\n log.warn(\"Parameter 'sheetName' is deprecated, please use 'sheet' instead!\");\n sheet = messageData.sheetName;\n }\n if (!sheet || !range) {\n log.error(\"Missing parameters for readCells: 'sheet', 'range'\");\n return Promise.reject(new Error('Missing parameters for readCells'));\n }\n // A1 Notation f\u00FCr Range, z.B. A1:A7 oder A1:B10\n const rangePattern = new RegExp('^[A-Z]+[0-9]+:[A-Z]+[0-9]+$');\n if (!rangePattern.test(range)) {\n log.error(`Invalid range pattern ${range}. Expected: A1:A7`);\n return Promise.reject(new Error(`Invalid range pattern ${range}. Expected: A1:A7`));\n }\n return spreadsheet.readCells(sheet, range, alias);\n}\nimport type { SpreadsheetUtils } from '../google';\n\n/**\n * Handles writing to a single cell of a spreadsheet sheet.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleWriteCell(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n let sheet = messageData.sheet;\n const cell = messageData.cell;\n let value = messageData.value;\n const alias = messageData.alias;\n if (!sheet && messageData.sheetName) {\n log.warn(\"Parameter 'sheetName' is deprecated, please use 'sheet' instead!\");\n sheet = messageData.sheetName;\n }\n if (!value && messageData.data) {\n log.warn(\"Parameter 'data' is deprecated, please use 'value' instead!\");\n value = messageData.data;\n }\n if (!sheet || !cell || typeof value === 'undefined') {\n log.error(\"Missing parameters for writeCell: 'sheet', 'cell', 'value'\");\n return Promise.reject(new Error('Missing parameters for writeCell'));\n }\n const cellPattern = new RegExp('^[A-Z]+[0-9]+$');\n if (!cellPattern.test(cell)) {\n log.error(`Invalid cell pattern ${cell}. Expected: A1`);\n return Promise.reject(new Error(`Invalid cell pattern ${cell}. Expected: A1`));\n }\n return spreadsheet.writeCell(sheet, cell, value, alias);\n}\n\n/**\n * Handles writing to multiple cells of one or more spreadsheet sheets.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleWriteCells(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n const cells = messageData.cells;\n const alias = messageData.alias;\n if (!cells) {\n log.error(\"Missing parameter for writeCells: 'cells'\");\n return Promise.reject(new Error('Missing parameters for writeCells'));\n }\n const cellPattern = new RegExp('^[A-Z]+[0-9]+$');\n for (const cellObj of cells) {\n if (!cellObj.sheet && cellObj.sheetName) {\n log.warn(\"Parameter 'sheetName' in cells is deprecated, please use 'sheet' instead!\");\n cellObj.sheet = cellObj.sheetName;\n }\n if (!cellObj.value && typeof cellObj.data !== 'undefined') {\n log.warn(\"Parameter 'data' in cells is deprecated, please use 'value' instead!\");\n cellObj.value = cellObj.data;\n }\n if (!cellObj.sheet || !cellObj.cell || typeof cellObj.value === 'undefined') {\n log.error(\"Missing parameters for writeCells: 'sheet', 'cell', 'value' in cells\");\n return Promise.reject(new Error('Missing parameters for writeCells'));\n }\n if (!cellPattern.test(cellObj.cell)) {\n log.error(`Invalid cell pattern ${cellObj.cell}. Expected: A1`);\n return Promise.reject(new Error(`Invalid cell pattern ${cellObj.cell}. Expected: A1`));\n }\n }\n return spreadsheet.writeCells(cells, alias);\n}\n\n/**\n * Handles reading a single cell of a spreadsheet sheet.\n * Returns the value of the cell.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleReadCell(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n let sheet = messageData.sheet;\n const cell = messageData.cell;\n const alias = messageData.alias;\n if (!sheet && messageData.sheetName) {\n log.warn(\"Parameter 'sheetName' is deprecated, please use 'sheet' instead!\");\n sheet = messageData.sheetName;\n }\n if (!sheet || !cell) {\n log.error(\"Missing parameters for readCell: 'sheet', 'cell'\");\n return Promise.reject(new Error('Missing parameters for readCell'));\n }\n const cellPattern = new RegExp('^[A-Z]+[0-9]+$');\n if (!cellPattern.test(cell)) {\n log.error(`Invalid cell pattern ${cell}. Expected: A1`);\n return Promise.reject(new Error(`Invalid cell pattern ${cell}. Expected: A1`));\n }\n return spreadsheet.readCell(sheet, cell, alias);\n}\n\n"], - "mappings": "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", - "names": [] -} diff --git a/build/lib/messageHandlers/index.js b/build/lib/messageHandlers/index.js deleted file mode 100644 index b9bcb22..0000000 --- a/build/lib/messageHandlers/index.js +++ /dev/null @@ -1,51 +0,0 @@ -"use strict"; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -var messageHandlers_exports = {}; -__export(messageHandlers_exports, { - handleAppend: () => import_sheetHandlers.handleAppend, - handleCreateSheet: () => import_sheetHandlers.handleCreateSheet, - handleDeleteRows: () => import_sheetHandlers.handleDeleteRows, - handleDeleteSheet: () => import_sheetHandlers.handleDeleteSheet, - handleDeleteSheets: () => import_sheetHandlers.handleDeleteSheets, - handleDuplicateSheet: () => import_sheetHandlers.handleDuplicateSheet, - handleReadCell: () => import_cellHandlers.handleReadCell, - handleReadCells: () => import_cellHandlers.handleReadCells, - handleUpload: () => import_uploadHandlers.handleUpload, - handleWriteCell: () => import_cellHandlers.handleWriteCell, - handleWriteCells: () => import_cellHandlers.handleWriteCells -}); -module.exports = __toCommonJS(messageHandlers_exports); -var import_sheetHandlers = require("./sheetHandlers"); -var import_cellHandlers = require("./cellHandlers"); -var import_uploadHandlers = require("./uploadHandlers"); -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - handleAppend, - handleCreateSheet, - handleDeleteRows, - handleDeleteSheet, - handleDeleteSheets, - handleDuplicateSheet, - handleReadCell, - handleReadCells, - handleUpload, - handleWriteCell, - handleWriteCells -}); -//# sourceMappingURL=index.js.map diff --git a/build/lib/messageHandlers/index.js.map b/build/lib/messageHandlers/index.js.map deleted file mode 100644 index a59c084..0000000 --- a/build/lib/messageHandlers/index.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../../src/lib/messageHandlers/index.ts"], - "sourcesContent": ["export {\n handleAppend,\n handleDeleteRows,\n handleCreateSheet,\n handleDeleteSheet,\n handleDeleteSheets,\n handleDuplicateSheet,\n} from './sheetHandlers';\nexport { handleWriteCell, handleWriteCells, handleReadCell, handleReadCells } from './cellHandlers';\nexport { handleUpload } from './uploadHandlers';\n"], - "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAOO;AACP,0BAAmF;AACnF,4BAA6B;", - "names": [] -} diff --git a/build/lib/messageHandlers/sheetHandlers.js b/build/lib/messageHandlers/sheetHandlers.js deleted file mode 100644 index a1bafec..0000000 --- a/build/lib/messageHandlers/sheetHandlers.js +++ /dev/null @@ -1,145 +0,0 @@ -"use strict"; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -var sheetHandlers_exports = {}; -__export(sheetHandlers_exports, { - handleAppend: () => handleAppend, - handleCreateSheet: () => handleCreateSheet, - handleDeleteRows: () => handleDeleteRows, - handleDeleteSheet: () => handleDeleteSheet, - handleDeleteSheets: () => handleDeleteSheets, - handleDuplicateSheet: () => handleDuplicateSheet -}); -module.exports = __toCommonJS(sheetHandlers_exports); -function handleAppend(spreadsheet, log, message) { - return new Promise((resolve, reject) => { - const messageData = message.message; - let sheet = messageData.sheet; - let values = messageData.values; - const alias = messageData.alias; - if (!sheet && messageData.sheetName) { - log.warn("Parameter 'sheetName' is deprecated, please use 'sheet' instead!"); - sheet = messageData.sheetName; - } - if (!values && messageData.data) { - log.warn("Parameter 'data' is deprecated, please use 'values' instead!"); - values = messageData.data; - } - if (!sheet || !values) { - log.error("Missing parameters for append: 'sheet' and/or 'values'"); - reject(new Error("Missing parameters for append")); - return; - } - spreadsheet.append(sheet, values, alias).then(() => resolve()).catch((error) => reject(new Error(error))); - }); -} -function handleDeleteRows(spreadsheet, log, message) { - return new Promise((resolve, reject) => { - const messageData = message.message; - let sheet = messageData.sheet; - const start = messageData.start; - const end = messageData.end; - const alias = messageData.alias; - if (!sheet && messageData.sheetName) { - log.warn("Parameter 'sheetName' is deprecated, please use 'sheet' instead!"); - sheet = messageData.sheetName; - } - if (!sheet || typeof start !== "number" || typeof end !== "number") { - log.error("Missing parameters for deleteRows: 'sheet', 'start', 'end'"); - reject(new Error("Missing parameters for deleteRows")); - return; - } - spreadsheet.deleteRows(sheet, start, end, alias).then(() => resolve()).catch((error) => reject(new Error(error))); - }); -} -function handleCreateSheet(spreadsheet, log, message) { - if (typeof message.message === "string") { - log.warn("Deprecated call of createSheet with string as message. Please use an object with sheet!"); - return spreadsheet.createSheet(message.message, null); - } - const messageData = message.message; - let sheet = messageData.sheet; - const alias = messageData.alias; - if (!sheet && messageData.sheetName) { - log.warn("Parameter 'sheetName' is deprecated, please use 'sheet' instead!"); - sheet = messageData.sheetName; - } - if (!sheet) { - log.error("Missing parameter for createSheet: 'sheet'"); - return Promise.reject(new Error("Missing parameters for createSheet")); - } - return spreadsheet.createSheet(sheet, alias); -} -function handleDeleteSheet(spreadsheet, log, message) { - if (typeof message.message === "string") { - log.warn("Deprecated call of deleteSheet with string as message. Please use an object with sheet!"); - return spreadsheet.deleteSheet(message.message); - } - const messageData = message.message; - let sheet = messageData.sheet; - const alias = messageData.alias; - if (!sheet && messageData.sheetName) { - log.warn("Parameter 'sheetName' is deprecated, please use 'sheet' instead!"); - sheet = messageData.sheetName; - } - if (!sheet) { - log.error("Missing parameter for deleteSheet: 'sheet'"); - return Promise.reject(new Error("Missing parameters for deleteSheet")); - } - return spreadsheet.deleteSheet(sheet, alias); -} -function handleDeleteSheets(spreadsheet, log, message) { - if (Array.isArray(message.message)) { - log.warn("Deprecated call of deleteSheets with array as message. Please use an object with sheets!"); - return spreadsheet.deleteSheets(message.message, null); - } - const messageData = message.message; - let sheets = messageData.sheets; - const alias = messageData.alias; - if (!sheets && messageData.sheetNames) { - log.warn("Parameter 'sheetNames' is deprecated, please use 'sheets' instead!"); - sheets = messageData.sheetNames; - } - if (!sheets) { - log.error("Missing parameter for deleteSheets: 'sheets'"); - return Promise.reject(new Error("Missing parameters for deleteSheets")); - } - return spreadsheet.deleteSheets(sheets, alias); -} -function handleDuplicateSheet(spreadsheet, log, message) { - const messageData = message.message; - const source = messageData.source; - const target = messageData.target; - const index = messageData.index; - const alias = messageData.alias; - if (!source || !target || typeof index !== "number") { - log.error("Missing parameters for duplicateSheet: 'source', 'target', 'index'"); - return Promise.reject(new Error("Missing parameters for duplicateSheet")); - } - return spreadsheet.duplicateSheet(source, target, index, alias); -} -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - handleAppend, - handleCreateSheet, - handleDeleteRows, - handleDeleteSheet, - handleDeleteSheets, - handleDuplicateSheet -}); -//# sourceMappingURL=sheetHandlers.js.map diff --git a/build/lib/messageHandlers/sheetHandlers.js.map b/build/lib/messageHandlers/sheetHandlers.js.map deleted file mode 100644 index 318c7cb..0000000 --- a/build/lib/messageHandlers/sheetHandlers.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../../src/lib/messageHandlers/sheetHandlers.ts"], - "sourcesContent": ["import type { SpreadsheetUtils } from '../google';\n\n/**\n * Handles appending data to a spreadsheet sheet.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleAppend(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n return new Promise((resolve, reject) => {\n const messageData: Record = message.message as Record;\n let sheet = messageData.sheet;\n let values = messageData.values;\n const alias = messageData.alias;\n if (!sheet && messageData.sheetName) {\n log.warn(\"Parameter 'sheetName' is deprecated, please use 'sheet' instead!\");\n sheet = messageData.sheetName;\n }\n if (!values && messageData.data) {\n log.warn(\"Parameter 'data' is deprecated, please use 'values' instead!\");\n values = messageData.data;\n }\n if (!sheet || !values) {\n log.error(\"Missing parameters for append: 'sheet' and/or 'values'\");\n reject(new Error('Missing parameters for append'));\n return;\n }\n spreadsheet\n .append(sheet, values, alias)\n .then(() => resolve())\n .catch(error => reject(new Error(error)));\n });\n}\n\n/**\n * Handles deleting rows in a spreadsheet sheet.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleDeleteRows(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n return new Promise((resolve, reject) => {\n const messageData: Record = message.message as Record;\n let sheet = messageData.sheet;\n const start = messageData.start;\n const end = messageData.end;\n const alias = messageData.alias;\n if (!sheet && messageData.sheetName) {\n log.warn(\"Parameter 'sheetName' is deprecated, please use 'sheet' instead!\");\n sheet = messageData.sheetName;\n }\n if (!sheet || typeof start !== 'number' || typeof end !== 'number') {\n log.error(\"Missing parameters for deleteRows: 'sheet', 'start', 'end'\");\n reject(new Error('Missing parameters for deleteRows'));\n return;\n }\n spreadsheet\n .deleteRows(sheet, start, end, alias)\n .then(() => resolve())\n .catch(error => reject(new Error(error)));\n });\n}\n\n/**\n * Handles creating a new spreadsheet sheet.\n *\n * @param spreadsheet The SpreadsheetUtils instance\n * @param log The logger instance\n * @param message The message containing parameters\n */\nexport function handleCreateSheet(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n if (typeof message.message === 'string') {\n log.warn('Deprecated call of createSheet with string as message. Please use an object with sheet!');\n return spreadsheet.createSheet(message.message, null);\n }\n const messageData: Record = message.message as Record;\n let sheet = messageData.sheet;\n const alias = messageData.alias;\n if (!sheet && messageData.sheetName) {\n log.warn(\"Parameter 'sheetName' is deprecated, please use 'sheet' instead!\");\n sheet = messageData.sheetName;\n }\n if (!sheet) {\n log.error(\"Missing parameter for createSheet: 'sheet'\");\n return Promise.reject(new Error('Missing parameters for createSheet'));\n }\n return spreadsheet.createSheet(sheet, alias);\n}\n\n/**\n * Handles deleting a spreadsheet sheet.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleDeleteSheet(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n if (typeof message.message === 'string') {\n log.warn('Deprecated call of deleteSheet with string as message. Please use an object with sheet!');\n return spreadsheet.deleteSheet(message.message);\n }\n const messageData: Record = message.message as Record;\n let sheet = messageData.sheet;\n const alias = messageData.alias;\n if (!sheet && messageData.sheetName) {\n log.warn(\"Parameter 'sheetName' is deprecated, please use 'sheet' instead!\");\n sheet = messageData.sheetName;\n }\n if (!sheet) {\n log.error(\"Missing parameter for deleteSheet: 'sheet'\");\n return Promise.reject(new Error('Missing parameters for deleteSheet'));\n }\n return spreadsheet.deleteSheet(sheet, alias);\n}\n\n/**\n * Handles deleting multiple spreadsheet sheets.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleDeleteSheets(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n if (Array.isArray(message.message)) {\n log.warn('Deprecated call of deleteSheets with array as message. Please use an object with sheets!');\n return spreadsheet.deleteSheets(message.message as string[], null);\n }\n const messageData: Record = message.message as Record;\n let sheets = messageData.sheets;\n const alias = messageData.alias;\n if (!sheets && messageData.sheetNames) {\n log.warn(\"Parameter 'sheetNames' is deprecated, please use 'sheets' instead!\");\n sheets = messageData.sheetNames;\n }\n if (!sheets) {\n log.error(\"Missing parameter for deleteSheets: 'sheets'\");\n return Promise.reject(new Error('Missing parameters for deleteSheets'));\n }\n return spreadsheet.deleteSheets(sheets, alias);\n}\n\n/**\n * Handles duplicating a spreadsheet sheet.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleDuplicateSheet(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n const source = messageData.source;\n const target = messageData.target;\n const index = messageData.index;\n const alias = messageData.alias;\n if (!source || !target || typeof index !== 'number') {\n log.error(\"Missing parameters for duplicateSheet: 'source', 'target', 'index'\");\n return Promise.reject(new Error('Missing parameters for duplicateSheet'));\n }\n return spreadsheet.duplicateSheet(source, target, index, alias);\n}\n"], - "mappings": "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", - "names": [] -} diff --git a/build/lib/messageHandlers/uploadHandlers.js b/build/lib/messageHandlers/uploadHandlers.js deleted file mode 100644 index d1e25b9..0000000 --- a/build/lib/messageHandlers/uploadHandlers.js +++ /dev/null @@ -1,50 +0,0 @@ -"use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -var uploadHandlers_exports = {}; -__export(uploadHandlers_exports, { - handleUpload: () => handleUpload -}); -module.exports = __toCommonJS(uploadHandlers_exports); -var import_node_fs = __toESM(require("node:fs")); -function handleUpload(spreadsheet, log, message) { - const messageData = message.message; - const target = messageData.target; - const parentFolder = messageData.parentFolder; - const source = messageData.source; - if (!target || !parentFolder || !source) { - log.error("Missing parameters for upload: 'target', 'parentFolder', 'source'"); - return Promise.reject(new Error("Missing parameters for upload")); - } - return spreadsheet.upload(target, parentFolder, import_node_fs.default.createReadStream(source)); -} -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - handleUpload -}); -//# sourceMappingURL=uploadHandlers.js.map diff --git a/build/lib/messageHandlers/uploadHandlers.js.map b/build/lib/messageHandlers/uploadHandlers.js.map deleted file mode 100644 index 4529470..0000000 --- a/build/lib/messageHandlers/uploadHandlers.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../../../src/lib/messageHandlers/uploadHandlers.ts"], - "sourcesContent": ["import type { SpreadsheetUtils } from '../google';\nimport fs from 'node:fs';\n\n/**\n * Handles uploading a file to a Google Drive folder.\n *\n * @param spreadsheet The SpreadsheetUtils instance to use.\n * @param log The logger instance for logging.\n * @param message The message containing parameters for the operation.\n */\nexport function handleUpload(\n spreadsheet: SpreadsheetUtils,\n log: ioBroker.Logger,\n message: Record,\n): Promise {\n const messageData: Record = message.message as Record;\n const target = messageData.target;\n const parentFolder = messageData.parentFolder;\n const source = messageData.source;\n if (!target || !parentFolder || !source) {\n log.error(\"Missing parameters for upload: 'target', 'parentFolder', 'source'\");\n return Promise.reject(new Error('Missing parameters for upload'));\n }\n return spreadsheet.upload(target, parentFolder, fs.createReadStream(source));\n}\n"], - "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAAe;AASR,SAAS,aACZ,aACA,KACA,SACa;AACb,QAAM,cAAmC,QAAQ;AACjD,QAAM,SAAS,YAAY;AAC3B,QAAM,eAAe,YAAY;AACjC,QAAM,SAAS,YAAY;AAC3B,MAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,QAAQ;AACrC,QAAI,MAAM,mEAAmE;AAC7E,WAAO,QAAQ,OAAO,IAAI,MAAM,+BAA+B,CAAC;AAAA,EACpE;AACA,SAAO,YAAY,OAAO,QAAQ,cAAc,eAAAA,QAAG,iBAAiB,MAAM,CAAC;AAC/E;", - "names": ["fs"] -} diff --git a/build/main.js b/build/main.js deleted file mode 100644 index 50ebac6..0000000 --- a/build/main.js +++ /dev/null @@ -1,163 +0,0 @@ -"use strict"; -var __create = Object.create; -var __defProp = Object.defineProperty; -var __getOwnPropDesc = Object.getOwnPropertyDescriptor; -var __getOwnPropNames = Object.getOwnPropertyNames; -var __getProtoOf = Object.getPrototypeOf; -var __hasOwnProp = Object.prototype.hasOwnProperty; -var __export = (target, all) => { - for (var name in all) - __defProp(target, name, { get: all[name], enumerable: true }); -}; -var __copyProps = (to, from, except, desc) => { - if (from && typeof from === "object" || typeof from === "function") { - for (let key of __getOwnPropNames(from)) - if (!__hasOwnProp.call(to, key) && key !== except) - __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); - } - return to; -}; -var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( - // If the importer is in node compatibility mode or this is not an ESM - // file that has been converted to a CommonJS file using a Babel- - // compatible transform (i.e. "__esModule" has not been set), then set - // "default" to the CommonJS "module.exports" for node compatibility. - isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, - mod -)); -var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); -var main_exports = {}; -__export(main_exports, { - GoogleSpreadsheet: () => GoogleSpreadsheet -}); -module.exports = __toCommonJS(main_exports); -var utils = __toESM(require("@iobroker/adapter-core")); -var import_google = require("./lib/google"); -var import_messageHandlers = require("./lib/messageHandlers/index"); -class GoogleSpreadsheet extends utils.Adapter { - /** - * Creates an instance of the adapter class. - * - * @param options The adapter options - */ - constructor(options = {}) { - super({ - ...options, - name: "google-spreadsheet" - }); - this.on("ready", this.onReady.bind(this)); - this.on("message", this.onMessage.bind(this)); - this.on("unload", this.onUnload.bind(this)); - this.spreadsheet = new import_google.SpreadsheetUtils(this.config, this.log); - } - migrateSpreadhseetIdToTableIfNeeded() { - if (this.config.spreadsheetId && this.config.spreadsheetId.length > 0 && (!this.config.spreadsheets || this.config.spreadsheets.length === 0)) { - this.log.info(`Migrating spreadsheetId ${this.config.spreadsheetId} to spreadsheets table`); - this.config.spreadsheets = [ - { - spreadsheetId: this.config.spreadsheetId, - alias: "default", - isDefault: true - } - ]; - this.config.spreadsheetId = ""; - this.extendForeignObject(`system.adapter.${this.name}.${this.instance}`, { native: this.config }, () => { - this.log.info("Migration completed"); - }); - } - } - /** - * Is called when databases are connected and adapter received configuration. - */ - async onReady() { - this.migrateSpreadhseetIdToTableIfNeeded(); - if (this.config.privateKey && this.config.serviceAccountEmail && this.config.spreadsheets.length > 0) { - await this.setState("info.connection", true, true); - this.log.info("Google-spreadsheet adapter configured"); - } else { - await this.setState("info.connection", false, true); - this.log.warn("Google-spreadsheet adapter not configured"); - } - await this.encryptPrivateKeyIfNeeded(); - this.spreadsheet = new import_google.SpreadsheetUtils(this.config, this.log); - } - async encryptPrivateKeyIfNeeded() { - if (this.config.privateKey && this.config.privateKey.length > 0) { - await this.getForeignObjectAsync(`system.adapter.${this.name}.${this.instance}`).then((data) => { - if (data && data.native && data.native.privateKey && !data.native.privateKey.startsWith("$/aes")) { - this.config.privateKey = data.native.privateKey; - data.native.privateKey = this.encrypt(data.native.privateKey); - this.extendForeignObject(`system.adapter.${this.name}.${this.instance}`, data).then(() => { - this.log.info("privateKey is stored now encrypted"); - }).catch((err) => { - this.log.error(`Cannot store encrypted privateKey: ${err}`); - }); - } - }); - } - } - /** - * Is called when adapter shuts down - callback has to be called under any circumstances! - * - * @param callback Callback so the adapter can shut down - */ - onUnload(callback) { - try { - callback(); - } catch (e) { - this.log.error(`Error during unload: ${JSON.stringify(e)}`); - callback(); - } - } - /** - * Some message was sent to this instance over message box. Used by email, pushover, text2speech, ... - * Using this method requires "common.messagebox" property to be set to true in io-package.json - * - * @param obj The message object - */ - onMessage(obj) { - const handlers = { - append: { handler: import_messageHandlers.handleAppend, logMessage: "append to spreadsheet" }, - deleteRows: { handler: import_messageHandlers.handleDeleteRows, logMessage: "delete rows from spreadsheet" }, - createSheet: { handler: import_messageHandlers.handleCreateSheet, logMessage: "create sheet" }, - deleteSheet: { handler: import_messageHandlers.handleDeleteSheet, logMessage: "delete sheet" }, - deleteSheets: { handler: import_messageHandlers.handleDeleteSheets, logMessage: "delete sheets" }, - duplicateSheet: { handler: import_messageHandlers.handleDuplicateSheet, logMessage: "duplicate sheet" }, - upload: { handler: import_messageHandlers.handleUpload, logMessage: "upload file" }, - writeCell: { handler: import_messageHandlers.handleWriteCell, logMessage: "write cell" }, - writeCells: { handler: import_messageHandlers.handleWriteCells, logMessage: "write cells" }, - readCell: { handler: import_messageHandlers.handleReadCell, logMessage: "read cell" }, - readCells: { handler: import_messageHandlers.handleReadCells, logMessage: "read cells" } - }; - this.log.debug(`Received message: ${JSON.stringify(obj)}`); - if (typeof obj === "object" && obj.message) { - if (obj.command && obj.command in handlers) { - const command = obj.command; - this.log.debug(handlers[command].logMessage); - handlers[command].handler(this.spreadsheet, this.log, obj).then((result) => { - if (obj.callback) { - this.sendTo(obj.from, obj.command, result ? result : "Message received", obj.callback); - } - }).catch((error) => { - this.log.error(`Cannot ${obj.command}: ${error}`); - if (obj.callback) { - this.sendTo(obj.from, obj.command, { error: error.message }, obj.callback); - } - }); - } else { - this.log.warn(`unknown command: ${obj.command}`); - } - } - } -} -if (require.main !== module) { - module.exports = (options) => new GoogleSpreadsheet(options); - module.exports.GoogleSpreadsheet = GoogleSpreadsheet; -} else { - (() => new GoogleSpreadsheet())(); -} -// Annotate the CommonJS export names for ESM import in node: -0 && (module.exports = { - GoogleSpreadsheet -}); -//# sourceMappingURL=main.js.map diff --git a/build/main.js.map b/build/main.js.map deleted file mode 100644 index 2c5b942..0000000 --- a/build/main.js.map +++ /dev/null @@ -1,7 +0,0 @@ -{ - "version": 3, - "sources": ["../src/main.ts"], - "sourcesContent": ["import * as utils from '@iobroker/adapter-core';\n\nimport { SpreadsheetUtils } from './lib/google';\nimport {\n handleAppend,\n handleDeleteRows,\n handleCreateSheet,\n handleDeleteSheet,\n handleDeleteSheets,\n handleDuplicateSheet,\n handleUpload,\n handleWriteCell,\n handleWriteCells,\n handleReadCell,\n handleReadCells,\n} from './lib/messageHandlers/index';\n\n/**\n * The adapter class\n */\nclass GoogleSpreadsheet extends utils.Adapter {\n private spreadsheet: SpreadsheetUtils;\n\n /**\n * Creates an instance of the adapter class.\n *\n * @param options The adapter options\n */\n public constructor(options: Partial = {}) {\n super({\n ...options,\n name: 'google-spreadsheet',\n });\n this.on('ready', this.onReady.bind(this));\n this.on('message', this.onMessage.bind(this));\n this.on('unload', this.onUnload.bind(this));\n this.spreadsheet = new SpreadsheetUtils(this.config, this.log);\n }\n\n private migrateSpreadhseetIdToTableIfNeeded(): void {\n if (\n this.config.spreadsheetId &&\n this.config.spreadsheetId.length > 0 &&\n (!this.config.spreadsheets || this.config.spreadsheets.length === 0)\n ) {\n this.log.info(`Migrating spreadsheetId ${this.config.spreadsheetId} to spreadsheets table`);\n this.config.spreadsheets = [\n {\n spreadsheetId: this.config.spreadsheetId,\n alias: 'default',\n isDefault: true,\n },\n ];\n this.config.spreadsheetId = '';\n this.extendForeignObject(`system.adapter.${this.name}.${this.instance}`, { native: this.config }, () => {\n this.log.info('Migration completed');\n });\n }\n }\n /**\n * Is called when databases are connected and adapter received configuration.\n */\n private async onReady(): Promise {\n // Initialize your adapter here\n this.migrateSpreadhseetIdToTableIfNeeded();\n\n if (this.config.privateKey && this.config.serviceAccountEmail && this.config.spreadsheets.length > 0) {\n await this.setState('info.connection', true, true);\n this.log.info('Google-spreadsheet adapter configured');\n } else {\n await this.setState('info.connection', false, true);\n this.log.warn('Google-spreadsheet adapter not configured');\n }\n await this.encryptPrivateKeyIfNeeded();\n\n this.spreadsheet = new SpreadsheetUtils(this.config, this.log);\n }\n\n private async encryptPrivateKeyIfNeeded(): Promise {\n if (this.config.privateKey && this.config.privateKey.length > 0) {\n await this.getForeignObjectAsync(`system.adapter.${this.name}.${this.instance}`).then(data => {\n if (data && data.native && data.native.privateKey && !data.native.privateKey.startsWith('$/aes')) {\n this.config.privateKey = data.native.privateKey;\n data.native.privateKey = this.encrypt(data.native.privateKey);\n this.extendForeignObject(`system.adapter.${this.name}.${this.instance}`, data)\n .then(() => {\n this.log.info('privateKey is stored now encrypted');\n })\n .catch(err => {\n this.log.error(`Cannot store encrypted privateKey: ${err}`);\n });\n }\n });\n }\n }\n\n /**\n * Is called when adapter shuts down - callback has to be called under any circumstances!\n *\n * @param callback Callback so the adapter can shut down\n */\n private onUnload(callback: () => void): void {\n try {\n callback();\n } catch (e) {\n this.log.error(`Error during unload: ${JSON.stringify(e)}`);\n callback();\n }\n }\n\n /**\n * Some message was sent to this instance over message box. Used by email, pushover, text2speech, ...\n * Using this method requires \"common.messagebox\" property to be set to true in io-package.json\n *\n * @param obj The message object\n */\n private onMessage(obj: ioBroker.Message): void {\n const handlers = {\n append: { handler: handleAppend, logMessage: 'append to spreadsheet' },\n deleteRows: { handler: handleDeleteRows, logMessage: 'delete rows from spreadsheet' },\n createSheet: { handler: handleCreateSheet, logMessage: 'create sheet' },\n deleteSheet: { handler: handleDeleteSheet, logMessage: 'delete sheet' },\n deleteSheets: { handler: handleDeleteSheets, logMessage: 'delete sheets' },\n duplicateSheet: { handler: handleDuplicateSheet, logMessage: 'duplicate sheet' },\n upload: { handler: handleUpload, logMessage: 'upload file' },\n writeCell: { handler: handleWriteCell, logMessage: 'write cell' },\n writeCells: { handler: handleWriteCells, logMessage: 'write cells' },\n readCell: { handler: handleReadCell, logMessage: 'read cell' },\n readCells: { handler: handleReadCells, logMessage: 'read cells' },\n };\n\n this.log.debug(`Received message: ${JSON.stringify(obj)}`);\n if (typeof obj === 'object' && obj.message) {\n if (obj.command && obj.command in handlers) {\n const command = obj.command as keyof typeof handlers;\n this.log.debug(handlers[command].logMessage);\n handlers[command]\n .handler(this.spreadsheet, this.log, obj)\n .then((result: any) => {\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, result ? result : 'Message received', obj.callback);\n }\n })\n .catch((error: Error) => {\n this.log.error(`Cannot ${obj.command}: ${error}`);\n if (obj.callback) {\n this.sendTo(obj.from, obj.command, { error: error.message }, obj.callback);\n }\n });\n } else {\n this.log.warn(`unknown command: ${obj.command}`);\n }\n }\n }\n}\n\nexport { GoogleSpreadsheet };\n\nif (require.main !== module) {\n module.exports = (options: Partial | undefined) => new GoogleSpreadsheet(options);\n module.exports.GoogleSpreadsheet = GoogleSpreadsheet;\n} else {\n (() => new GoogleSpreadsheet())();\n}\n"], - "mappings": "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", - "names": [] -} From 52b65cf77ff94610a44394dfe3e6bbab226ed90f Mon Sep 17 00:00:00 2001 From: Thomas Pohl Date: Sat, 16 May 2026 07:19:55 +0200 Subject: [PATCH 3/6] lint errors --- src/lib/messageHandlers/cellHandlers.ts | 1 - test/unit/messageHandlers/readCells.test.ts | 11 ++++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/lib/messageHandlers/cellHandlers.ts b/src/lib/messageHandlers/cellHandlers.ts index bb7fedd..4bc96a5 100644 --- a/src/lib/messageHandlers/cellHandlers.ts +++ b/src/lib/messageHandlers/cellHandlers.ts @@ -143,4 +143,3 @@ export function handleReadCell( } return spreadsheet.readCell(sheet, cell, alias); } - diff --git a/test/unit/messageHandlers/readCells.test.ts b/test/unit/messageHandlers/readCells.test.ts index 64cb25a..dcc8d8c 100644 --- a/test/unit/messageHandlers/readCells.test.ts +++ b/test/unit/messageHandlers/readCells.test.ts @@ -1,4 +1,3 @@ - import { handleReadCells } from '../../../src/lib/messageHandlers/cellHandlers.ts'; import sinon from 'sinon'; import { expect } from 'chai'; @@ -9,7 +8,10 @@ describe('handleReadCells', () => { beforeEach(() => { spreadsheet = { - readCells: sinon.stub().resolves([[1, 2], [3, 4]]), + readCells: sinon.stub().resolves([ + [1, 2], + [3, 4], + ]), }; log = { error: sinon.stub(), warn: sinon.stub() }; }); @@ -18,7 +20,10 @@ describe('handleReadCells', () => { const message = { message: { sheet: 'Tabelle1', range: 'A1:B2' } }; const result = await handleReadCells(spreadsheet, log, message); sinon.assert.calledWith(spreadsheet.readCells, 'Tabelle1', 'A1:B2', undefined); - expect(result).to.deep.equal([[1, 2], [3, 4]]); + expect(result).to.deep.equal([ + [1, 2], + [3, 4], + ]); }); it('should reject if parameters are missing', async () => { From 1ee5c467b83a2974c0962c58e433f656b0e824cf Mon Sep 17 00:00:00 2001 From: Thomas Pohl Date: Sat, 16 May 2026 07:26:21 +0200 Subject: [PATCH 4/6] Add Changelog for readCells --- README.md | 1 + io-package.json | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index deb4719..44a749f 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,7 @@ Make sure the Service Account has adequate permissions to write to the spreadshe ### **WORK IN PROGRESS** --> ### **WORK IN PROGRESS** +- (Thomas Pohl) Added readCells feature: Read multiple cells in one call using A1 notation (e.g. A1:B10), including Blockly block and documentation. - (copilot) Adapter requires node.js >= 22 now ### 1.0.1 (2026-02-16) diff --git a/io-package.json b/io-package.json index ce10c57..4623ecc 100644 --- a/io-package.json +++ b/io-package.json @@ -1,8 +1,11 @@ { "common": { "name": "google-spreadsheet", - "version": "1.0.1", + "version": "1.1.0", "news": { + "1.1.0": { + "en": "Added readCells feature: Read multiple cells in one call using A1 notation (e.g. A1:B10), including Blockly block and documentation." + }, "1.0.1": { "en": "Fix for admin ui", "de": "Fix für admin ui", From af4fcd231c16d744b4464ac4fc08e7f4bc3c94be Mon Sep 17 00:00:00 2001 From: Thomas Pohl Date: Sat, 16 May 2026 07:31:03 +0200 Subject: [PATCH 5/6] remove unused file --- .../workflows/dependabot-auto-merge.yml.OLD | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 .github/workflows/dependabot-auto-merge.yml.OLD diff --git a/.github/workflows/dependabot-auto-merge.yml.OLD b/.github/workflows/dependabot-auto-merge.yml.OLD deleted file mode 100644 index 393f6c8..0000000 --- a/.github/workflows/dependabot-auto-merge.yml.OLD +++ /dev/null @@ -1,27 +0,0 @@ -# Automatically merge Dependabot PRs when version comparison is within the range -# that is configured in .github/auto-merge.yml - -name: Auto-Merge Dependabot PRs - -on: - # WARNING: This needs to be run in the PR base, DO NOT build untrusted code in this action - # details under https://github.blog/changelog/2021-02-19-github-actions-workflows-triggered-by-dependabot-prs-will-run-with-read-only-permissions/ - pull_request_target: - -jobs: - auto-merge: - if: github.actor == 'dependabot[bot]' - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v6 - - - name: Check if PR should be auto-merged - uses: ahmadnassri/action-dependabot-auto-merge@v2 - with: - # In order to use this, you need to go to https://github.com/settings/tokens and - # create a Personal Access Token with the permission "public_repo". - # Enter this token in your repository settings under "Secrets" and name it AUTO_MERGE_TOKEN - github-token: ${{ secrets.AUTO_MERGE_TOKEN }} - # By default, squash and merge, so Github chooses nice commit messages - command: squash and merge From 615fe463d51091f95cccc5de029c7fcec8e35fee Mon Sep 17 00:00:00 2001 From: Thomas Pohl Date: Sat, 16 May 2026 07:32:41 +0200 Subject: [PATCH 6/6] Update version --- io-package.json | 12 +++++++++++- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/io-package.json b/io-package.json index 4623ecc..1979cb5 100644 --- a/io-package.json +++ b/io-package.json @@ -4,7 +4,17 @@ "version": "1.1.0", "news": { "1.1.0": { - "en": "Added readCells feature: Read multiple cells in one call using A1 notation (e.g. A1:B10), including Blockly block and documentation." + "en": "Added readCells feature: Read multiple cells in one call using A1 notation (e.g. A1:B10), including Blockly block and documentation.", + "de": "Funktion „readCells“ hinzugefügt: Lesen mehrerer Zellen in einem Aufruf mithilfe der A1-Notation (z. B. A1:B10), einschließlich Blockly-Block und Dokumentation.", + "ru": "Добавлена ​​функция readCells: чтение нескольких ячеек за один вызов с использованием нотации A1 (например, A1:B10), включая блок Blockly и документацию.", + "pt": "Adicionado recurso readCells: leia várias células em uma chamada usando a notação A1 (por exemplo, A1: B10), incluindo bloco Blockly e documentação.", + "nl": "Toegevoegde readCells-functie: lees meerdere cellen in één aanroep met behulp van A1-notatie (bijvoorbeeld A1:B10), inclusief Blockly-blok en documentatie.", + "fr": "Ajout de la fonctionnalité readCells : lisez plusieurs cellules en un seul appel en utilisant la notation A1 (par exemple A1:B10), y compris le bloc Blockly et la documentation.", + "it": "Aggiunta la funzionalità readCells: leggi più celle in una chiamata utilizzando la notazione A1 (ad esempio A1:B10), incluso il blocco Blockly e la documentazione.", + "es": "Se agregó la función readCells: lea varias celdas en una llamada usando la notación A1 (por ejemplo, A1:B10), incluido el bloque Blockly y la documentación.", + "pl": "Dodano funkcję readCells: Odczyt wielu komórek w jednym wywołaniu przy użyciu notacji A1 (np. A1:B10), łącznie z blokiem Blockly i dokumentacją.", + "uk": "Додано функцію readCells: читайте кілька клітинок за один виклик, використовуючи нотацію A1 (наприклад, A1:B10), включаючи блок Blockly і документацію.", + "zh-cn": "添加了 readCells 功能:使用 A1 表示法(例如 A1:B10)在一次调用中读取多个单元格,包括 Blockly 块和文档。" }, "1.0.1": { "en": "Fix for admin ui", diff --git a/package-lock.json b/package-lock.json index 9557acf..10424af 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "iobroker.google-spreadsheet", - "version": "1.0.1", + "version": "1.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "iobroker.google-spreadsheet", - "version": "1.0.1", + "version": "1.1.0", "license": "Apache-2.0", "dependencies": { "@iobroker/adapter-core": "^3.3.2", diff --git a/package.json b/package.json index 89b0443..2e81001 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iobroker.google-spreadsheet", - "version": "1.0.1", + "version": "1.1.0", "description": "Adapter for io broker to work with google sheets", "author": { "name": "Thomas Pohl",