Add Activepieces integration for workflow automation

- Add Activepieces fork with SmoothSchedule custom piece
- Create integrations app with Activepieces service layer
- Add embed token endpoint for iframe integration
- Create Automations page with embedded workflow builder
- Add sidebar visibility fix for embed mode
- Add list inactive customers endpoint to Public API
- Include SmoothSchedule triggers: event created/updated/cancelled
- Include SmoothSchedule actions: create/update/cancel events, list resources/services/customers

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
poduck
2025-12-18 22:59:37 -05:00
parent 9848268d34
commit 3aa7199503
16292 changed files with 1284892 additions and 4708 deletions

View File

@@ -0,0 +1,18 @@
{
"extends": ["../../../../.eslintrc.json"],
"ignorePatterns": ["!**/*"],
"overrides": [
{
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
"rules": {}
},
{
"files": ["*.ts", "*.tsx"],
"rules": {}
},
{
"files": ["*.js", "*.jsx"],
"rules": {}
}
]
}

View File

@@ -0,0 +1,7 @@
# pieces-microsoft-excel-365
This library was generated with [Nx](https://nx.dev).
## Building
Run `nx build pieces-microsoft-excel-365` to build the library.

View File

@@ -0,0 +1,4 @@
{
"name": "@activepieces/piece-microsoft-excel-365",
"version": "0.1.2"
}

View File

@@ -0,0 +1,57 @@
{
"name": "pieces-microsoft-excel-365",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/microsoft-excel-365/src",
"projectType": "library",
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": [
"{options.outputPath}"
],
"options": {
"outputPath": "dist/packages/pieces/community/microsoft-excel-365",
"tsConfig": "packages/pieces/community/microsoft-excel-365/tsconfig.lib.json",
"packageJson": "packages/pieces/community/microsoft-excel-365/package.json",
"main": "packages/pieces/community/microsoft-excel-365/src/index.ts",
"assets": [
"packages/pieces/community/microsoft-excel-365/*.md",
{
"input": "packages/pieces/community/microsoft-excel-365/src/i18n",
"output": "./src/i18n",
"glob": "**/!(i18n.json)"
}
],
"buildableProjectDepsInPackageJsonType": "dependencies",
"updateBuildableProjectDepsInPackageJson": true
},
"dependsOn": [
"^build",
"prebuild"
]
},
"publish": {
"command": "node tools/scripts/publish.mjs pieces-microsoft-excel-365 {args.ver} {args.tag}",
"dependsOn": [
"build"
]
},
"lint": {
"executor": "@nx/eslint:lint",
"outputs": [
"{options.outputFile}"
]
},
"prebuild": {
"executor": "nx:run-commands",
"options": {
"cwd": "packages/pieces/community/microsoft-excel-365",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
},
"tags": []
}

View File

@@ -0,0 +1,92 @@
{
"Microsoft Excel 365": "Microsoft Excel 365",
"Spreadsheet software by Microsoft": "Spreadsheet software by Microsoft",
"Authentication for Microsoft Excel 365": "Authentication for Microsoft Excel 365",
"Append Row to Worksheet": "Append Row to Worksheet",
"Get Worksheets": "Get Worksheets",
"Get Worksheet Rows": "Get Worksheet Rows",
"Update Worksheet Rows": "Update Worksheet Rows",
"Clear Worksheet": "Clear Worksheet",
"Delete Worksheet": "Delete Worksheet",
"Get Workbooks": "Get Workbooks",
"Delete Workbook": "Delete Workbook",
"Add a Worksheet to a Workbook": "Add a Worksheet to a Workbook",
"Get Table Rows": "Get Table Rows",
"Get Table Columns": "Get Table Columns",
"Create Table": "Create Table",
"Delete Table": "Delete Table",
"Lookup Table Column": "Lookup Table Column",
"Append Rows to a Table": "Append Rows to a Table",
"Convert to Range": "Convert to Range",
"Custom API Call": "Custom API Call",
"Append row of values to a worksheet": "Append row of values to a worksheet",
"Retrieve worksheets from a workbook": "Retrieve worksheets from a workbook",
"Retrieve rows from a worksheet": "Retrieve rows from a worksheet",
"Update a row in a worksheet": "Update a row in a worksheet",
"Clear a worksheet": "Clear a worksheet",
"Delete a worksheet in a workbook": "Delete a worksheet in a workbook",
"Retrieve a list of workbooks": "Retrieve a list of workbooks",
"Delete a workbook": "Delete a workbook",
"Add a worksheet to a workbook": "Add a worksheet to a workbook",
"List rows of a table in a worksheet": "List rows of a table in a worksheet",
"List columns of a table in a worksheet": "List columns of a table in a worksheet",
"Create a table in a worksheet": "Create a table in a worksheet",
"Delete a table from a worksheet": "Delete a table from a worksheet",
"Lookup a value in a table column in a worksheet": "Lookup a value in a table column in a worksheet",
"Append rows to a table": "Append rows to a table",
"Converts a table to a range": "Converts a table to a range",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Workbook": "Workbook",
"Worksheet": "Worksheet",
"Does the first row contain headers?": "Does the first row contain headers?",
"Values": "Values",
"Return All": "Return All",
"Limit": "Limit",
"Range": "Range",
"Header Row": "Header Row",
"First Data Row": "First Data Row",
"Row number": "Row number",
"Worksheet Name": "Worksheet Name",
"Table": "Table",
"Select Range": "Select Range",
"Has Headers": "Has Headers",
"Lookup Column": "Lookup Column",
"Lookup Value": "Lookup Value",
"Return All Matches": "Return All Matches",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"If the first row is headers": "If the first row is headers",
"The values to insert": "The values to insert",
"If checked, all worksheets will be returned": "If checked, all worksheets will be returned",
"Limit the number of worksheets returned": "Limit the number of worksheets returned",
"Range of the rows to retrieve (e.g., A2:B2)": "Range of the rows to retrieve (e.g., A2:B2)",
"Row number of the header": "Row number of the header",
"Row number of the first data row": "Row number of the first data row",
"The row number to update": "The row number to update",
"The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet": "The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet",
"Limits the number of workbooks returned, returns all workbooks if empty": "Limits the number of workbooks returned, returns all workbooks if empty",
"The name of the new worksheet": "The name of the new worksheet",
"Limit the number of rows retrieved": "Limit the number of rows retrieved",
"Limit the number of columns retrieved": "Limit the number of columns retrieved",
"How to select the range for the table": "How to select the range for the table",
"The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table": "The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table",
"Whether the range has column labels": "Whether the range has column labels",
"The column name to lookup the value in": "The column name to lookup the value in",
"The value to lookup": "The value to lookup",
"If checked, all matching rows will be returned": "If checked, all matching rows will be returned",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Row": "New Row",
"Trigger when a new row is added, and it can include existing rows as well.": "Trigger when a new row is added, and it can include existing rows as well.",
"Max Rows to Poll": "Max Rows to Poll",
"The maximum number of rows to poll, the rest will be polled on the next run.": "The maximum number of rows to poll, the rest will be polled on the next run."
}

View File

@@ -0,0 +1,148 @@
{
"Spreadsheet software by Microsoft": "Tabellensoftware von Microsoft",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add ": "\n1. Melden Sie sich bei [Microsoft Azure Portal](https://portal.azure.com/).\n. Von der linken Seitenleiste gehen Sie zur **Microsoft Enfra ID**.\n3. Unter **Verwalten** klicken Sie auf **App-Registrierungen**.\n4. Klicken Sie auf die **Neue Registrierung** Schaltfläche.\n5. Geben Sie einen **Name** für Ihre App ein.\n6. Für **unterstützte Kontotypen**, auswählen:\n - **Konten in jedem Organisationsverzeichnis (jeder Microsoft-Entra-ID-Mieter - Multitenant) und persönlichen Microsoft-Konten**\n - Oder wählen Sie nach Ihren Anforderungen aus.\n7. In **Umleitungs-URI** wählen Sie **Web** und fügen Sie die angegebene URL hinzu.\n8. Klicken Sie auf **Registrieren**.\n9. Nach der Registrierung werden Sie zur Übersichtsseite der App weitergeleitet. Kopieren Sie die **Application (Client) ID**.\n10. Vom linken Menü gehen Sie zu **Zertifikate & Geheimnisse**.\n - Unter **Kundengeheimnis**, klicke **Neues Kundengeheimnis**.\n - Geben Sie eine Beschreibung an, setzen Sie ein Ablaufdatum und klicken Sie auf **Hinzufügen**.\n - Kopieren Sie den **Wert** des Client-Geheimnisses (dies wird nicht wieder angezeigt).\n11. Gehe zu **API Berechtigungen** vom linken Menü.\n - Klicke **Berechtigung hinzufügen**.\n - Wählen Sie **Microsoft Graph** → **delegierte Berechtigungen**.\n - Fügen Sie folgende Bereiche hinzu:\n - Dateien. eadWrite\n - offline_access \n - Klicken Sie auf **Berechtigungen hinzufügen**.\n12. Kopieren Sie Ihre **Client-ID** und **Client-Geheimnis**.\n",
"Append Row to Worksheet": "Zeile an Arbeitsblatt anhängen",
"Get Worksheets": "Arbeitsblätter abrufen",
"Get Worksheet Rows": "Arbeitsblatt Zeilen abrufen",
"Update Worksheet Rows": "Arbeitsblatt Zeilen aktualisieren",
"Clear Worksheet": "Arbeitsblatt löschen",
"Delete Worksheet": "Arbeitsblatt löschen",
"Get Workbooks": "Arbeitsbücher abrufen",
"Delete Workbook": "Arbeitsbuch löschen",
"Add a Worksheet to a Workbook": "Ein Arbeitsblatt zu einem Arbeitsbuch hinzufügen",
"Get Table Rows": "Tabellenzeile erhalten",
"Get Table Columns": "Tabellenspalten erhalten",
"Create Table": "Tabelle erstellen",
"Delete Table": "Tabelle löschen",
"Lookup Table Column": "Tabellenspalte suchen",
"Append Rows to a Table": "Zeilen an einen Tisch anhängen",
"Convert to Range": "In Bereich umwandeln",
"Create Workbook": "Arbeitsbuch erstellen",
"Clear Column by Index": "Spalte nach Index löschen",
"Clear Cells by Range": "Lösche Zellen nach Reichweite",
"Clear Row by ID": "Zeile durch ID löschen",
"Create Worksheet": "Arbeitsblatt erstellen",
"Find Row": "Finde Zeile",
"Get Cells in Range": "Hol dir Zellen in Reichweite",
"Get Row by ID": "Zeile per ID erhalten",
"Get Worksheet by ID": "Arbeitsblatt über ID abrufen",
"Rename Worksheet": "Arbeitsblatt umbenennen",
"Custom API Call": "Eigener API-Aufruf",
"Append row of values to a worksheet": "Füge eine Zeile von Werten zu einer Tabelle hinzu",
"Retrieve worksheets from a workbook": "Arbeitsblätter aus einem Arbeitsbuch abrufen",
"Retrieve rows from a worksheet": "Datensätze von einem Arbeitsblatt abrufen",
"Update a row in a worksheet": "Eine Zeile in einer Tabelle aktualisieren",
"Clear a worksheet": "Arbeitsblatt leeren",
"Delete a worksheet in a workbook": "Arbeitsblatt in einem Arbeitsbuch löschen",
"Retrieve a list of workbooks": "Liste der Arbeitsbücher abrufen",
"Delete a workbook": "Ein Arbeitsbuch löschen",
"Add a worksheet to a workbook": "Ein Arbeitsblatt zu einem Arbeitsbuch hinzufügen",
"List rows of a table in a worksheet": "Datensätze einer Tabelle in einer Tabelle auflisten",
"List columns of a table in a worksheet": "Spalten einer Tabelle in einer Tabelle auflisten",
"Create a table in a worksheet": "Tabelle in einer Tabelle erstellen",
"Delete a table from a worksheet": "Tabelle aus Arbeitsblatt löschen",
"Lookup a value in a table column in a worksheet": "Suche einen Wert in einer Tabellenspalte in einem Arbeitsblatt",
"Append rows to a table": "Zeilen an eine Tabelle anhängen",
"Converts a table to a range": "Konvertiert eine Tabelle in einen Bereich",
"Create a new workbook at the specified location": "Neues Arbeitsbuch an dem angegebenen Ort erstellen",
"Clear contents/formatting of a column by its index.": "Lösche Inhalte/Formatierung einer Spalte nach ihrem Index.",
"Clear a block of cells (range) content or formatting.": "Lösche einen Block von Zellen (Bereich) Inhalt oder Formatierung.",
"Clear contents/formatting of an entire row by its ID.": "Lösche Inhalte/Formatierung eines ganzen Datensatzes mit seiner ID.",
"Add a new worksheet (tab) to an existing workbook with optional default headers.": "Fügen Sie ein neues Arbeitsblatt (Tab) zu einem bestehenden Arbeitsbuch mit optionalen Headern hinzu.",
"Locate a row by specifying a lookup column and value (e.g. find a row where “ID” = 123).": "Suchen Sie eine Zeile, indem Sie eine Spalte und einen Wert angeben (z.B. finden Sie eine Zeile, in der „ID“ = 123).",
"Retrieve the values in a given cell range (e.g., “A1:C10”).": "Rufen Sie die Werte in einem vorgegebenen Zellbereich ab (z.B. „A1:C10“).",
"  Retrieve the entire content of a row by its row ID.": " Ruft den gesamten Inhalt einer Zeile nach ihrer Zeilennummer ab.",
"Retrieve metadata of a worksheet by its ID.": "Abrufen von Metadaten eines Arbeitsblatts durch seine ID.",
"Change the name of an existing worksheet.": "Ändern Sie den Namen einer vorhandenen Tabelle.",
"Make a custom API call to a specific endpoint": "Einen benutzerdefinierten API-Aufruf an einen bestimmten Endpunkt machen",
"Workbook": "Arbeitsbuch",
"Worksheet": "Arbeitsblatt",
"Does the first row contain headers?": "Enthält die erste Zeile Kopfzeilen?",
"Values": "Werte",
"Return All": "Alle zurückgeben",
"Limit": "Limit",
"Range": "Range",
"Header Row": "Kopfzeile",
"First Data Row": "Erste Datenzeile",
"Row number": "Zeilennummer",
"Worksheet Name": "Arbeitsblattname",
"Table": "Tisch",
"Select Range": "Bereich auswählen",
"Has Headers": "Hat Kopfzeilen",
"Lookup Column": "Spalte suchen",
"Lookup Value": "Suchwert",
"Return All Matches": "Alle Matches zurückgeben",
"Name": "Name",
"Parent Folder": "Eltern-Ordner",
"Column Index": "Spaltenindex",
"Clear Type": "Typ löschen",
"Row Number": "Zeilennummer",
"Headers": "Kopfzeilen",
"Row ID (Index)": "Zeilennummer (Index)",
"New Worksheet Name": "Neuer Arbeitsblattname",
"Method": "Methode",
"Query Parameters": "Abfrageparameter",
"Body": "Körper",
"Response is Binary ?": "Antwort ist binär?",
"No Error on Failure": "Kein Fehler bei Fehler",
"Timeout (in seconds)": "Timeout (in Sekunden)",
"If the first row is headers": "Wenn die erste Zeile Kopfzeilen ist",
"The values to insert": "Die einzufügenden Werte",
"If checked, all worksheets will be returned": "Wenn aktiviert, werden alle Arbeitsblätter zurückgegeben",
"Limit the number of worksheets returned": "Anzahl der zurückgegebenen Arbeitsblätter begrenzen",
"Range of the rows to retrieve (e.g., A2:B2)": "Bereich der zu holenden Zeilen (z.B. A2:B2)",
"Row number of the header": "Zeilennummer der Kopfzeile",
"Row number of the first data row": "Zeilennummer der ersten Datenzeile",
"The row number to update": "Die zu aktualisierende Zeilennummer",
"The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet": "Der Bereich in der Schreibweise A1 (z. B. A2:B2), um in der Tabelle zu löschen, falls nicht vorhanden, löschen Sie das gesamte Arbeitsblatt",
"Limits the number of workbooks returned, returns all workbooks if empty": "Begrenzt die Anzahl der zurückgegebenen Arbeitsbücher zurück, gibt alle Arbeitsbücher zurück, wenn leer",
"The name of the new worksheet": "Der Name des neuen Arbeitsblatts",
"Limit the number of rows retrieved": "Anzahl der abgerufenen Zeilen begrenzen",
"Limit the number of columns retrieved": "Anzahl der abgerufenen Spalten begrenzen",
"How to select the range for the table": "Auswahl des Bereichs für die Tabelle",
"The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table": "Der Bereich der Zellen in A1-Notation (z. B. A2:B2), die in eine Tabelle konvertiert werden",
"Whether the range has column labels": "Gibt an, ob der Bereich Spaltenbezeichnungen hat",
"The column name to lookup the value in": "Der Spaltenname für die Suche nach dem Wert in",
"The value to lookup": "Der zu durchsuchende Wert",
"If checked, all matching rows will be returned": "Wenn aktiviert, werden alle übereinstimmenden Zeilen zurückgegeben",
"The name of the new workbook": "Der Name des neuen Arbeitsbuchs",
"The parent folder to use": "Der zu verwendende übergeordnete Ordner",
"The 1-based index of the column to be cleared (e.g., 1 for column A, 2 for column B).": "Der 1-basierte Index der zu löschenden Spalte (z.B. 1 für Spalte A, 2 für Spalte B).",
"Specify what to clear from the column.": "Legen Sie fest, was aus der Spalte zu löschen ist.",
"The range of cells to clear, in A1 notation (e.g., \"A1:C5\").": "Der Bereich der Zellen zu löschen, in A1 Notation (z. B. \"A1:C5\").",
"Specify what to clear from the range.": "Legen Sie fest, was aus dem Bereich zu löschen ist.",
"The number of the row to be cleared (e.g., 5 for the 5th row).": "Die Anzahl der zu löschenden Zeilen (z.B. 5 für die 5. Zeile).",
"Specify what to clear from the row.": "Legen Sie fest, was aus der Zeile zu löschen ist.",
"The name for the new worksheet. If not provided, a default name like 'Sheet1' will be assigned.": "Der Name für das neue Arbeitsblatt. Falls nicht angegeben wird, wird ein Standardname wie 'Sheet1' zugewiesen.",
"Optional: A list of headers to add to the first row. A table will be created from these headers.": "Optional: Eine Liste von Kopfzeilen, die zur ersten Zeile hinzugefügt werden sollen. Eine Tabelle wird aus diesen Kopfzeilen erstellt.",
"The column to search in.": "Die Spalte in der gesucht werden soll.",
"The value to find in the lookup column.": "Der Wert, der in der Suchspalte zu finden ist.",
"The range of cells to retrieve, in A1 notation (e.g., \"A1:C10\").": "Der Bereich der Zellen, die in A1-Notation abgerufen werden sollen (z.B. \"A1:C10\").",
"The zero-based index of the row to retrieve (e.g., 0 for the first row, 1 for the second).": "Der null-basierte Index der zu holenden Zeile (z.B. 0 für die erste Zeile, 1 für die zweite Zeile).",
"\nThe new name for the worksheet. The name must adhere to the following rules:\n- Cannot be blank.\n- Cannot exceed 31 characters.\n- Must not contain any of the following characters: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- The name \"History\" is reserved by Excel and cannot be used.\n": "\nDer neue Name für das Arbeitsblatt. Der Name muss die folgenden Regeln beachten:\n- darf nicht leer sein.\n- 31 Zeichen nicht überschreiten.\n- Darf keine der folgenden Zeichen enthalten: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- Der Name \"History\" ist von Excel reserviert und kann nicht verwendet werden.\n",
"Authorization headers are injected automatically from your connection.": "Autorisierungs-Header werden automatisch von Ihrer Verbindung injiziert.",
"Enable for files like PDFs, images, etc..": "Aktivieren für Dateien wie PDFs, Bilder, etc..",
"All (Contents and Formatting)": "Alle (Inhalt und Formatierung)",
"Contents Only": "Nur Inhalte",
"Formats Only": "Nur Formate",
"GET": "ERHALTEN",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "LÖSCHEN",
"HEAD": "HEAD",
"New Row": "Neue Zeile",
"New Row in Table": "Neue Zeile in Tabelle",
"New Worksheet": "Neues Arbeitsblatt",
"Updated Row": "Aktualisierte Zeile",
"Trigger when a new row is added, and it can include existing rows as well.": "Wird ausgelöst, wenn eine neue Zeile hinzugefügt wird, und kann auch vorhandene Datensätze enthalten.",
"Fires when a new row is added to a table within a worksheet.": "Feuert ab, wenn eine neue Zeile einer Tabelle innerhalb einer Tabelle hinzugefügt wird.",
"Fires when a new worksheet is created in a workbook.": "Feuert ab, wenn ein neues Arbeitsblatt in einem Arbeitsbuch erstellt wird.",
"Fires when a row (in a worksheet) is added or updated.": "Feuert ab, wenn eine Zeile (in einem Arbeitsblatt) hinzugefügt oder aktualisiert wird.",
"Max Rows to Poll": "Max. Zeilen zur Abfrage",
"My table has headers": "Meine Tabelle hat Kopfzeilen",
"First row has headers": "Erste Zeile hat Kopfzeilen",
"The maximum number of rows to poll, the rest will be polled on the next run.": "Die maximale Anzahl der zu befragenden Zeilen, der Rest wird beim nächsten Lauf befragt.",
"Enable this if the first row of your table is a header row.": "Aktivieren Sie dies, wenn die erste Zeile Ihrer Tabelle eine Kopfzeile ist.",
"Enable this if the first row of your worksheet should be treated as headers.": "Aktivieren Sie dies, wenn die erste Zeile Ihres Arbeitsblatts als Header behandelt werden soll."
}

View File

@@ -0,0 +1,148 @@
{
"Spreadsheet software by Microsoft": "Software de hoja de cálculo por Microsoft",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add ": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - Files.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Append Row to Worksheet": "Añadir fila a la hoja de trabajo",
"Get Worksheets": "Obtener hojas de trabajo",
"Get Worksheet Rows": "Obtener filas de hojas de trabajo",
"Update Worksheet Rows": "Actualizar Filas de Hoja de Trabajo",
"Clear Worksheet": "Limpiar hoja de trabajo",
"Delete Worksheet": "Eliminar hoja de trabajo",
"Get Workbooks": "Obtener libros de trabajo",
"Delete Workbook": "Eliminar Libro de Trabajo",
"Add a Worksheet to a Workbook": "Añadir una hoja de trabajo a un libro de trabajo",
"Get Table Rows": "Obtener Arcos de Tabla",
"Get Table Columns": "Obtener columnas de tabla",
"Create Table": "Crear tabla",
"Delete Table": "Eliminar tabla",
"Lookup Table Column": "Columna de Tabla de Búsqueda",
"Append Rows to a Table": "Añadir filas a una tabla",
"Convert to Range": "Convertir a rango",
"Create Workbook": "Crear Libro de Trabajo",
"Clear Column by Index": "Limpiar columna por índice",
"Clear Cells by Range": "Limpiar celdas por rango",
"Clear Row by ID": "Limpiar fila por ID",
"Create Worksheet": "Crear hoja de trabajo",
"Find Row": "Buscar fila",
"Get Cells in Range": "Obtener celdas en el rango",
"Get Row by ID": "Obtener fila por ID",
"Get Worksheet by ID": "Obtener Hoja de Trabajo por ID",
"Rename Worksheet": "Renombrar hoja de trabajo",
"Custom API Call": "Llamada API personalizada",
"Append row of values to a worksheet": "Añadir fila de valores a una hoja de trabajo",
"Retrieve worksheets from a workbook": "Recuperar hojas de trabajo de un libro",
"Retrieve rows from a worksheet": "Recuperar filas de una hoja de trabajo",
"Update a row in a worksheet": "Actualizar una fila en una hoja de trabajo",
"Clear a worksheet": "Limpiar una hoja de trabajo",
"Delete a worksheet in a workbook": "Eliminar una hoja de trabajo en un libro",
"Retrieve a list of workbooks": "Recuperar una lista de libros de trabajo",
"Delete a workbook": "Eliminar un libro",
"Add a worksheet to a workbook": "Añadir una hoja de trabajo a un libro",
"List rows of a table in a worksheet": "Listar filas de una tabla en una hoja de trabajo",
"List columns of a table in a worksheet": "Listar columnas de una tabla en una hoja de trabajo",
"Create a table in a worksheet": "Crear una tabla en una hoja de trabajo",
"Delete a table from a worksheet": "Eliminar una tabla de una hoja de trabajo",
"Lookup a value in a table column in a worksheet": "Buscar un valor en una columna de tabla en una hoja de trabajo",
"Append rows to a table": "Añadir filas a una tabla",
"Converts a table to a range": "Convierte una tabla a un rango",
"Create a new workbook at the specified location": "Crear un nuevo libro en la ubicación especificada",
"Clear contents/formatting of a column by its index.": "Elimina el contenido/formato de una columna por su índice.",
"Clear a block of cells (range) content or formatting.": "Elimina un bloque de contenido o formato de celdas (rango).",
"Clear contents/formatting of an entire row by its ID.": "Elimina el contenido/formato de una fila entera por su ID.",
"Add a new worksheet (tab) to an existing workbook with optional default headers.": "Añadir una nueva hoja de trabajo (pestaña) a un libro de trabajo existente con cabeceras predeterminadas opcionales.",
"Locate a row by specifying a lookup column and value (e.g. find a row where “ID” = 123).": "Busque una fila especificando una columna de búsqueda y un valor (por ejemplo, encuentre una fila donde “ID” = 123).",
"Retrieve the values in a given cell range (e.g., “A1:C10”).": "Recuperar los valores en un determinado rango de celdas (por ejemplo, “A1:C10”).",
"  Retrieve the entire content of a row by its row ID.": " Recuperar todo el contenido de una fila por su ID de fila.",
"Retrieve metadata of a worksheet by its ID.": "Recuperar metadatos de una hoja de trabajo por su ID.",
"Change the name of an existing worksheet.": "Cambiar el nombre de una hoja de trabajo existente.",
"Make a custom API call to a specific endpoint": "Hacer una llamada API personalizada a un extremo específico",
"Workbook": "Libro de trabajo",
"Worksheet": "Hoja de trabajo",
"Does the first row contain headers?": "¿La primera fila contiene cabeceras?",
"Values": "Valores",
"Return All": "Devolver todos",
"Limit": "Límite",
"Range": "Range",
"Header Row": "Fila de cabecera",
"First Data Row": "Primera fila de datos",
"Row number": "Número de fila",
"Worksheet Name": "Nombre de la hoja de trabajo",
"Table": "Tabla",
"Select Range": "Seleccionar rango",
"Has Headers": "Tiene cabeceras",
"Lookup Column": "Columna de Búsqueda",
"Lookup Value": "Valor de Búsqueda",
"Return All Matches": "Devolver todas las partidas",
"Name": "Nombre",
"Parent Folder": "Carpeta padre",
"Column Index": "Índice de columna",
"Clear Type": "Borrar tipo",
"Row Number": "Número de fila",
"Headers": "Encabezados",
"Row ID (Index)": "ID fila (índice)",
"New Worksheet Name": "Nuevo nombre de hoja de trabajo",
"Method": "Método",
"Query Parameters": "Parámetros de consulta",
"Body": "Cuerpo",
"Response is Binary ?": "¿Respuesta es binaria?",
"No Error on Failure": "No hay ningún error en fallo",
"Timeout (in seconds)": "Tiempo de espera (en segundos)",
"If the first row is headers": "Si la primera fila son cabeceras",
"The values to insert": "Los valores a insertar",
"If checked, all worksheets will be returned": "Si está marcado, todas las hojas de trabajo serán devueltas",
"Limit the number of worksheets returned": "Limitar el número de hojas de cálculo devueltas",
"Range of the rows to retrieve (e.g., A2:B2)": "Rango de las filas a recuperar (por ejemplo, A2:B2)",
"Row number of the header": "Número de fila de la cabecera",
"Row number of the first data row": "Número de fila de la primera fila de datos",
"The row number to update": "El número de fila a actualizar",
"The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet": "El rango en notación A1 (por ej., A2:B2) para limpiar en la hoja de cálculo, si no se proporciona, limpiar toda la hoja de trabajo",
"Limits the number of workbooks returned, returns all workbooks if empty": "Limita el número de libros de trabajo devueltos, devuelve todos los libros de trabajo si está vacío",
"The name of the new worksheet": "El nombre de la nueva hoja de trabajo",
"Limit the number of rows retrieved": "Limitar el número de filas recuperadas",
"Limit the number of columns retrieved": "Limitar el número de columnas recuperadas",
"How to select the range for the table": "Cómo seleccionar el rango para la tabla",
"The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table": "El rango de celdas en notación A1 (por ejemplo, A2:B2) que se convertirá en una tabla",
"Whether the range has column labels": "Si el rango tiene etiquetas de columna",
"The column name to lookup the value in": "El nombre de la columna en la que buscar el valor",
"The value to lookup": "El valor a buscar",
"If checked, all matching rows will be returned": "Si está marcado, todas las filas coincidentes serán devueltas",
"The name of the new workbook": "El nombre del nuevo libro",
"The parent folder to use": "La carpeta padre a usar",
"The 1-based index of the column to be cleared (e.g., 1 for column A, 2 for column B).": "El índice 1 basado en la columna a ser borrada (por ejemplo, 1 para la columna A, 2 para la columna B).",
"Specify what to clear from the column.": "Especifique qué borrar de la columna.",
"The range of cells to clear, in A1 notation (e.g., \"A1:C5\").": "El rango de células a limpiar, en notación A1 (por ejemplo, \"A1:C5\").",
"Specify what to clear from the range.": "Especifique qué limpiar del rango.",
"The number of the row to be cleared (e.g., 5 for the 5th row).": "El número de la fila a limpiar (por ejemplo, 5 para la quinta fila).",
"Specify what to clear from the row.": "Especifique qué borrar de la fila.",
"The name for the new worksheet. If not provided, a default name like 'Sheet1' will be assigned.": "El nombre de la nueva hoja de cálculo. Si no se proporciona, se asignará un nombre por defecto como 'Sheet1'.",
"Optional: A list of headers to add to the first row. A table will be created from these headers.": "Opcional: Una lista de cabeceras a añadir a la primera fila. Se creará una tabla a partir de estas cabeceras.",
"The column to search in.": "La columna en la que buscar.",
"The value to find in the lookup column.": "El valor a encontrar en la columna de búsqueda.",
"The range of cells to retrieve, in A1 notation (e.g., \"A1:C10\").": "El rango de celdas a recuperar, en notación A1 (por ej., \"A1:C10\").",
"The zero-based index of the row to retrieve (e.g., 0 for the first row, 1 for the second).": "El índice cero de la fila a recuperar (por ejemplo, 0 para la primera fila, 1 para la segunda).",
"\nThe new name for the worksheet. The name must adhere to the following rules:\n- Cannot be blank.\n- Cannot exceed 31 characters.\n- Must not contain any of the following characters: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- The name \"History\" is reserved by Excel and cannot be used.\n": "\nThe new name for the worksheet. The name must adhere to the following rules:\n- Cannot be blank.\n- Cannot exceed 31 characters.\n- Must not contain any of the following characters: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- The name \"History\" is reserved by Excel and cannot be used.\n",
"Authorization headers are injected automatically from your connection.": "Las cabeceras de autorización se inyectan automáticamente desde tu conexión.",
"Enable for files like PDFs, images, etc..": "Activar para archivos como PDFs, imágenes, etc.",
"All (Contents and Formatting)": "Todo (contenido y formato)",
"Contents Only": "Sólo contenido",
"Formats Only": "Sólo formatos",
"GET": "RECOGER",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "BORRAR",
"HEAD": "LIMPIO",
"New Row": "Nueva fila",
"New Row in Table": "Nueva fila en la tabla",
"New Worksheet": "Nueva hoja de trabajo",
"Updated Row": "Fila actualizada",
"Trigger when a new row is added, and it can include existing rows as well.": "Activar cuando se agrega un nuevo registro, y también puede incluir registros existentes.",
"Fires when a new row is added to a table within a worksheet.": "Dispara cuando se agrega un nuevo registro a una tabla dentro de una hoja de cálculo.",
"Fires when a new worksheet is created in a workbook.": "Dispara cuando se crea una nueva hoja de trabajo en un libro.",
"Fires when a row (in a worksheet) is added or updated.": "Dispara cuando una fila (en una hoja de cálculo) es añadida o actualizada.",
"Max Rows to Poll": "Máximas filas a la encuesta",
"My table has headers": "Mi tabla tiene cabeceras",
"First row has headers": "La primera fila tiene cabeceras",
"The maximum number of rows to poll, the rest will be polled on the next run.": "El número máximo de filas a encuestar, el resto serán encuestados en la próxima ejecución.",
"Enable this if the first row of your table is a header row.": "Habilita esto si la primera fila de tu tabla es una fila de cabecera.",
"Enable this if the first row of your worksheet should be treated as headers.": "Habilite esto si la primera fila de su hoja de trabajo debe ser tratada como cabeceras."
}

View File

@@ -0,0 +1,148 @@
{
"Spreadsheet software by Microsoft": "Logiciel de la feuille de calcul par Microsoft",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add ": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - Files.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Append Row to Worksheet": "Ajouter la ligne à la feuille de travail",
"Get Worksheets": "Obtenir des feuilles de travail",
"Get Worksheet Rows": "Récupérer les lignes de feuilles de travail",
"Update Worksheet Rows": "Mettre à jour les lignes de la feuille de travail",
"Clear Worksheet": "Vider la fiche",
"Delete Worksheet": "Supprimer la fiche",
"Get Workbooks": "Obtenir des cahiers de travail",
"Delete Workbook": "Supprimer le carnet de travail",
"Add a Worksheet to a Workbook": "Ajouter une feuille de travail à un cahier de travail",
"Get Table Rows": "Récupérer les lignes de la table",
"Get Table Columns": "Récupérer les colonnes de la table",
"Create Table": "Créer une table",
"Delete Table": "Supprimer la table",
"Lookup Table Column": "Colonne de table de recherche",
"Append Rows to a Table": "Ajouter les lignes à une table",
"Convert to Range": "Convertir en Portée",
"Create Workbook": "Créer un cahier de travail",
"Clear Column by Index": "Effacer la colonne par index",
"Clear Cells by Range": "Effacer les cellules à distance",
"Clear Row by ID": "Effacer la ligne par ID",
"Create Worksheet": "Créer une feuille de calcul",
"Find Row": "Trouver une ligne",
"Get Cells in Range": "Obtenir des cellules à portée",
"Get Row by ID": "Obtenir une ligne par ID",
"Get Worksheet by ID": "Obtenir la fiche par ID",
"Rename Worksheet": "Renommer la fiche",
"Custom API Call": "Appel API personnalisé",
"Append row of values to a worksheet": "Ajouter une ligne de valeurs à une feuille de calcul",
"Retrieve worksheets from a workbook": "Récupérer les feuilles de travail d'un classeur",
"Retrieve rows from a worksheet": "Récupérer les lignes d'une feuille de travail",
"Update a row in a worksheet": "Mettre à jour une ligne dans une feuille de calcul",
"Clear a worksheet": "Vider une fiche",
"Delete a worksheet in a workbook": "Supprimer une feuille de travail dans un cahier de travail",
"Retrieve a list of workbooks": "Récupérer une liste de classeurs",
"Delete a workbook": "Supprimer un cahier de travail",
"Add a worksheet to a workbook": "Ajouter une feuille de travail à un cahier de travail",
"List rows of a table in a worksheet": "Liste les lignes d'une table dans une feuille de calcul",
"List columns of a table in a worksheet": "Liste les colonnes d'une table dans une feuille de travail",
"Create a table in a worksheet": "Créer une table dans une feuille de calcul",
"Delete a table from a worksheet": "Supprimer une table d'une feuille de calcul",
"Lookup a value in a table column in a worksheet": "Recherche une valeur dans une colonne de table dans une feuille de calcul",
"Append rows to a table": "Ajouter des lignes à une table",
"Converts a table to a range": "Convertit une table en une plage",
"Create a new workbook at the specified location": "Créer un nouveau cahier de travail à l'emplacement spécifié",
"Clear contents/formatting of a column by its index.": "Effacer le contenu/formatage d'une colonne par son index.",
"Clear a block of cells (range) content or formatting.": "Vider un bloc de cellules (rangées) contenu ou formatage.",
"Clear contents/formatting of an entire row by its ID.": "Effacer le contenu/formatage d'une ligne entière par son ID.",
"Add a new worksheet (tab) to an existing workbook with optional default headers.": "Ajouter une nouvelle feuille de travail (onglet) à un classeur existant avec des en-têtes optionnels par défaut.",
"Locate a row by specifying a lookup column and value (e.g. find a row where “ID” = 123).": "Localisez une ligne en spécifiant une colonne de recherche et une valeur (par exemple, trouver une ligne où « ID» = 123).",
"Retrieve the values in a given cell range (e.g., “A1:C10”).": "Récupère les valeurs dans une plage de cellules donnée (par exemple, « A1:C10 »).",
"  Retrieve the entire content of a row by its row ID.": " Récupère tout le contenu d'une ligne par son identifiant de ligne.",
"Retrieve metadata of a worksheet by its ID.": "Récupère les métadonnées d'une feuille par son ID.",
"Change the name of an existing worksheet.": "Changer le nom d'une feuille de travail existante.",
"Make a custom API call to a specific endpoint": "Passez un appel API personnalisé à un point de terminaison spécifique",
"Workbook": "Carnet de travail",
"Worksheet": "Feuille de travail",
"Does the first row contain headers?": "La première ligne contient-elle des en-têtes ?",
"Values": "Valeurs",
"Return All": "Retourner tout",
"Limit": "Limite",
"Range": "Range",
"Header Row": "Ligne d'en-tête",
"First Data Row": "Première ligne de données",
"Row number": "Numéro de ligne",
"Worksheet Name": "Nom de la fiche",
"Table": "Tableau",
"Select Range": "Sélectionner la plage",
"Has Headers": "A des entêtes",
"Lookup Column": "Colonne de recherche",
"Lookup Value": "Valeur de recherche",
"Return All Matches": "Retourner tous les matchs",
"Name": "Nom",
"Parent Folder": "Dossier parent",
"Column Index": "Index des colonnes",
"Clear Type": "Effacer le type",
"Row Number": "Numéro de ligne",
"Headers": "En-têtes",
"Row ID (Index)": "ID de ligne (Index)",
"New Worksheet Name": "Nom de la nouvelle fiche",
"Method": "Méthode",
"Query Parameters": "Paramètres de requête",
"Body": "Corps",
"Response is Binary ?": "La réponse est Binaire ?",
"No Error on Failure": "Aucune erreur en cas d'échec",
"Timeout (in seconds)": "Délai d'attente (en secondes)",
"If the first row is headers": "Si la première ligne est des en-têtes",
"The values to insert": "Les valeurs à insérer",
"If checked, all worksheets will be returned": "Si coché, toutes les feuilles de travail seront retournées",
"Limit the number of worksheets returned": "Limiter le nombre de feuilles de travail retournées",
"Range of the rows to retrieve (e.g., A2:B2)": "Plage des lignes à récupérer (par exemple, A2:B2)",
"Row number of the header": "Numéro de ligne de l'en-tête",
"Row number of the first data row": "Numéro de ligne de la première ligne de données",
"The row number to update": "Le numéro de ligne à mettre à jour",
"The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet": "La plage en notation A1 (par exemple, A2:B2) à effacer dans la feuille de travail, si elle n'est pas fournie, effacer la feuille de travail entière",
"Limits the number of workbooks returned, returns all workbooks if empty": "Limite le nombre de classeurs retournés, retourne tous les classeurs si vide",
"The name of the new worksheet": "Le nom de la nouvelle fiche",
"Limit the number of rows retrieved": "Limiter le nombre de lignes récupérées",
"Limit the number of columns retrieved": "Limiter le nombre de colonnes récupérées",
"How to select the range for the table": "Comment sélectionner la plage pour la table",
"The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table": "La plage de cellules en notation A1 (par exemple, A2:B2) qui seront converties en table",
"Whether the range has column labels": "Si la plage a des libellés de colonnes",
"The column name to lookup the value in": "Le nom de la colonne dans laquelle rechercher la valeur",
"The value to lookup": "La valeur à rechercher",
"If checked, all matching rows will be returned": "Si coché, toutes les lignes correspondantes seront retournées",
"The name of the new workbook": "Le nom du nouveau classeur",
"The parent folder to use": "Le dossier parent à utiliser",
"The 1-based index of the column to be cleared (e.g., 1 for column A, 2 for column B).": "L'index basé sur 1 de la colonne à effacer (par exemple, 1 pour la colonne A, 2 pour la colonne B).",
"Specify what to clear from the column.": "Spécifie ce qu'il faut effacer de la colonne.",
"The range of cells to clear, in A1 notation (e.g., \"A1:C5\").": "La plage de cellules à effacer, en notation A1 (par exemple, \"A1:C5\").",
"Specify what to clear from the range.": "Spécifie ce qu'il faut effacer de l'intervalle.",
"The number of the row to be cleared (e.g., 5 for the 5th row).": "Le numéro de la ligne à effacer (par exemple, 5 pour la 5ème rangée).",
"Specify what to clear from the row.": "Spécifie ce qu'il faut effacer de la ligne.",
"The name for the new worksheet. If not provided, a default name like 'Sheet1' will be assigned.": "Le nom de la nouvelle feuille de travail. Si elle n'est pas fournie, un nom par défaut comme 'Sheet1' sera assigné.",
"Optional: A list of headers to add to the first row. A table will be created from these headers.": "Optionnel: Une liste d'entêtes à ajouter à la première ligne. Une table sera créée à partir de ces en-têtes.",
"The column to search in.": "La colonne à rechercher.",
"The value to find in the lookup column.": "La valeur à trouver dans la colonne de recherche.",
"The range of cells to retrieve, in A1 notation (e.g., \"A1:C10\").": "La plage de cellules à récupérer, en notation A1 (par exemple, \"A1:C10\").",
"The zero-based index of the row to retrieve (e.g., 0 for the first row, 1 for the second).": "L'index basé sur zéro de la ligne à récupérer (par exemple, 0 pour la première ligne, 1 pour la seconde).",
"\nThe new name for the worksheet. The name must adhere to the following rules:\n- Cannot be blank.\n- Cannot exceed 31 characters.\n- Must not contain any of the following characters: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- The name \"History\" is reserved by Excel and cannot be used.\n": "\nThe new name for the worksheet. The name must adhere to the following rules:\n- Cannot be blank.\n- Cannot exceed 31 characters.\n- Must not contain any of the following characters: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- The name \"History\" is reserved by Excel and cannot be used.\n",
"Authorization headers are injected automatically from your connection.": "Les en-têtes d'autorisation sont injectés automatiquement à partir de votre connexion.",
"Enable for files like PDFs, images, etc..": "Activer pour les fichiers comme les PDFs, les images, etc.",
"All (Contents and Formatting)": "Tout (contenu et mise en forme)",
"Contents Only": "Contenu uniquement",
"Formats Only": "Formats seulement",
"GET": "OBTENIR",
"POST": "POSTER",
"PATCH": "PATCH",
"PUT": "EFFACER",
"DELETE": "SUPPRIMER",
"HEAD": "TÊTE",
"New Row": "Nouvelle ligne",
"New Row in Table": "Nouvelle ligne dans la table",
"New Worksheet": "Nouvelle feuille de travail",
"Updated Row": "Ligne mise à jour",
"Trigger when a new row is added, and it can include existing rows as well.": "Déclenche quand une nouvelle ligne est ajoutée, et peut également inclure des lignes existantes.",
"Fires when a new row is added to a table within a worksheet.": "Se déclenche lorsqu'une nouvelle ligne est ajoutée à une table dans une feuille de travail.",
"Fires when a new worksheet is created in a workbook.": "Déclenche lorsqu'une nouvelle feuille de travail est créée dans un classeur.",
"Fires when a row (in a worksheet) is added or updated.": "Déclenche lorsqu'une ligne (dans une feuille de travail) est ajoutée ou mise à jour.",
"Max Rows to Poll": "Nombre maximum de lignes au sondage",
"My table has headers": "Mon tableau a des en-têtes",
"First row has headers": "La première ligne a des en-têtes",
"The maximum number of rows to poll, the rest will be polled on the next run.": "Le nombre maximum de lignes à voter, le reste sera sondé lors de la prochaine exécution.",
"Enable this if the first row of your table is a header row.": "Activer cette option si la première ligne de votre table est une ligne d'en-tête.",
"Enable this if the first row of your worksheet should be treated as headers.": "Activer cette option si la première ligne de votre feuille de travail doit être traitée comme des en-têtes."
}

View File

@@ -0,0 +1,92 @@
{
"Microsoft Excel 365": "Microsoft Excel 365",
"Spreadsheet software by Microsoft": "Spreadsheet software by Microsoft",
"Authentication for Microsoft Excel 365": "Authentication for Microsoft Excel 365",
"Append Row to Worksheet": "Append Row to Worksheet",
"Get Worksheets": "Get Worksheets",
"Get Worksheet Rows": "Get Worksheet Rows",
"Update Worksheet Rows": "Update Worksheet Rows",
"Clear Worksheet": "Clear Worksheet",
"Delete Worksheet": "Delete Worksheet",
"Get Workbooks": "Get Workbooks",
"Delete Workbook": "Delete Workbook",
"Add a Worksheet to a Workbook": "Add a Worksheet to a Workbook",
"Get Table Rows": "Get Table Rows",
"Get Table Columns": "Get Table Columns",
"Create Table": "Create Table",
"Delete Table": "Delete Table",
"Lookup Table Column": "Lookup Table Column",
"Append Rows to a Table": "Append Rows to a Table",
"Convert to Range": "Convert to Range",
"Custom API Call": "Custom API Call",
"Append row of values to a worksheet": "Append row of values to a worksheet",
"Retrieve worksheets from a workbook": "Retrieve worksheets from a workbook",
"Retrieve rows from a worksheet": "Retrieve rows from a worksheet",
"Update a row in a worksheet": "Update a row in a worksheet",
"Clear a worksheet": "Clear a worksheet",
"Delete a worksheet in a workbook": "Delete a worksheet in a workbook",
"Retrieve a list of workbooks": "Retrieve a list of workbooks",
"Delete a workbook": "Delete a workbook",
"Add a worksheet to a workbook": "Add a worksheet to a workbook",
"List rows of a table in a worksheet": "List rows of a table in a worksheet",
"List columns of a table in a worksheet": "List columns of a table in a worksheet",
"Create a table in a worksheet": "Create a table in a worksheet",
"Delete a table from a worksheet": "Delete a table from a worksheet",
"Lookup a value in a table column in a worksheet": "Lookup a value in a table column in a worksheet",
"Append rows to a table": "Append rows to a table",
"Converts a table to a range": "Converts a table to a range",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Workbook": "Workbook",
"Worksheet": "Worksheet",
"Does the first row contain headers?": "Does the first row contain headers?",
"Values": "Values",
"Return All": "Return All",
"Limit": "Limit",
"Range": "Range",
"Header Row": "Header Row",
"First Data Row": "First Data Row",
"Row number": "Row number",
"Worksheet Name": "Worksheet Name",
"Table": "Table",
"Select Range": "Select Range",
"Has Headers": "Has Headers",
"Lookup Column": "Lookup Column",
"Lookup Value": "Lookup Value",
"Return All Matches": "Return All Matches",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"If the first row is headers": "If the first row is headers",
"The values to insert": "The values to insert",
"If checked, all worksheets will be returned": "If checked, all worksheets will be returned",
"Limit the number of worksheets returned": "Limit the number of worksheets returned",
"Range of the rows to retrieve (e.g., A2:B2)": "Range of the rows to retrieve (e.g., A2:B2)",
"Row number of the header": "Row number of the header",
"Row number of the first data row": "Row number of the first data row",
"The row number to update": "The row number to update",
"The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet": "The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet",
"Limits the number of workbooks returned, returns all workbooks if empty": "Limits the number of workbooks returned, returns all workbooks if empty",
"The name of the new worksheet": "The name of the new worksheet",
"Limit the number of rows retrieved": "Limit the number of rows retrieved",
"Limit the number of columns retrieved": "Limit the number of columns retrieved",
"How to select the range for the table": "How to select the range for the table",
"The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table": "The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table",
"Whether the range has column labels": "Whether the range has column labels",
"The column name to lookup the value in": "The column name to lookup the value in",
"The value to lookup": "The value to lookup",
"If checked, all matching rows will be returned": "If checked, all matching rows will be returned",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Row": "New Row",
"Trigger when a new row is added, and it can include existing rows as well.": "Trigger when a new row is added, and it can include existing rows as well.",
"Max Rows to Poll": "Max Rows to Poll",
"The maximum number of rows to poll, the rest will be polled on the next run.": "The maximum number of rows to poll, the rest will be polled on the next run."
}

View File

@@ -0,0 +1,92 @@
{
"Microsoft Excel 365": "Microsoft Excel 365",
"Spreadsheet software by Microsoft": "Spreadsheet software by Microsoft",
"Authentication for Microsoft Excel 365": "Authentication for Microsoft Excel 365",
"Append Row to Worksheet": "Append Row to Worksheet",
"Get Worksheets": "Get Worksheets",
"Get Worksheet Rows": "Get Worksheet Rows",
"Update Worksheet Rows": "Update Worksheet Rows",
"Clear Worksheet": "Clear Worksheet",
"Delete Worksheet": "Delete Worksheet",
"Get Workbooks": "Get Workbooks",
"Delete Workbook": "Delete Workbook",
"Add a Worksheet to a Workbook": "Add a Worksheet to a Workbook",
"Get Table Rows": "Get Table Rows",
"Get Table Columns": "Get Table Columns",
"Create Table": "Create Table",
"Delete Table": "Delete Table",
"Lookup Table Column": "Lookup Table Column",
"Append Rows to a Table": "Append Rows to a Table",
"Convert to Range": "Convert to Range",
"Custom API Call": "Custom API Call",
"Append row of values to a worksheet": "Append row of values to a worksheet",
"Retrieve worksheets from a workbook": "Retrieve worksheets from a workbook",
"Retrieve rows from a worksheet": "Retrieve rows from a worksheet",
"Update a row in a worksheet": "Update a row in a worksheet",
"Clear a worksheet": "Clear a worksheet",
"Delete a worksheet in a workbook": "Delete a worksheet in a workbook",
"Retrieve a list of workbooks": "Retrieve a list of workbooks",
"Delete a workbook": "Delete a workbook",
"Add a worksheet to a workbook": "Add a worksheet to a workbook",
"List rows of a table in a worksheet": "List rows of a table in a worksheet",
"List columns of a table in a worksheet": "List columns of a table in a worksheet",
"Create a table in a worksheet": "Create a table in a worksheet",
"Delete a table from a worksheet": "Delete a table from a worksheet",
"Lookup a value in a table column in a worksheet": "Lookup a value in a table column in a worksheet",
"Append rows to a table": "Append rows to a table",
"Converts a table to a range": "Converts a table to a range",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Workbook": "Workbook",
"Worksheet": "Worksheet",
"Does the first row contain headers?": "Does the first row contain headers?",
"Values": "Values",
"Return All": "Return All",
"Limit": "Limit",
"Range": "Range",
"Header Row": "Header Row",
"First Data Row": "First Data Row",
"Row number": "Row number",
"Worksheet Name": "Worksheet Name",
"Table": "Table",
"Select Range": "Select Range",
"Has Headers": "Has Headers",
"Lookup Column": "Lookup Column",
"Lookup Value": "Lookup Value",
"Return All Matches": "Return All Matches",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"If the first row is headers": "If the first row is headers",
"The values to insert": "The values to insert",
"If checked, all worksheets will be returned": "If checked, all worksheets will be returned",
"Limit the number of worksheets returned": "Limit the number of worksheets returned",
"Range of the rows to retrieve (e.g., A2:B2)": "Range of the rows to retrieve (e.g., A2:B2)",
"Row number of the header": "Row number of the header",
"Row number of the first data row": "Row number of the first data row",
"The row number to update": "The row number to update",
"The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet": "The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet",
"Limits the number of workbooks returned, returns all workbooks if empty": "Limits the number of workbooks returned, returns all workbooks if empty",
"The name of the new worksheet": "The name of the new worksheet",
"Limit the number of rows retrieved": "Limit the number of rows retrieved",
"Limit the number of columns retrieved": "Limit the number of columns retrieved",
"How to select the range for the table": "How to select the range for the table",
"The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table": "The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table",
"Whether the range has column labels": "Whether the range has column labels",
"The column name to lookup the value in": "The column name to lookup the value in",
"The value to lookup": "The value to lookup",
"If checked, all matching rows will be returned": "If checked, all matching rows will be returned",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Row": "New Row",
"Trigger when a new row is added, and it can include existing rows as well.": "Trigger when a new row is added, and it can include existing rows as well.",
"Max Rows to Poll": "Max Rows to Poll",
"The maximum number of rows to poll, the rest will be polled on the next run.": "The maximum number of rows to poll, the rest will be polled on the next run."
}

View File

@@ -0,0 +1,148 @@
{
"Spreadsheet software by Microsoft": "Microsoftによるスプレッドシートソフトウェア",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add ": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - Files.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Append Row to Worksheet": "行をワークシートに追加",
"Get Worksheets": "ワークシートを取得",
"Get Worksheet Rows": "ワークシート行を取得",
"Update Worksheet Rows": "ワークシートの行を更新",
"Clear Worksheet": "ワークシートをクリア",
"Delete Worksheet": "ワークシートを削除",
"Get Workbooks": "ワークブックを入手",
"Delete Workbook": "ワークブックを削除",
"Add a Worksheet to a Workbook": "ワークシートをワークブックに追加",
"Get Table Rows": "表行の取得",
"Get Table Columns": "テーブル列の取得",
"Create Table": "テーブルを作成",
"Delete Table": "テーブルの削除",
"Lookup Table Column": "ルックアップテーブルの列",
"Append Rows to a Table": "表に行を追加",
"Convert to Range": "範囲に変換",
"Create Workbook": "ワークブックを作成",
"Clear Column by Index": "インデックスで列をクリア",
"Clear Cells by Range": "範囲でセルをクリア",
"Clear Row by ID": "IDで行をクリア",
"Create Worksheet": "ワークシートを作成",
"Find Row": "行を検索",
"Get Cells in Range": "セル範囲を取得する",
"Get Row by ID": "IDで行を取得",
"Get Worksheet by ID": "ワークシートを ID で取得",
"Rename Worksheet": "ワークシートの名前を変更",
"Custom API Call": "カスタムAPI通話",
"Append row of values to a worksheet": "ワークシートに値の行を追加",
"Retrieve worksheets from a workbook": "ワークブックからワークシートを取得",
"Retrieve rows from a worksheet": "ワークシートから行を取得",
"Update a row in a worksheet": "ワークシートの行を更新",
"Clear a worksheet": "ワークシートをクリア",
"Delete a worksheet in a workbook": "ワークブック内のワークシートを削除",
"Retrieve a list of workbooks": "ワークブックの一覧を取得",
"Delete a workbook": "ブックを削除する",
"Add a worksheet to a workbook": "ワークシートをワークブックに追加",
"List rows of a table in a worksheet": "ワークシート内のテーブルの行の一覧",
"List columns of a table in a worksheet": "ワークシート内のテーブルの列のリスト",
"Create a table in a worksheet": "ワークシートにテーブルを作成",
"Delete a table from a worksheet": "ワークシートからテーブルを削除",
"Lookup a value in a table column in a worksheet": "ワークシート内のテーブル列の値を参照する",
"Append rows to a table": "テーブルに行を追加",
"Converts a table to a range": "テーブルを範囲に変換します",
"Create a new workbook at the specified location": "指定された場所に新しいブックを作成",
"Clear contents/formatting of a column by its index.": "インデックスで列の内容/書式をクリアします。",
"Clear a block of cells (range) content or formatting.": "セル(範囲)の内容や書式設定のブロックをクリアします。",
"Clear contents/formatting of an entire row by its ID.": "行全体の内容/書式を ID でクリアします。",
"Add a new worksheet (tab) to an existing workbook with optional default headers.": "新しいワークシート(タブ)を既存のワークブックに追加します。",
"Locate a row by specifying a lookup column and value (e.g. find a row where “ID” = 123).": "検索列と値を指定して行を探します例えば、「ID」=123の行を探します。",
"Retrieve the values in a given cell range (e.g., “A1:C10”).": "指定されたセル範囲の値を取得します (例: A1:C10)。",
"  Retrieve the entire content of a row by its row ID.": " 行IDで行全体の内容を取得します。",
"Retrieve metadata of a worksheet by its ID.": "IDでワークシートのメタデータを取得します。",
"Change the name of an existing worksheet.": "既存のワークシートの名前を変更します。",
"Make a custom API call to a specific endpoint": "特定のエンドポイントへのカスタム API コールを実行します。",
"Workbook": "ワークブック",
"Worksheet": "ワークシート",
"Does the first row contain headers?": "最初の行にはヘッダーが含まれていますか?",
"Values": "値",
"Return All": "すべて戻る",
"Limit": "制限",
"Range": "Range",
"Header Row": "ヘッダー行",
"First Data Row": "最初のデータ行",
"Row number": "行番号",
"Worksheet Name": "ワークシート名",
"Table": "表",
"Select Range": "範囲の選択",
"Has Headers": "ヘッダーがあります",
"Lookup Column": "検索列",
"Lookup Value": "ルックアップの値",
"Return All Matches": "すべての一致を返す",
"Name": "名前",
"Parent Folder": "親フォルダ",
"Column Index": "列のインデックス",
"Clear Type": "タイプをクリア",
"Row Number": "行番号",
"Headers": "ヘッダー",
"Row ID (Index)": "行 ID (インデックス)",
"New Worksheet Name": "新しいワークシート名",
"Method": "方法",
"Query Parameters": "クエリパラメータ",
"Body": "本文",
"Response is Binary ?": "応答はバイナリですか?",
"No Error on Failure": "失敗時にエラーはありません",
"Timeout (in seconds)": "タイムアウト(秒)",
"If the first row is headers": "最初の行がヘッダーの場合",
"The values to insert": "挿入する値",
"If checked, all worksheets will be returned": "チェックされている場合、すべてのワークシートが返されます",
"Limit the number of worksheets returned": "返されるワークシートの数を制限する",
"Range of the rows to retrieve (e.g., A2:B2)": "取得する行の範囲 (例: A2:B2)",
"Row number of the header": "ヘッダーの行番号",
"Row number of the first data row": "最初のデータ行の行番号",
"The row number to update": "更新する行番号",
"The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet": "A1 表記の範囲 (例: A2:B2) が指定されていない場合、ワークシート全体をクリアします",
"Limits the number of workbooks returned, returns all workbooks if empty": "返されたワークブックの数を制限します。空の場合はすべてのワークブックを返します。",
"The name of the new worksheet": "新しいワークシートの名前",
"Limit the number of rows retrieved": "取得した行数を制限する",
"Limit the number of columns retrieved": "取得した列の数を制限する",
"How to select the range for the table": "表の範囲を選択する方法",
"The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table": "A1表記のセル範囲 (例:A2:B2) がテーブルに変換されます。",
"Whether the range has column labels": "範囲に列ラベルがあるかどうか",
"The column name to lookup the value in": "値を検索する列名",
"The value to lookup": "検索する値",
"If checked, all matching rows will be returned": "チェックされている場合、一致するすべての行が返されます",
"The name of the new workbook": "新しいブックの名前",
"The parent folder to use": "使用する親フォルダ",
"The 1-based index of the column to be cleared (e.g., 1 for column A, 2 for column B).": "クリアする列の1ベースのインデックス(例えば、Aの場合は1、Bの場合は2)です。",
"Specify what to clear from the column.": "列から消去するものを指定します。",
"The range of cells to clear, in A1 notation (e.g., \"A1:C5\").": "A1表記(例:A1:C5)でクリアするセルの範囲。",
"Specify what to clear from the range.": "範囲からクリアするものを指定します。",
"The number of the row to be cleared (e.g., 5 for the 5th row).": "クリアする行の数5行目。",
"Specify what to clear from the row.": "行からクリアする項目を指定します。",
"The name for the new worksheet. If not provided, a default name like 'Sheet1' will be assigned.": "新しいワークシートの名前。指定されていない場合は、'Sheet1' のようなデフォルトの名前が割り当てられます。",
"Optional: A list of headers to add to the first row. A table will be created from these headers.": "オプション: 最初の行に追加するヘッダーのリスト。これらのヘッダーからテーブルが作成されます。",
"The column to search in.": "検索するカラム。",
"The value to find in the lookup column.": "ルックアップ列で検索する値。",
"The range of cells to retrieve, in A1 notation (e.g., \"A1:C10\").": "取得するセルの範囲(例:A1:C10\")。",
"The zero-based index of the row to retrieve (e.g., 0 for the first row, 1 for the second).": "取得する行のゼロベースのインデックス(最初の行の場合は0、2番目の行の場合は1)です。",
"\nThe new name for the worksheet. The name must adhere to the following rules:\n- Cannot be blank.\n- Cannot exceed 31 characters.\n- Must not contain any of the following characters: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- The name \"History\" is reserved by Excel and cannot be used.\n": "\nThe new name for the worksheet. The name must adhere to the following rules:\n- Cannot be blank.\n- Cannot exceed 31 characters.\n- Must not contain any of the following characters: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- The name \"History\" is reserved by Excel and cannot be used.\n",
"Authorization headers are injected automatically from your connection.": "認証ヘッダは接続から自動的に注入されます。",
"Enable for files like PDFs, images, etc..": "PDF、画像などのファイルを有効にします。",
"All (Contents and Formatting)": "すべて(内容と書式設定)",
"Contents Only": "内容のみ",
"Formats Only": "書式のみ",
"GET": "取得",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "削除",
"HEAD": "頭",
"New Row": "新しい行",
"New Row in Table": "新しい行",
"New Worksheet": "新しいワークシート",
"Updated Row": "更新行",
"Trigger when a new row is added, and it can include existing rows as well.": "新しい行が追加されたときにトリガーされ、既存の行も含めることができます。",
"Fires when a new row is added to a table within a worksheet.": "ワークシート内のテーブルに新しい行が追加されたときに発生します。",
"Fires when a new worksheet is created in a workbook.": "ワークブックに新しいワークシートが作成されたときに発火します。",
"Fires when a row (in a worksheet) is added or updated.": "行(ワークシート内)が追加または更新されたときに発火します。",
"Max Rows to Poll": "アンケートへの最大行",
"My table has headers": "私のテーブルにはヘッダーがあります",
"First row has headers": "最初の行にヘッダーがあります",
"The maximum number of rows to poll, the rest will be polled on the next run.": "アンケートする行の最大数。残りは次の実行時にポーリングされます。",
"Enable this if the first row of your table is a header row.": "テーブルの最初の行がヘッダー行の場合、これを有効にします。",
"Enable this if the first row of your worksheet should be treated as headers.": "ワークシートの最初の行をヘッダーとして扱う場合は、これを有効にします。"
}

View File

@@ -0,0 +1,148 @@
{
"Spreadsheet software by Microsoft": "Spreadsheet software van Microsoft",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add ": "\n1. Log in bij [Microsoft Azure Portal](https://portal.azure.com/).\n. Ga naar **Microsoft Enfra ID**.\n3. Onder **Beheren**, klik op **App registraties**.\n4. Klik op de **Nieuwe registratie** knop.\n5. Voer een **Naam** in voor uw app.\n6. Voor **Ondersteunde accounttypen**, kies keuze:\n - **Accounts in elke map van de organisatie (Any Microsoft Entra ID-tenant - Multitenant) en persoonlijke Microsoft accounts**\n - Of selecteer gebaseerd op uw vereiste.\n7. In **Redirect URI** selecteer **Web** en voeg de opgegeven URL toe.\n8. Klik op **Register**.\n9. Na registratie wordt u doorverwezen naar de overzichtspagina. Kopieer de **Applicatie (client) ID**.\n10. Vanuit het linkermenu ga naar **Certificaten & geheimen**.\n - Klik onder **Client geheimen** op **Nieuwe client geheim**.\n - Geef een beschrijving, verloop, en klik **Toevoegen**.\n - Kopieer de **Waarde** van de client secret (dit zal niet meer worden getoond).\n11. Ga naar **API-rechten** vanuit het linkermenu.\n - Klik **Een machtiging toevoegen**.\n - Selecteer **Microsoft Graph** → **gedelegeerde machtigingen**.\n - Voeg de volgende toepassingsgebieden toe:\n - Bestanden. eadWrite\n - offline_access \n - Klik **Permissies toevoegen**.\n12. Kopieer uw **Client ID** en **Client Secret**.\n",
"Append Row to Worksheet": "Rij toevoegen aan werkblad",
"Get Worksheets": "Haal werkbladen op",
"Get Worksheet Rows": "Werkblad Regels ophalen",
"Update Worksheet Rows": "Werkblad Regels bijwerken",
"Clear Worksheet": "Verwijder werkblad",
"Delete Worksheet": "Werkblad verwijderen",
"Get Workbooks": "Werkboeken ophalen",
"Delete Workbook": "Werkboek verwijderen",
"Add a Worksheet to a Workbook": "Voeg een werkblad toe aan een werkboek",
"Get Table Rows": "Verkrijg Tafelregels",
"Get Table Columns": "Tabel kolommen ophalen",
"Create Table": "Tabel maken",
"Delete Table": "Tabel verwijderen",
"Lookup Table Column": "Tabel kolom opzoeken",
"Append Rows to a Table": "Rijen toevoegen aan een tabel",
"Convert to Range": "Converteren naar Bereik",
"Create Workbook": "Takenboek aanmaken",
"Clear Column by Index": "Kolom wissen op index",
"Clear Cells by Range": "Wis antennes per bereik",
"Clear Row by ID": "Rij wissen via ID",
"Create Worksheet": "Werkblad aanmaken",
"Find Row": "Rij zoeken",
"Get Cells in Range": "Krijg Cellen in bereik",
"Get Row by ID": "Krijg Rij op ID",
"Get Worksheet by ID": "Haal het werkblad op via ID",
"Rename Worksheet": "Werkblad hernoemen",
"Custom API Call": "Custom API Call",
"Append row of values to a worksheet": "Voeg rij van waarden toe aan een werkblad",
"Retrieve worksheets from a workbook": "Werkbladen ophalen uit een werkboek",
"Retrieve rows from a worksheet": "Ophalen rijen van een werkblad",
"Update a row in a worksheet": "Een rij in een werkblad bijwerken",
"Clear a worksheet": "Wis een werkblad",
"Delete a worksheet in a workbook": "Verwijder een werkblad in een werkboek",
"Retrieve a list of workbooks": "Haal een lijst op met workbooks",
"Delete a workbook": "Een werkboek verwijderen",
"Add a worksheet to a workbook": "Een werkblad toevoegen aan een werkboek",
"List rows of a table in a worksheet": "Rijen van een tabel in een werkblad weergeven",
"List columns of a table in a worksheet": "Kolommen weergeven van een tabel in een werkblad",
"Create a table in a worksheet": "Tabel aanmaken in een werkblad",
"Delete a table from a worksheet": "Een tabel uit een werkblad verwijderen",
"Lookup a value in a table column in a worksheet": "Zoek een waarde in een tabelkolom in een werkblad",
"Append rows to a table": "Rijen toevoegen aan een tabel",
"Converts a table to a range": "Zet een tabel om naar een bereik",
"Create a new workbook at the specified location": "Maak een nieuw werkboek op de opgegeven locatie",
"Clear contents/formatting of a column by its index.": "Verwijder content/opmaak van een kolom door de index.",
"Clear a block of cells (range) content or formatting.": "Wis een blok van cellen (bereik) inhoud of formattering.",
"Clear contents/formatting of an entire row by its ID.": "Verwijder content/formattering van een hele rij via zijn ID.",
"Add a new worksheet (tab) to an existing workbook with optional default headers.": "Voeg een nieuw werkblad (tab) toe aan een bestaand werkboek met optionele standaard headers.",
"Locate a row by specifying a lookup column and value (e.g. find a row where “ID” = 123).": "Zoek een rij door een kolom en waarde op te geven (bijv. zoek een rij waar \"ID\" = 123).",
"Retrieve the values in a given cell range (e.g., “A1:C10”).": "Haal de waarden op in een bepaald bereik (bv. \"A1:C10\").",
"  Retrieve the entire content of a row by its row ID.": " Haal de gehele inhoud van een rij op met zijn rij ID.",
"Retrieve metadata of a worksheet by its ID.": "Haal metadata van een werkblad op met de ID ervan.",
"Change the name of an existing worksheet.": "Wijzig de naam van een bestaand werkblad.",
"Make a custom API call to a specific endpoint": "Maak een aangepaste API call naar een specifiek eindpunt",
"Workbook": "Werkboek",
"Worksheet": "Werkblad",
"Does the first row contain headers?": "Bevat de eerste rij headers?",
"Values": "Waarden",
"Return All": "Retourneer alles",
"Limit": "Limiet",
"Range": "Range",
"Header Row": "Kopregel rij",
"First Data Row": "Eerste Data Rij",
"Row number": "Rij nummer",
"Worksheet Name": "Werkblad naam",
"Table": "Tabel",
"Select Range": "Selecteer bereik",
"Has Headers": "Heeft headers",
"Lookup Column": "Kolom opzoeken",
"Lookup Value": "Opzoeken Waarde",
"Return All Matches": "Retourneer alle overeenkomsten",
"Name": "Naam",
"Parent Folder": "Bovenliggende map",
"Column Index": "Kolom Index",
"Clear Type": "Type leegmaken",
"Row Number": "Rij nummer",
"Headers": "Kopteksten",
"Row ID (Index)": "Rij ID (Index)",
"New Worksheet Name": "Naam nieuwe werkblad",
"Method": "Methode",
"Query Parameters": "Query parameters",
"Body": "Lichaam",
"Response is Binary ?": "Antwoord is binair?",
"No Error on Failure": "Geen fout bij fout",
"Timeout (in seconds)": "Time-out (in seconden)",
"If the first row is headers": "Als de eerste rij headers zijn",
"The values to insert": "De waarden om in te voegen",
"If checked, all worksheets will be returned": "Indien aangevinkt, worden alle werkbladen teruggestuurd",
"Limit the number of worksheets returned": "Beperk het aantal terugkerende werkbladen",
"Range of the rows to retrieve (e.g., A2:B2)": "Bereik van de op te halen rijen (bijv. A2:B2)",
"Row number of the header": "Rij nummer van de header",
"Row number of the first data row": "Rij nummer van de eerste gegevensrij",
"The row number to update": "Het rij nummer om te updaten",
"The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet": "Het bereik van A1 notatie (bijv. A2:B2) om het werkblad te wissen, indien niet opgegeven, wis het volledige werkblad",
"Limits the number of workbooks returned, returns all workbooks if empty": "Beperkt het aantal geretourneerde werkboeken, retourneert alle werkboeken indien leeg",
"The name of the new worksheet": "De naam van het nieuwe werkblad",
"Limit the number of rows retrieved": "Limiteer het aantal rijen die opgehaald zijn",
"Limit the number of columns retrieved": "Limiteer het aantal opgehaalde kolommen",
"How to select the range for the table": "Hoe het bereik van de tabel te selecteren",
"The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table": "Het bereik van cellen in A1 notatie (bijv. A2:B2) die worden geconverteerd naar een tabel",
"Whether the range has column labels": "Of het bereik kolomlabels heeft",
"The column name to lookup the value in": "De kolomnaam om de waarde in te zoeken",
"The value to lookup": "De waarde om op te zoeken",
"If checked, all matching rows will be returned": "Indien aangevinkt, worden alle overeenkomende rijen teruggestuurd",
"The name of the new workbook": "De naam van het nieuwe werkboek",
"The parent folder to use": "De te gebruiken bovenliggende map",
"The 1-based index of the column to be cleared (e.g., 1 for column A, 2 for column B).": "De 1-gebaseerde index van de op te ruimen kolom (bijv. 1 voor kolom A, 2 voor kolom B).",
"Specify what to clear from the column.": "Geef aan wat uit de kolom moet worden gewist.",
"The range of cells to clear, in A1 notation (e.g., \"A1:C5\").": "Het bereik van cellen om te tonen, in A1 notatie (bijv. \"A1:C5\").",
"Specify what to clear from the range.": "Geef aan wat je moet wissen vanuit het bereik.",
"The number of the row to be cleared (e.g., 5 for the 5th row).": "Het nummer van de rij die moet worden gewist (bijv. 5 voor de 5e rij).",
"Specify what to clear from the row.": "Geef aan wat je van rij moet opruimen.",
"The name for the new worksheet. If not provided, a default name like 'Sheet1' will be assigned.": "De naam voor het nieuwe werkblad. Indien niet opgegeven, zal er een standaardnaam zoals 'Sheet1' worden toegewezen.",
"Optional: A list of headers to add to the first row. A table will be created from these headers.": "Optioneel: een lijst van koppen om toe te voegen aan de eerste rij. Een tabel zal worden gemaakt op basis van deze headers.",
"The column to search in.": "De kolom om in te zoeken.",
"The value to find in the lookup column.": "De waarde te vinden in de zoek kolom.",
"The range of cells to retrieve, in A1 notation (e.g., \"A1:C10\").": "Het bereik van cellen om op te halen, in A1 notatie (bijv. \"A1:C10\").",
"The zero-based index of the row to retrieve (e.g., 0 for the first row, 1 for the second).": "De op nul gebaseerde index van de rij op te halen (vb. 0 voor de eerste rij, 1 voor de tweede).",
"\nThe new name for the worksheet. The name must adhere to the following rules:\n- Cannot be blank.\n- Cannot exceed 31 characters.\n- Must not contain any of the following characters: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- The name \"History\" is reserved by Excel and cannot be used.\n": "\nDe nieuwe naam voor het werkblad. De naam moet zich houden aan de volgende regels:\n- mag niet leeg zijn.\n- mag niet langer zijn dan 31 tekens.\n- Moet geen van de volgende tekens bevatten: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- De naam \"Geschiedenis\" is gereserveerd door Excel en kan niet worden gebruikt.\n",
"Authorization headers are injected automatically from your connection.": "Autorisatie headers worden automatisch geïnjecteerd vanuit uw verbinding.",
"Enable for files like PDFs, images, etc..": "Inschakelen voor bestanden zoals PDF's, afbeeldingen etc..",
"All (Contents and Formatting)": "Alle (inhoud en formaten)",
"Contents Only": "Alleen inhoud",
"Formats Only": "Alleen formaten",
"GET": "KRIJG",
"POST": "POSTE",
"PATCH": "BEKIJK",
"PUT": "PUT",
"DELETE": "VERWIJDEREN",
"HEAD": "HOOFD",
"New Row": "Nieuwe rij",
"New Row in Table": "Nieuwe rij in tafel",
"New Worksheet": "Nieuw werkblad",
"Updated Row": "Bijgewerkt Rij",
"Trigger when a new row is added, and it can include existing rows as well.": "Trigger wanneer een nieuwe rij wordt toegevoegd, en het kan ook bestaande rijen bevatten.",
"Fires when a new row is added to a table within a worksheet.": "Vuurt wanneer een nieuwe rij wordt toegevoegd aan een tafel binnen een werkblad.",
"Fires when a new worksheet is created in a workbook.": "Vuurt af wanneer een nieuwe werkblad in een werkboek wordt gemaakt.",
"Fires when a row (in a worksheet) is added or updated.": "Vuurt wanneer een rij (in een werkblad) is toegevoegd of bijgewerkt.",
"Max Rows to Poll": "Maximaal aantal rijen naar Poll",
"My table has headers": "Mijn tabel heeft headers",
"First row has headers": "Eerste rij heeft headers",
"The maximum number of rows to poll, the rest will be polled on the next run.": "Het maximum aantal rijen om te politeren, de rest zal worden opgevraagd bij de volgende uitvoer.",
"Enable this if the first row of your table is a header row.": "Schakel dit in als de eerste rij van de tabel een kopregel is.",
"Enable this if the first row of your worksheet should be treated as headers.": "Schakel dit in als de eerste rij van uw werkblad als koppen behandeld moet worden."
}

View File

@@ -0,0 +1,148 @@
{
"Spreadsheet software by Microsoft": "Software de planilha da Microsoft",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add ": "\n1. Entre no [Microsoft Azure Portal](https://portal.azure.com/).\n. Na barra lateral esquerda, vá até **Microsoft Enfra ID**.\n3. Sob **Gerenciar**, clique em **Aplicativos registrados**.\n4. Clique no botão **Novo registro**.\n5. Digite um **Nome** para o seu aplicativo.\n6. Para **Tipos de conta suportados**, escolha:\n - **Contas em qualquer diretório organizacional (qualquer inquilino de ID da Microsoft Entra - Multitenant) e contas pessoais da Microsoft**\n - Ou selecione com base nos seus requisitos.\n7. Em **URI de redirecionamento**, selecione **Web** e adicione a URL fornecida.\n8. Clique em **Registrar**.\n9. Após o registro, você será redirecionado para a página de visão geral do aplicativo. Copie o **aplicativo (cliente) ID**.\n10. Do menu à esquerda, vá para **Certificados e segredos**.\n - Em **Segredos do Cliente**, clique em **Novo segredo do Cliente**.\n - Fornece uma descrição, define um vencimento e clique em **Adicionar**.\n - Copiar o **Valor** do segredo do cliente (não será mostrado novamente).\n11. Vá para **Permissões da API** no menu à esquerda.\n - Clique em **Adicionar permissão**.\n - Selecione **Microsoft Graph** → **Delegated permissions**.\n - Adicione os seguintes escopos:\n - Arquivos. eadWrite\n - offline_access \n - Clique em **Adicionar permissões**.\n12. Copie seu **ID do Cliente** e **Segredo do Cliente**.\n",
"Append Row to Worksheet": "Acrescentar linha à planilha",
"Get Worksheets": "Obter planilhas",
"Get Worksheet Rows": "Obter Linhas de Planilha",
"Update Worksheet Rows": "Atualizar Planilha Rows",
"Clear Worksheet": "Limpar planilha",
"Delete Worksheet": "Excluir planilha",
"Get Workbooks": "Obter Workbooks",
"Delete Workbook": "Excluir Atividades",
"Add a Worksheet to a Workbook": "Adicionar uma planilha ao workbook",
"Get Table Rows": "Obter Linhas da Tabela",
"Get Table Columns": "Obter colunas da Tabela",
"Create Table": "Criar tabela",
"Delete Table": "Excluir Tabela",
"Lookup Table Column": "Procurar Coluna da Tabela",
"Append Rows to a Table": "Acrescentar linhas a uma tabela",
"Convert to Range": "Converter em gama",
"Create Workbook": "Criar Workbook",
"Clear Column by Index": "Limpar coluna por índice",
"Clear Cells by Range": "Limpar células por faixa",
"Clear Row by ID": "Limpar Linha por ID",
"Create Worksheet": "Criar planilha",
"Find Row": "Encontrar linha",
"Get Cells in Range": "Obtenha Células ao longo do alcance",
"Get Row by ID": "Obter linha por ID",
"Get Worksheet by ID": "Obter planilha por ID",
"Rename Worksheet": "Renomear planilha",
"Custom API Call": "Chamada de API personalizada",
"Append row of values to a worksheet": "Acrescentar a linha de valores a uma planilha",
"Retrieve worksheets from a workbook": "Recuperar planilhas de um livro de trabalho",
"Retrieve rows from a worksheet": "Recuperar linhas de uma planilha",
"Update a row in a worksheet": "Atualizar uma linha em uma planilha",
"Clear a worksheet": "Limpar uma planilha",
"Delete a worksheet in a workbook": "Excluir uma planilha no workbook",
"Retrieve a list of workbooks": "Recuperar uma lista de livros de trabalho",
"Delete a workbook": "Excluir uma pasta de trabalho",
"Add a worksheet to a workbook": "Adicionar uma planilha para um caderno",
"List rows of a table in a worksheet": "Lista linhas de uma tabela em uma planilha",
"List columns of a table in a worksheet": "Lista de colunas de uma tabela em uma planilha",
"Create a table in a worksheet": "Criar uma tabela em uma folha de atividade",
"Delete a table from a worksheet": "Apagar uma tabela de uma planilha",
"Lookup a value in a table column in a worksheet": "Pesquisa um valor em uma coluna de tabela em uma planilha",
"Append rows to a table": "Acrescentar linhas a uma tabela",
"Converts a table to a range": "Converte uma tabela em uma faixa",
"Create a new workbook at the specified location": "Criar uma nova pasta de trabalho no local especificado",
"Clear contents/formatting of a column by its index.": "Limpar conteúdo/formatação de uma coluna pelo seu índice.",
"Clear a block of cells (range) content or formatting.": "Limpa um bloco de conteúdo de células (de alcance) ou formatação.",
"Clear contents/formatting of an entire row by its ID.": "Limpar conteúdos/formatação de uma linha inteira por sua ID.",
"Add a new worksheet (tab) to an existing workbook with optional default headers.": "Adicionar uma nova planilha (guia) para um caderno de trabalho existente com cabeçalhos padrão opcional.",
"Locate a row by specifying a lookup column and value (e.g. find a row where “ID” = 123).": "Localizar uma linha especificando uma coluna e um valor de pesquisa (por exemplo, encontra uma linha onde \"ID\" = 123).",
"Retrieve the values in a given cell range (e.g., “A1:C10”).": "Recupere os valores em uma determinada faixa de células (por exemplo, \"A1:C10\").",
"  Retrieve the entire content of a row by its row ID.": " Recuperar todo o conteúdo da linha pela sua ID de linha.",
"Retrieve metadata of a worksheet by its ID.": "Recuperar metadados de uma planilha por sua ID.",
"Change the name of an existing worksheet.": "Mudar o nome de uma planilha existente.",
"Make a custom API call to a specific endpoint": "Faça uma chamada de API personalizada para um ponto de extremidade específico",
"Workbook": "Workbook",
"Worksheet": "Planilha",
"Does the first row contain headers?": "A primeira linha contém cabeçalhos?",
"Values": "Valores",
"Return All": "Devolver tudo",
"Limit": "Limitar",
"Range": "Range",
"Header Row": "Linha do Cabeçalho",
"First Data Row": "Primeira linha de dados",
"Row number": "Número da linha",
"Worksheet Name": "Nome da Planilha",
"Table": "Classificações",
"Select Range": "Selecione o intervalo",
"Has Headers": "Possui cabeçalhos",
"Lookup Column": "Coluna da Pesquisa",
"Lookup Value": "Valor de pesquisa",
"Return All Matches": "Retornar Todas as Partidas",
"Name": "Nome",
"Parent Folder": "Pasta pai",
"Column Index": "Índice da coluna",
"Clear Type": "Limpar Tipo",
"Row Number": "Número da linha",
"Headers": "Cabeçalhos",
"Row ID (Index)": "ID da Linha (Índice)",
"New Worksheet Name": "Nome da Nova Planilha",
"Method": "Método",
"Query Parameters": "Parâmetros da consulta",
"Body": "Conteúdo",
"Response is Binary ?": "A resposta é binária ?",
"No Error on Failure": "Nenhum erro no Failure",
"Timeout (in seconds)": "Tempo limite (em segundos)",
"If the first row is headers": "Se a primeira linha for o cabeçalho",
"The values to insert": "Os valores a inserir",
"If checked, all worksheets will be returned": "Se marcada, todas as planilhas serão retornadas",
"Limit the number of worksheets returned": "Limitar o número de planilhas retornadas",
"Range of the rows to retrieve (e.g., A2:B2)": "Intervalo das linhas a serem recuperadas (por exemplo, A2:B2)",
"Row number of the header": "Número da linha do cabeçalho",
"Row number of the first data row": "Número da linha de dados inicial",
"The row number to update": "Número da linha a ser atualizado",
"The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet": "O intervalo na notação A1 (por exemplo, A2:B2) para limpar na planilha, se não for fornecida, limpa a planilha inteira",
"Limits the number of workbooks returned, returns all workbooks if empty": "Limita o número de livros de trabalho retornados, retorna todos os livros de trabalho se estiver vazio",
"The name of the new worksheet": "O nome da nova planilha",
"Limit the number of rows retrieved": "Limitar o número de linhas recuperadas",
"Limit the number of columns retrieved": "Limitar o número de colunas recuperadas",
"How to select the range for the table": "Como selecionar o intervalo para a tabela",
"The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table": "O intervalo de células na notação A1 (por exemplo, A2:B2) que será convertido em uma tabela",
"Whether the range has column labels": "Se o intervalo tem rótulos de coluna",
"The column name to lookup the value in": "O nome da coluna em que pesquisa o valor",
"The value to lookup": "O valor a pesquisar",
"If checked, all matching rows will be returned": "Se marcada, todas as linhas correspondentes serão devolvidas",
"The name of the new workbook": "O nome da nova pasta de trabalho",
"The parent folder to use": "A pasta pai a ser usada",
"The 1-based index of the column to be cleared (e.g., 1 for column A, 2 for column B).": "O índice de 1 na coluna a ser limpo (por exemplo, 1 para a coluna A, 2 para a coluna B).",
"Specify what to clear from the column.": "Especifique o que limpar da coluna.",
"The range of cells to clear, in A1 notation (e.g., \"A1:C5\").": "A variedade de células para limpar, na notação A1 (ex.: \"A1:C5\").",
"Specify what to clear from the range.": "Especifique o que remover do intervalo.",
"The number of the row to be cleared (e.g., 5 for the 5th row).": "O número da linha a ser limpa (por exemplo, 5 para a quinta linha).",
"Specify what to clear from the row.": "Especifique o que limpar da linha.",
"The name for the new worksheet. If not provided, a default name like 'Sheet1' will be assigned.": "O nome da nova planilha. Se não for fornecido, um nome padrão como 'Folha1' será atribuído.",
"Optional: A list of headers to add to the first row. A table will be created from these headers.": "Opcional: Uma lista de cabeçalhos para adicionar à primeira linha. Uma tabela será criada a partir destes cabeçalhos.",
"The column to search in.": "A coluna para pesquisar.",
"The value to find in the lookup column.": "O valor a ser encontrado na coluna de pesquisa.",
"The range of cells to retrieve, in A1 notation (e.g., \"A1:C10\").": "O intervalo de células a recuperar, na notação A1 (ex.: \"A1:C10\").",
"The zero-based index of the row to retrieve (e.g., 0 for the first row, 1 for the second).": "O índice baseado em zero da linha a ser recuperada (por exemplo, 0 para a primeira linha, 1 para o segundo).",
"\nThe new name for the worksheet. The name must adhere to the following rules:\n- Cannot be blank.\n- Cannot exceed 31 characters.\n- Must not contain any of the following characters: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- The name \"History\" is reserved by Excel and cannot be used.\n": "\nThe new name for the worksheet. The name must adhere to the following rules:\n- Cannot be blank.\n- Cannot exceed 31 characters.\n- Must not contain any of the following characters: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- The name \"History\" is reserved by Excel and cannot be used.\n",
"Authorization headers are injected automatically from your connection.": "Os cabeçalhos de autorização são inseridos automaticamente a partir da sua conexão.",
"Enable for files like PDFs, images, etc..": "Habilitar para arquivos como PDFs, imagens, etc..",
"All (Contents and Formatting)": "Todos (Conteúdo e Formatação)",
"Contents Only": "Apenas conteúdo",
"Formats Only": "Apenas formatos",
"GET": "OBTER",
"POST": "POSTAR",
"PATCH": "COMPRAR",
"PUT": "COLOCAR",
"DELETE": "EXCLUIR",
"HEAD": "CABEÇA",
"New Row": "Nova linha",
"New Row in Table": "Nova linha na tabela",
"New Worksheet": "Nova Planilha",
"Updated Row": "Linha atualizada",
"Trigger when a new row is added, and it can include existing rows as well.": "Disparar quando uma nova linha é adicionada, e pode incluir linhas existentes também.",
"Fires when a new row is added to a table within a worksheet.": "Atira quando uma nova linha é adicionada a uma tabela dentro de uma planilha.",
"Fires when a new worksheet is created in a workbook.": "Efetua quando uma nova planilha é criada em um livro de trabalho.",
"Fires when a row (in a worksheet) is added or updated.": "Efetua quando uma linha (em planilha) é adicionada ou atualizada.",
"Max Rows to Poll": "Máximo de linhas para enquete",
"My table has headers": "Minha mesa tem cabeçalhos",
"First row has headers": "Primeira linha tem cabeçalhos",
"The maximum number of rows to poll, the rest will be polled on the next run.": "O número máximo de linhas para enquete, o resto será enquete na próxima execução.",
"Enable this if the first row of your table is a header row.": "Ative esta opção se a primeira linha da sua tabela é uma linha de cabeçalho.",
"Enable this if the first row of your worksheet should be treated as headers.": "Ative esta opção se a primeira linha da sua planilha deve ser tratada como cabeçalhos."
}

View File

@@ -0,0 +1,98 @@
{
"Microsoft Excel 365": "Microsoft Excel 365",
"Spreadsheet software by Microsoft": "Программное обеспечение для таблиц Microsoft",
"Authentication for Microsoft Excel 365": "Аутентификация для Microsoft Excel 365",
"Append Row to Worksheet": "Добавить строку в таблицу",
"Get Worksheets": "Получить рабочие таблицы",
"Get Worksheet Rows": "Получить строки",
"Update Worksheet Rows": "Обновить строки таблиц",
"Clear Worksheet": "Очистить таблицу",
"Delete Worksheet": "Удалить таблицу",
"Get Workbooks": "Получить рабочие книги",
"Delete Workbook": "Удалить Рабочую книгу",
"Add a Worksheet to a Workbook": "Добавить Рабочую лист в Рабочую книгу",
"Get Table Rows": "Получить строки таблиц",
"Get Table Columns": "Получить колонки таблицы",
"Create Table": "Создать таблицу",
"Delete Table": "Удалить таблицу",
"Lookup Table Column": "Столбец таблицы поиска",
"Append Rows to a Table": "Добавить строки в таблицу",
"Convert to Range": "Преобразовать в диапазон",
"Create Workbook": "Создать Рабочую книгу",
"Custom API Call": "Пользовательский вызов API",
"Append row of values to a worksheet": "Добавить строку значений в таблицу",
"Retrieve worksheets from a workbook": "Получение таблиц из книги",
"Retrieve rows from a worksheet": "Получить строки из листа",
"Update a row in a worksheet": "Обновить строку в листе",
"Clear a worksheet": "Очистить таблицу",
"Delete a worksheet in a workbook": "Удалить таблицу в рабочей книге",
"Retrieve a list of workbooks": "Получить список книг",
"Delete a workbook": "Удалить Рабочую книгу",
"Add a worksheet to a workbook": "Добавить таблицу в Рабочую книгу",
"List rows of a table in a worksheet": "Список строк таблицы в рабочей таблице",
"List columns of a table in a worksheet": "Список столбцов таблицы в листе",
"Create a table in a worksheet": "Создать таблицу в листе",
"Delete a table from a worksheet": "Удалить таблицу из листа",
"Lookup a value in a table column in a worksheet": "Поиск значения в столбце таблицы в листе",
"Append rows to a table": "Добавить строки в таблицу",
"Converts a table to a range": "Преобразует таблицу в диапазон",
"Create a new workbook at the specified location": "Создать новую книгу в указанном месте",
"Make a custom API call to a specific endpoint": "Сделать пользовательский API вызов к определенной конечной точке",
"Workbook": "Рабочая книга",
"Worksheet": "Рабочий лист",
"Does the first row contain headers?": "Содержит ли первая строка заголовки?",
"Values": "Значения",
"Return All": "Вернуть все",
"Limit": "Лимит",
"Range": "Range",
"Header Row": "Строка заголовка",
"First Data Row": "Первая строка данных",
"Row number": "Номер строки",
"Worksheet Name": "Название рабочей таблицы",
"Table": "Таблица",
"Select Range": "Выберите диапазон",
"Has Headers": "Имеет заголовки",
"Lookup Column": "Столбец поиска",
"Lookup Value": "Значение поиска",
"Return All Matches": "Вернуть все матчи",
"Name": "Наименование",
"Parent Folder": "Родительская папка",
"Method": "Метод",
"Headers": "Заголовки",
"Query Parameters": "Параметры запроса",
"Body": "Тело",
"No Error on Failure": "Нет ошибок при ошибке",
"Timeout (in seconds)": "Таймаут (в секундах)",
"If the first row is headers": "Если первая строка - заголовки",
"The values to insert": "Значения для вставки",
"If checked, all worksheets will be returned": "Если отмечено, все рабочие таблицы будут возвращены",
"Limit the number of worksheets returned": "Ограничить количество возвращенных таблиц",
"Range of the rows to retrieve (e.g., A2:B2)": "Диапазон строк для извлечения (например, A2:B2)",
"Row number of the header": "Номер строки заголовка",
"Row number of the first data row": "Номер строки первой строки данных",
"The row number to update": "Номер строки для обновления",
"The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet": "Диапазон в нотации A1 (например, A2:B2) для очистки в таблице, если она не предусмотрена, очистить всю таблицу",
"Limits the number of workbooks returned, returns all workbooks if empty": "Ограничивает количество возвращенных книг, возвращает все книги, если пусто",
"The name of the new worksheet": "Название новой рабочей таблицы",
"Limit the number of rows retrieved": "Ограничить количество строк",
"Limit the number of columns retrieved": "Ограничить количество полученных столбцов",
"How to select the range for the table": "Как выбрать диапазон для таблицы",
"The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table": "Диапазон ячеек в нотации А1 (например, A2:B2), который будет преобразован в таблицу",
"Whether the range has column labels": "Содержит ли диапазон метки столбцов",
"The column name to lookup the value in": "Название столбца для поиска значения в",
"The value to lookup": "Значение поиска",
"If checked, all matching rows will be returned": "Если отмечено, все соответствующие строки будут возвращены",
"The name of the new workbook": "Название новой рабочей книги",
"The parent folder to use": "Родительская папка для использования",
"Authorization headers are injected automatically from your connection.": "Заголовки авторизации включаются автоматически из вашего соединения.",
"GET": "ПОЛУЧИТЬ",
"POST": "ПОСТ",
"PATCH": "ПАТЧ",
"PUT": "ПОКУПИТЬ",
"DELETE": "УДАЛИТЬ",
"HEAD": "HEAD",
"New Row": "Новая строка",
"Trigger when a new row is added, and it can include existing rows as well.": "Срабатывать при добавлении новой строки, она также может включать существующие строки.",
"Max Rows to Poll": "Максимум строк для опроса",
"The maximum number of rows to poll, the rest will be polled on the next run.": "Максимальное количество строк для опроса, остальные будут опрошены в следующем порядке."
}

View File

@@ -0,0 +1,148 @@
{
"Spreadsheet software by Microsoft": "Spreadsheet software by Microsoft",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add ": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - Files.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Append Row to Worksheet": "Append Row to Worksheet",
"Get Worksheets": "Get Worksheets",
"Get Worksheet Rows": "Get Worksheet Rows",
"Update Worksheet Rows": "Update Worksheet Rows",
"Clear Worksheet": "Clear Worksheet",
"Delete Worksheet": "Delete Worksheet",
"Get Workbooks": "Get Workbooks",
"Delete Workbook": "Delete Workbook",
"Add a Worksheet to a Workbook": "Add a Worksheet to a Workbook",
"Get Table Rows": "Get Table Rows",
"Get Table Columns": "Get Table Columns",
"Create Table": "Create Table",
"Delete Table": "Delete Table",
"Lookup Table Column": "Lookup Table Column",
"Append Rows to a Table": "Append Rows to a Table",
"Convert to Range": "Convert to Range",
"Create Workbook": "Create Workbook",
"Clear Column by Index": "Clear Column by Index",
"Clear Cells by Range": "Clear Cells by Range",
"Clear Row by ID": "Clear Row by ID",
"Create Worksheet": "Create Worksheet",
"Find Row": "Find Row",
"Get Cells in Range": "Get Cells in Range",
"Get Row by ID": "Get Row by ID",
"Get Worksheet by ID": "Get Worksheet by ID",
"Rename Worksheet": "Rename Worksheet",
"Custom API Call": "Custom API Call",
"Append row of values to a worksheet": "Append row of values to a worksheet",
"Retrieve worksheets from a workbook": "Retrieve worksheets from a workbook",
"Retrieve rows from a worksheet": "Retrieve rows from a worksheet",
"Update a row in a worksheet": "Update a row in a worksheet",
"Clear a worksheet": "Clear a worksheet",
"Delete a worksheet in a workbook": "Delete a worksheet in a workbook",
"Retrieve a list of workbooks": "Retrieve a list of workbooks",
"Delete a workbook": "Delete a workbook",
"Add a worksheet to a workbook": "Add a worksheet to a workbook",
"List rows of a table in a worksheet": "List rows of a table in a worksheet",
"List columns of a table in a worksheet": "List columns of a table in a worksheet",
"Create a table in a worksheet": "Create a table in a worksheet",
"Delete a table from a worksheet": "Delete a table from a worksheet",
"Lookup a value in a table column in a worksheet": "Lookup a value in a table column in a worksheet",
"Append rows to a table": "Append rows to a table",
"Converts a table to a range": "Converts a table to a range",
"Create a new workbook at the specified location": "Create a new workbook at the specified location",
"Clear contents/formatting of a column by its index.": "Clear contents/formatting of a column by its index.",
"Clear a block of cells (range) content or formatting.": "Clear a block of cells (range) content or formatting.",
"Clear contents/formatting of an entire row by its ID.": "Clear contents/formatting of an entire row by its ID.",
"Add a new worksheet (tab) to an existing workbook with optional default headers.": "Add a new worksheet (tab) to an existing workbook with optional default headers.",
"Locate a row by specifying a lookup column and value (e.g. find a row where “ID” = 123).": "Locate a row by specifying a lookup column and value (e.g. find a row where “ID” = 123).",
"Retrieve the values in a given cell range (e.g., “A1:C10”).": "Retrieve the values in a given cell range (e.g., “A1:C10”).",
"  Retrieve the entire content of a row by its row ID.": "  Retrieve the entire content of a row by its row ID.",
"Retrieve metadata of a worksheet by its ID.": "Retrieve metadata of a worksheet by its ID.",
"Change the name of an existing worksheet.": "Change the name of an existing worksheet.",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Workbook": "Workbook",
"Worksheet": "Worksheet",
"Does the first row contain headers?": "Does the first row contain headers?",
"Values": "Values",
"Return All": "Return All",
"Limit": "Limit",
"Range": "Range",
"Header Row": "Header Row",
"First Data Row": "First Data Row",
"Row number": "Row number",
"Worksheet Name": "Worksheet Name",
"Table": "Table",
"Select Range": "Select Range",
"Has Headers": "Has Headers",
"Lookup Column": "Lookup Column",
"Lookup Value": "Lookup Value",
"Return All Matches": "Return All Matches",
"Name": "Name",
"Parent Folder": "Parent Folder",
"Column Index": "Column Index",
"Clear Type": "Clear Type",
"Row Number": "Row Number",
"Headers": "Headers",
"Row ID (Index)": "Row ID (Index)",
"New Worksheet Name": "New Worksheet Name",
"Method": "Method",
"Query Parameters": "Query Parameters",
"Body": "Body",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"If the first row is headers": "If the first row is headers",
"The values to insert": "The values to insert",
"If checked, all worksheets will be returned": "If checked, all worksheets will be returned",
"Limit the number of worksheets returned": "Limit the number of worksheets returned",
"Range of the rows to retrieve (e.g., A2:B2)": "Range of the rows to retrieve (e.g., A2:B2)",
"Row number of the header": "Row number of the header",
"Row number of the first data row": "Row number of the first data row",
"The row number to update": "The row number to update",
"The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet": "The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet",
"Limits the number of workbooks returned, returns all workbooks if empty": "Limits the number of workbooks returned, returns all workbooks if empty",
"The name of the new worksheet": "The name of the new worksheet",
"Limit the number of rows retrieved": "Limit the number of rows retrieved",
"Limit the number of columns retrieved": "Limit the number of columns retrieved",
"How to select the range for the table": "How to select the range for the table",
"The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table": "The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table",
"Whether the range has column labels": "Whether the range has column labels",
"The column name to lookup the value in": "The column name to lookup the value in",
"The value to lookup": "The value to lookup",
"If checked, all matching rows will be returned": "If checked, all matching rows will be returned",
"The name of the new workbook": "The name of the new workbook",
"The parent folder to use": "The parent folder to use",
"The 1-based index of the column to be cleared (e.g., 1 for column A, 2 for column B).": "The 1-based index of the column to be cleared (e.g., 1 for column A, 2 for column B).",
"Specify what to clear from the column.": "Specify what to clear from the column.",
"The range of cells to clear, in A1 notation (e.g., \"A1:C5\").": "The range of cells to clear, in A1 notation (e.g., \"A1:C5\").",
"Specify what to clear from the range.": "Specify what to clear from the range.",
"The number of the row to be cleared (e.g., 5 for the 5th row).": "The number of the row to be cleared (e.g., 5 for the 5th row).",
"Specify what to clear from the row.": "Specify what to clear from the row.",
"The name for the new worksheet. If not provided, a default name like 'Sheet1' will be assigned.": "The name for the new worksheet. If not provided, a default name like 'Sheet1' will be assigned.",
"Optional: A list of headers to add to the first row. A table will be created from these headers.": "Optional: A list of headers to add to the first row. A table will be created from these headers.",
"The column to search in.": "The column to search in.",
"The value to find in the lookup column.": "The value to find in the lookup column.",
"The range of cells to retrieve, in A1 notation (e.g., \"A1:C10\").": "The range of cells to retrieve, in A1 notation (e.g., \"A1:C10\").",
"The zero-based index of the row to retrieve (e.g., 0 for the first row, 1 for the second).": "The zero-based index of the row to retrieve (e.g., 0 for the first row, 1 for the second).",
"\nThe new name for the worksheet. The name must adhere to the following rules:\n- Cannot be blank.\n- Cannot exceed 31 characters.\n- Must not contain any of the following characters: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- The name \"History\" is reserved by Excel and cannot be used.\n": "\nThe new name for the worksheet. The name must adhere to the following rules:\n- Cannot be blank.\n- Cannot exceed 31 characters.\n- Must not contain any of the following characters: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- The name \"History\" is reserved by Excel and cannot be used.\n",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"All (Contents and Formatting)": "All (Contents and Formatting)",
"Contents Only": "Contents Only",
"Formats Only": "Formats Only",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Row": "New Row",
"New Row in Table": "New Row in Table",
"New Worksheet": "New Worksheet",
"Updated Row": "Updated Row",
"Trigger when a new row is added, and it can include existing rows as well.": "Trigger when a new row is added, and it can include existing rows as well.",
"Fires when a new row is added to a table within a worksheet.": "Fires when a new row is added to a table within a worksheet.",
"Fires when a new worksheet is created in a workbook.": "Fires when a new worksheet is created in a workbook.",
"Fires when a row (in a worksheet) is added or updated.": "Fires when a row (in a worksheet) is added or updated.",
"Max Rows to Poll": "Max Rows to Poll",
"My table has headers": "My table has headers",
"First row has headers": "First row has headers",
"The maximum number of rows to poll, the rest will be polled on the next run.": "The maximum number of rows to poll, the rest will be polled on the next run.",
"Enable this if the first row of your table is a header row.": "Enable this if the first row of your table is a header row.",
"Enable this if the first row of your worksheet should be treated as headers.": "Enable this if the first row of your worksheet should be treated as headers."
}

View File

@@ -0,0 +1,98 @@
{
"Microsoft Excel 365": "Microsoft Excel 365",
"Spreadsheet software by Microsoft": "Spreadsheet software by Microsoft",
"Authentication for Microsoft Excel 365": "Authentication for Microsoft Excel 365",
"Append Row to Worksheet": "Append Row to Worksheet",
"Get Worksheets": "Get Worksheets",
"Get Worksheet Rows": "Get Worksheet Rows",
"Update Worksheet Rows": "Update Worksheet Rows",
"Clear Worksheet": "Clear Worksheet",
"Delete Worksheet": "Delete Worksheet",
"Get Workbooks": "Get Workbooks",
"Delete Workbook": "Delete Workbook",
"Add a Worksheet to a Workbook": "Add a Worksheet to a Workbook",
"Get Table Rows": "Get Table Rows",
"Get Table Columns": "Get Table Columns",
"Create Table": "Create Table",
"Delete Table": "Delete Table",
"Lookup Table Column": "Lookup Table Column",
"Append Rows to a Table": "Append Rows to a Table",
"Convert to Range": "Convert to Range",
"Create Workbook": "Create Workbook",
"Custom API Call": "Custom API Call",
"Append row of values to a worksheet": "Append row of values to a worksheet",
"Retrieve worksheets from a workbook": "Retrieve worksheets from a workbook",
"Retrieve rows from a worksheet": "Retrieve rows from a worksheet",
"Update a row in a worksheet": "Update a row in a worksheet",
"Clear a worksheet": "Clear a worksheet",
"Delete a worksheet in a workbook": "Delete a worksheet in a workbook",
"Retrieve a list of workbooks": "Retrieve a list of workbooks",
"Delete a workbook": "Delete a workbook",
"Add a worksheet to a workbook": "Add a worksheet to a workbook",
"List rows of a table in a worksheet": "List rows of a table in a worksheet",
"List columns of a table in a worksheet": "List columns of a table in a worksheet",
"Create a table in a worksheet": "Create a table in a worksheet",
"Delete a table from a worksheet": "Delete a table from a worksheet",
"Lookup a value in a table column in a worksheet": "Lookup a value in a table column in a worksheet",
"Append rows to a table": "Append rows to a table",
"Converts a table to a range": "Converts a table to a range",
"Create a new workbook at the specified location": "Create a new workbook at the specified location",
"Make a custom API call to a specific endpoint": "Make a custom API call to a specific endpoint",
"Workbook": "Workbook",
"Worksheet": "Worksheet",
"Does the first row contain headers?": "Does the first row contain headers?",
"Values": "Values",
"Return All": "Return All",
"Limit": "Limit",
"Range": "Range",
"Header Row": "Header Row",
"First Data Row": "First Data Row",
"Row number": "Row number",
"Worksheet Name": "Worksheet Name",
"Table": "Table",
"Select Range": "Select Range",
"Has Headers": "Has Headers",
"Lookup Column": "Lookup Column",
"Lookup Value": "Lookup Value",
"Return All Matches": "Return All Matches",
"Name": "Name",
"Parent Folder": "Parent Folder",
"Method": "Method",
"Headers": "Headers",
"Query Parameters": "Query Parameters",
"Body": "Body",
"No Error on Failure": "No Error on Failure",
"Timeout (in seconds)": "Timeout (in seconds)",
"If the first row is headers": "If the first row is headers",
"The values to insert": "The values to insert",
"If checked, all worksheets will be returned": "If checked, all worksheets will be returned",
"Limit the number of worksheets returned": "Limit the number of worksheets returned",
"Range of the rows to retrieve (e.g., A2:B2)": "Range of the rows to retrieve (e.g., A2:B2)",
"Row number of the header": "Row number of the header",
"Row number of the first data row": "Row number of the first data row",
"The row number to update": "The row number to update",
"The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet": "The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet",
"Limits the number of workbooks returned, returns all workbooks if empty": "Limits the number of workbooks returned, returns all workbooks if empty",
"The name of the new worksheet": "The name of the new worksheet",
"Limit the number of rows retrieved": "Limit the number of rows retrieved",
"Limit the number of columns retrieved": "Limit the number of columns retrieved",
"How to select the range for the table": "How to select the range for the table",
"The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table": "The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table",
"Whether the range has column labels": "Whether the range has column labels",
"The column name to lookup the value in": "The column name to lookup the value in",
"The value to lookup": "The value to lookup",
"If checked, all matching rows will be returned": "If checked, all matching rows will be returned",
"The name of the new workbook": "The name of the new workbook",
"The parent folder to use": "The parent folder to use",
"Authorization headers are injected automatically from your connection.": "Authorization headers are injected automatically from your connection.",
"GET": "GET",
"POST": "POST",
"PATCH": "PATCH",
"PUT": "PUT",
"DELETE": "DELETE",
"HEAD": "HEAD",
"New Row": "New Row",
"Trigger when a new row is added, and it can include existing rows as well.": "Trigger when a new row is added, and it can include existing rows as well.",
"Max Rows to Poll": "Max Rows to Poll",
"The maximum number of rows to poll, the rest will be polled on the next run.": "The maximum number of rows to poll, the rest will be polled on the next run."
}

View File

@@ -0,0 +1,148 @@
{
"Spreadsheet software by Microsoft": "Spreadsheet software by Microsoft",
"\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add ": "\n1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).\n2. From the left sidebar, go to **Microsoft Enfra ID**.\n3. Under **Manage**, click on **App registrations**.\n4. Click the **New registration** button.\n5. Enter a **Name** for your app.\n6. For **Supported account types**, choose:\n - **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**\n - Or select based on your requirement.\n7. In **Redirect URI**, select **Web** and add the given URL.\n8. Click **Register**.\n9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.\n10. From the left menu, go to **Certificates & secrets**.\n - Under **Client secrets**, click **New client secret**.\n - Provide a description, set an expiry, and click **Add**.\n - Copy the **Value** of the client secret (this will not be shown again).\n11. Go to **API permissions** from the left menu.\n - Click **Add a permission**.\n - Select **Microsoft Graph** → **Delegated permissions**.\n - Add the following scopes:\n - Files.ReadWrite\n - offline_access\n - Click **Add permissions**.\n12. Copy your **Client ID** and **Client Secret**.\n",
"Append Row to Worksheet": "Append Row to Worksheet",
"Get Worksheets": "Get Worksheets",
"Get Worksheet Rows": "Get Worksheet Rows",
"Update Worksheet Rows": "Update Worksheet Rows",
"Clear Worksheet": "Clear Worksheet",
"Delete Worksheet": "Delete Worksheet",
"Get Workbooks": "Get Workbooks",
"Delete Workbook": "Delete Workbook",
"Add a Worksheet to a Workbook": "Add a Worksheet to a Workbook",
"Get Table Rows": "Get Table Rows",
"Get Table Columns": "Get Table Columns",
"Create Table": "Create Table",
"Delete Table": "Delete Table",
"Lookup Table Column": "Lookup Table Column",
"Append Rows to a Table": "Append Rows to a Table",
"Convert to Range": "Convert to Range",
"Create Workbook": "Create Workbook",
"Clear Column by Index": "Clear Column by Index",
"Clear Cells by Range": "Clear Cells by Range",
"Clear Row by ID": "Clear Row by ID",
"Create Worksheet": "创建工作表",
"Find Row": "Find Row",
"Get Cells in Range": "Get Cells in Range",
"Get Row by ID": "Get Row by ID",
"Get Worksheet by ID": "Get Worksheet by ID",
"Rename Worksheet": "Rename Worksheet",
"Custom API Call": "自定义 API 呼叫",
"Append row of values to a worksheet": "Append row of values to a worksheet",
"Retrieve worksheets from a workbook": "Retrieve worksheets from a workbook",
"Retrieve rows from a worksheet": "Retrieve rows from a worksheet",
"Update a row in a worksheet": "Update a row in a worksheet",
"Clear a worksheet": "Clear a worksheet",
"Delete a worksheet in a workbook": "Delete a worksheet in a workbook",
"Retrieve a list of workbooks": "Retrieve a list of workbooks",
"Delete a workbook": "Delete a workbook",
"Add a worksheet to a workbook": "Add a worksheet to a workbook",
"List rows of a table in a worksheet": "List rows of a table in a worksheet",
"List columns of a table in a worksheet": "List columns of a table in a worksheet",
"Create a table in a worksheet": "Create a table in a worksheet",
"Delete a table from a worksheet": "Delete a table from a worksheet",
"Lookup a value in a table column in a worksheet": "Lookup a value in a table column in a worksheet",
"Append rows to a table": "Append rows to a table",
"Converts a table to a range": "Converts a table to a range",
"Create a new workbook at the specified location": "Create a new workbook at the specified location",
"Clear contents/formatting of a column by its index.": "Clear contents/formatting of a column by its index.",
"Clear a block of cells (range) content or formatting.": "Clear a block of cells (range) content or formatting.",
"Clear contents/formatting of an entire row by its ID.": "Clear contents/formatting of an entire row by its ID.",
"Add a new worksheet (tab) to an existing workbook with optional default headers.": "Add a new worksheet (tab) to an existing workbook with optional default headers.",
"Locate a row by specifying a lookup column and value (e.g. find a row where “ID” = 123).": "Locate a row by specifying a lookup column and value (e.g. find a row where “ID” = 123).",
"Retrieve the values in a given cell range (e.g., “A1:C10”).": "Retrieve the values in a given cell range (e.g., “A1:C10”).",
"  Retrieve the entire content of a row by its row ID.": "  Retrieve the entire content of a row by its row ID.",
"Retrieve metadata of a worksheet by its ID.": "Retrieve metadata of a worksheet by its ID.",
"Change the name of an existing worksheet.": "Change the name of an existing worksheet.",
"Make a custom API call to a specific endpoint": "将一个自定义 API 调用到一个特定的终点",
"Workbook": "Workbook",
"Worksheet": "Worksheet",
"Does the first row contain headers?": "第一行是否包含标题?",
"Values": "值",
"Return All": "Return All",
"Limit": "Limit",
"Range": "Range",
"Header Row": "Header Row",
"First Data Row": "First Data Row",
"Row number": "Row number",
"Worksheet Name": "Worksheet Name",
"Table": "表",
"Select Range": "Select Range",
"Has Headers": "Has Headers",
"Lookup Column": "Lookup Column",
"Lookup Value": "Lookup Value",
"Return All Matches": "Return All Matches",
"Name": "名称",
"Parent Folder": "父文件夹",
"Column Index": "列索引",
"Clear Type": "Clear Type",
"Row Number": "行号",
"Headers": "信头",
"Row ID (Index)": "Row ID (Index)",
"New Worksheet Name": "New Worksheet Name",
"Method": "方法",
"Query Parameters": "查询参数",
"Body": "正文内容",
"Response is Binary ?": "Response is Binary ?",
"No Error on Failure": "失败时没有错误",
"Timeout (in seconds)": "超时(秒)",
"If the first row is headers": "如果第一行是头部",
"The values to insert": "要插入的值",
"If checked, all worksheets will be returned": "If checked, all worksheets will be returned",
"Limit the number of worksheets returned": "Limit the number of worksheets returned",
"Range of the rows to retrieve (e.g., A2:B2)": "Range of the rows to retrieve (e.g., A2:B2)",
"Row number of the header": "Row number of the header",
"Row number of the first data row": "Row number of the first data row",
"The row number to update": "要更新的行数",
"The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet": "The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet",
"Limits the number of workbooks returned, returns all workbooks if empty": "Limits the number of workbooks returned, returns all workbooks if empty",
"The name of the new worksheet": "The name of the new worksheet",
"Limit the number of rows retrieved": "Limit the number of rows retrieved",
"Limit the number of columns retrieved": "Limit the number of columns retrieved",
"How to select the range for the table": "How to select the range for the table",
"The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table": "The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table",
"Whether the range has column labels": "Whether the range has column labels",
"The column name to lookup the value in": "The column name to lookup the value in",
"The value to lookup": "The value to lookup",
"If checked, all matching rows will be returned": "If checked, all matching rows will be returned",
"The name of the new workbook": "The name of the new workbook",
"The parent folder to use": "The parent folder to use",
"The 1-based index of the column to be cleared (e.g., 1 for column A, 2 for column B).": "The 1-based index of the column to be cleared (e.g., 1 for column A, 2 for column B).",
"Specify what to clear from the column.": "Specify what to clear from the column.",
"The range of cells to clear, in A1 notation (e.g., \"A1:C5\").": "The range of cells to clear, in A1 notation (e.g., \"A1:C5\").",
"Specify what to clear from the range.": "Specify what to clear from the range.",
"The number of the row to be cleared (e.g., 5 for the 5th row).": "The number of the row to be cleared (e.g., 5 for the 5th row).",
"Specify what to clear from the row.": "Specify what to clear from the row.",
"The name for the new worksheet. If not provided, a default name like 'Sheet1' will be assigned.": "The name for the new worksheet. If not provided, a default name like 'Sheet1' will be assigned.",
"Optional: A list of headers to add to the first row. A table will be created from these headers.": "Optional: A list of headers to add to the first row. A table will be created from these headers.",
"The column to search in.": "The column to search in.",
"The value to find in the lookup column.": "The value to find in the lookup column.",
"The range of cells to retrieve, in A1 notation (e.g., \"A1:C10\").": "The range of cells to retrieve, in A1 notation (e.g., \"A1:C10\").",
"The zero-based index of the row to retrieve (e.g., 0 for the first row, 1 for the second).": "The zero-based index of the row to retrieve (e.g., 0 for the first row, 1 for the second).",
"\nThe new name for the worksheet. The name must adhere to the following rules:\n- Cannot be blank.\n- Cannot exceed 31 characters.\n- Must not contain any of the following characters: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- The name \"History\" is reserved by Excel and cannot be used.\n": "\nThe new name for the worksheet. The name must adhere to the following rules:\n- Cannot be blank.\n- Cannot exceed 31 characters.\n- Must not contain any of the following characters: `/`, `\\`, `?`, `*`, `:`, `[`, `]`.\n- The name \"History\" is reserved by Excel and cannot be used.\n",
"Authorization headers are injected automatically from your connection.": "授权头自动从您的连接中注入。",
"Enable for files like PDFs, images, etc..": "Enable for files like PDFs, images, etc..",
"All (Contents and Formatting)": "All (Contents and Formatting)",
"Contents Only": "Contents Only",
"Formats Only": "Formats Only",
"GET": "获取",
"POST": "帖子",
"PATCH": "PATCH",
"PUT": "弹出",
"DELETE": "删除",
"HEAD": "黑色",
"New Row": "New Row",
"New Row in Table": "New Row in Table",
"New Worksheet": "新建工作表",
"Updated Row": "Updated Row",
"Trigger when a new row is added, and it can include existing rows as well.": "Trigger when a new row is added, and it can include existing rows as well.",
"Fires when a new row is added to a table within a worksheet.": "Fires when a new row is added to a table within a worksheet.",
"Fires when a new worksheet is created in a workbook.": "Fires when a new worksheet is created in a workbook.",
"Fires when a row (in a worksheet) is added or updated.": "Fires when a row (in a worksheet) is added or updated.",
"Max Rows to Poll": "Max Rows to Poll",
"My table has headers": "My table has headers",
"First row has headers": "First row has headers",
"The maximum number of rows to poll, the rest will be polled on the next run.": "The maximum number of rows to poll, the rest will be polled on the next run.",
"Enable this if the first row of your table is a header row.": "Enable this if the first row of your table is a header row.",
"Enable this if the first row of your worksheet should be treated as headers.": "Enable this if the first row of your worksheet should be treated as headers."
}

View File

@@ -0,0 +1,131 @@
import { createCustomApiCallAction } from '@activepieces/pieces-common';
import {
createPiece,
OAuth2PropertyValue,
PieceAuth
} from '@activepieces/pieces-framework';
import { PieceCategory } from '@activepieces/shared';
import { addWorksheetAction } from './lib/actions/add-worksheet';
import { appendRowAction } from './lib/actions/append-row';
import { appendTableRowsAction } from './lib/actions/append-table-rows';
import { clearWorksheetAction } from './lib/actions/clear-worksheet';
import { convertToRangeAction } from './lib/actions/convert-to-range';
import { createTableAction } from './lib/actions/create-table';
import { createWorkbook } from './lib/actions/create-workbook';
import { deleteTableAction } from './lib/actions/delete-table';
import { deleteWorkbookAction } from './lib/actions/delete-workbook';
import { deleteWorksheetAction } from './lib/actions/delete-worksheet';
import { getTableColumnsAction } from './lib/actions/get-table-columns';
import { getTableRowsAction } from './lib/actions/get-table-rows';
import { getWorkbooksAction } from './lib/actions/get-workbooks';
import { getWorksheetRowsAction } from './lib/actions/get-worksheet-rows';
import { getWorksheetsAction } from './lib/actions/get-worksheets';
import { lookupTableColumnAction } from './lib/actions/lookup-table-column';
import { updateRowAction } from './lib/actions/update-row';
import { clearRangeAction } from './lib/actions/clear-cells-by-range';
import { clearColumnAction } from './lib/actions/clear-column-by-index';
import { clearRowAction } from './lib/actions/clear-row-by-id';
import { createWorksheetAction } from './lib/actions/create-worksheet';
import { findRowAction } from './lib/actions/find-row';
import { getRangeAction } from './lib/actions/get-cells-in-range';
import { getRowAction } from './lib/actions/get-row-by-id';
import { getWorksheetAction } from './lib/actions/get-worksheet-by-id';
import { renameWorksheetAction } from './lib/actions/rename-worksheet';
import { readNewRows } from './lib/trigger/new-row-added';
import { newRowInTableTrigger } from './lib/trigger/new-row-in-table';
import { newWorksheetTrigger } from './lib/trigger/new-worksheet';
import { updatedRowTrigger } from './lib/trigger/updated-row';
import { excelCommon } from './lib/common/common';
import { get } from 'http';
const authDesc = `
1. Sign in to [Microsoft Azure Portal](https://portal.azure.com/).
2. From the left sidebar, go to **Microsoft Enfra ID**.
3. Under **Manage**, click on **App registrations**.
4. Click the **New registration** button.
5. Enter a **Name** for your app.
6. For **Supported account types**, choose:
- **Accounts in any organizational directory (Any Microsoft Entra ID tenant - Multitenant) and personal Microsoft accounts**
- Or select based on your requirement.
7. In **Redirect URI**, select **Web** and add the given URL.
8. Click **Register**.
9. After registration, youll be redirected to the apps overview page. Copy the **Application (client) ID**.
10. From the left menu, go to **Certificates & secrets**.
- Under **Client secrets**, click **New client secret**.
- Provide a description, set an expiry, and click **Add**.
- Copy the **Value** of the client secret (this will not be shown again).
11. Go to **API permissions** from the left menu.
- Click **Add a permission**.
- Select **Microsoft Graph** → **Delegated permissions**.
- Add the following scopes:
- Files.ReadWrite
- offline_access
- Click **Add permissions**.
12. Copy your **Client ID** and **Client Secret**.
`;
export const excelAuth = PieceAuth.OAuth2({
description: authDesc,
authUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
tokenUrl: 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
required: true,
scope: ['Files.ReadWrite', 'offline_access'],
prompt: 'omit'
});
export const microsoftExcel = createPiece({
displayName: 'Microsoft Excel 365',
description: 'Spreadsheet software by Microsoft',
auth: excelAuth,
minimumSupportedRelease: '0.30.0',
logoUrl: 'https://cdn.activepieces.com/pieces/microsoft-excel-365.png',
categories: [PieceCategory.PRODUCTIVITY],
authors: ['BastienMe', 'kishanprmr', 'MoShizzle', 'abuaboud', 'Pranith124', 'onyedikachi-david'],
actions: [
appendRowAction,
getWorksheetsAction,
getWorksheetRowsAction,
updateRowAction,
clearWorksheetAction,
deleteWorksheetAction,
getWorkbooksAction,
deleteWorkbookAction,
addWorksheetAction,
getTableRowsAction,
getTableColumnsAction,
createTableAction,
deleteTableAction,
lookupTableColumnAction,
appendTableRowsAction,
convertToRangeAction,
createWorkbook,
clearColumnAction,
clearRangeAction,
clearRowAction,
createWorksheetAction,
findRowAction,
getRangeAction,
getRowAction,
getWorksheetAction,
renameWorksheetAction,
createCustomApiCallAction({
baseUrl: () => excelCommon.baseUrl,
auth: excelAuth,
authMapping: async (auth) => ({
Authorization: `Bearer ${(auth as OAuth2PropertyValue).access_token}`
})
})
],
triggers: [
readNewRows,
newRowInTableTrigger,
newWorksheetTrigger,
updatedRowTrigger
]
});

View File

@@ -0,0 +1,45 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType,
HttpRequest,
} from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
export const addWorksheetAction = createAction({
auth: excelAuth,
name: 'add_worksheet',
description: 'Add a worksheet to a workbook',
displayName: 'Add a Worksheet to a Workbook',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_name: Property.ShortText({
displayName: 'Worksheet Name',
description: 'The name of the new worksheet',
required: false,
defaultValue: 'Sheet',
}),
},
async run({ propsValue, auth }) {
const workbook_id = propsValue['workbook_id'];
const worksheet_name = propsValue['worksheet_name'];
const request: HttpRequest = {
method: HttpMethod.POST,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/worksheets`,
body: {
name: worksheet_name,
},
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth['access_token'],
},
};
const response = await httpClient.sendRequest(request);
return response.body;
},
});

View File

@@ -0,0 +1,66 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType,
HttpRequest,
} from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon, objectToArray } from '../common/common';
export const appendRowAction = createAction({
auth: excelAuth,
name: 'append_row',
description: 'Append row of values to a worksheet',
displayName: 'Append Row to Worksheet',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
first_row_headers: Property.Checkbox({
displayName: 'Does the first row contain headers?',
description: 'If the first row is headers',
required: true,
defaultValue: false,
}),
values: excelCommon.values,
},
async run({ propsValue, auth }) {
const workbookId = propsValue['workbook_id'];
const worksheetId = propsValue['worksheet_id'];
const values = propsValue.first_row_headers
? objectToArray(propsValue['values'])
: Object.values(propsValue['values'])[0];
const lastUsedRow = await excelCommon.getLastUsedRow(
workbookId,
worksheetId,
auth['access_token'],
);
const lastUsedColumn = excelCommon.numberToColumnName(Object.values(values).length);
const rangeFrom = `A${lastUsedRow + 1}`;
const rangeTo = `${lastUsedColumn}${lastUsedRow + 1}`;
const url = `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/range(address='${rangeFrom}:${rangeTo}')`;
const requestBody = {
values: [values],
};
const request: HttpRequest = {
method: HttpMethod.PATCH,
url: url,
body: requestBody,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth['access_token'],
},
headers: {
'Content-Type': 'application/json',
},
};
const response = await httpClient.sendRequest(request);
return response.body;
},
});

View File

@@ -0,0 +1,41 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType,
} from '@activepieces/pieces-common';
import { excelAuth } from '../..';
import { excelCommon } from '../common/common';
export const appendTableRowsAction = createAction({
auth: excelAuth,
name: 'append_table_rows',
description: 'Append rows to a table',
displayName: 'Append Rows to a Table',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
table_id: excelCommon.table_id,
values: excelCommon.table_values,
},
async run({ propsValue, auth }) {
const workbookId = propsValue['workbook_id'];
const worksheetId = propsValue['worksheet_id'];
const tableId = propsValue['table_id'];
const valuesToAppend = [Object.values(propsValue['values'])];
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/rows`,
body: {
values: valuesToAppend,
},
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth['access_token'],
},
});
return response.body;
},
});

View File

@@ -0,0 +1,70 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType
} from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
export const clearRangeAction = createAction({
auth: excelAuth,
name: 'clear_range',
displayName: 'Clear Cells by Range',
description: 'Clear a block of cells (range) content or formatting.',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
range: Property.ShortText({
displayName: 'Range',
description:
'The range of cells to clear, in A1 notation (e.g., "A1:C5").',
required: true
}),
applyTo: Property.StaticDropdown({
displayName: 'Clear Type',
description: 'Specify what to clear from the range.',
required: true,
defaultValue: 'All',
options: {
options: [
{
label: 'All (Contents and Formatting)',
value: 'All'
},
{
label: 'Contents Only',
value: 'Contents'
},
{
label: 'Formats Only',
value: 'Formats'
}
]
}
})
},
async run(context) {
const { workbook_id, worksheet_id, range, applyTo } = context.propsValue;
const { access_token } = context.auth;
if (!/^[A-Z]+[1-9][0-9]*(:[A-Z]+[1-9][0-9]*)?$/.test(range as string)) {
throw new Error('Invalid range format. Please use A1 notation (e.g., "A1" or "A1:C5").');
}
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/worksheets/${worksheet_id}/range(address='${range}')/clear`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: access_token
},
body: {
applyTo: applyTo
}
});
// A successful request returns a 200 OK with no body.
return response.body;
}
});

View File

@@ -0,0 +1,81 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType
} from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
export const clearColumnAction = createAction({
auth: excelAuth,
name: 'clear_column',
displayName: 'Clear Column by Index',
description: 'Clear contents/formatting of a column by its index.',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
column_index: Property.Number({
displayName: 'Column Index',
description:
'The 1-based index of the column to be cleared (e.g., 1 for column A, 2 for column B).',
required: true
}),
applyTo: Property.StaticDropdown({
displayName: 'Clear Type',
description: 'Specify what to clear from the column.',
required: true,
defaultValue: 'All',
options: {
options: [
{
label: 'All (Contents and Formatting)',
value: 'All'
},
{
label: 'Contents Only',
value: 'Contents'
},
{
label: 'Formats Only',
value: 'Formats'
}
]
}
})
},
async run(context) {
const { workbook_id, worksheet_id, column_index, applyTo } =
context.propsValue;
const { access_token } = context.auth;
if (
typeof column_index !== 'number' ||
!Number.isInteger(column_index) ||
column_index < 1
) {
throw new Error('Column index must be a positive integer.');
}
// Convert 1-based index to Excel column letter (e.g., 1 -> 'A')
const columnLetter = excelCommon.numberToColumnName(column_index);
// Construct the range address for the entire column, e.g., 'C:C'
const columnAddress = `${columnLetter}:${columnLetter}`;
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/worksheets/${worksheet_id}/range(address='${columnAddress}')/clear`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: access_token
},
body: {
applyTo: applyTo
}
});
// A successful request returns a 200 OK with no body.
return response.body;
}
});

View File

@@ -0,0 +1,69 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { httpClient, HttpMethod, AuthenticationType } from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
export const clearRowAction = createAction({
auth: excelAuth,
name: 'clear_row',
displayName: 'Clear Row by ID',
description: 'Clear contents/formatting of an entire row by its ID.',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
row_id: Property.Number({
displayName: 'Row Number',
description: 'The number of the row to be cleared (e.g., 5 for the 5th row).',
required: true,
}),
applyTo: Property.StaticDropdown({
displayName: "Clear Type",
description: "Specify what to clear from the row.",
required: true,
defaultValue: 'All',
options: {
options: [
{
label: 'All (Contents and Formatting)',
value: 'All'
},
{
label: 'Contents Only',
value: 'Contents'
},
{
label: 'Formats Only',
value: 'Formats'
}
]
}
})
},
async run(context) {
const { workbook_id, worksheet_id, row_id, applyTo } = context.propsValue;
const { access_token } = context.auth;
if (typeof row_id !== 'number' || !Number.isInteger(row_id) || row_id < 1) {
throw new Error('Row index must be a positive integer.');
}
// Construct the range address for the entire row, e.g., '5:5'
const rowAddress = `${row_id}:${row_id}`;
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/worksheets/${worksheet_id}/range(address='${rowAddress}')/clear`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: access_token,
},
body: {
applyTo: applyTo,
},
});
// A successful request returns a 200 OK with no body.
return response.body;
},
});

View File

@@ -0,0 +1,54 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType,
} from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
export const clearWorksheetAction = createAction({
auth: excelAuth,
name: 'clear_worksheet',
description: 'Clear a worksheet',
displayName: 'Clear Worksheet',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
range: Property.ShortText({
displayName: 'Range',
description:
'The range in A1 notation (e.g., A2:B2) to clear in the worksheet, if not provided, clear the entire worksheet',
required: false,
}),
},
async run({ propsValue, auth }) {
const workbookId = propsValue['workbook_id'];
const worksheetId = propsValue['worksheet_id'];
const range = propsValue['range'];
let url = `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/`;
// If range is not provided, clear the entire worksheet
if (!range) {
url += 'usedRange(valuesOnly=true)/clear';
} else {
url += `range(address = '${range}')/clear`;
}
const request = {
method: HttpMethod.POST,
url: url,
body: {
applyTo: 'contents',
},
authentication: {
type: AuthenticationType.BEARER_TOKEN as const,
token: auth['access_token'],
},
};
const response = await httpClient.sendRequest(request);
return response.body;
},
});

View File

@@ -0,0 +1,36 @@
import { createAction } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType,
} from '@activepieces/pieces-common';
import { excelCommon } from '../common/common';
import { excelAuth } from '../../index';
export const convertToRangeAction = createAction({
auth: excelAuth,
name: 'convert_to_range',
description: 'Converts a table to a range',
displayName: 'Convert to Range',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
table_id: excelCommon.table_id,
},
async run({ propsValue, auth }) {
const workbookId = propsValue['workbook_id'];
const worksheetId = propsValue['worksheet_id'];
const tableId = propsValue['table_id'];
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/convertToRange`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth['access_token'],
},
});
return response.body;
},
});

View File

@@ -0,0 +1,94 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType,
} from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
export const createTableAction = createAction({
auth: excelAuth,
name: 'create_table',
description: 'Create a table in a worksheet',
displayName: 'Create Table',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
selectRange: Property.Dropdown({
auth: excelAuth,
displayName: 'Select Range',
description: 'How to select the range for the table',
required: true,
options: async () => {
return {
disabled: false,
options: [
{
label: 'Automatically',
value: 'auto',
},
{
label: 'Manually',
value: 'manual',
},
],
defaultValue: 'auto',
};
},
refreshers: [],
}),
range: Property.ShortText({
displayName: 'Range',
description:
'The range of cells in A1 notation (e.g., A2:B2) that will be converted to a table',
required: false,
defaultValue: 'A1:B2',
}),
hasHeaders: Property.Checkbox({
displayName: 'Has Headers',
description: 'Whether the range has column labels',
required: true,
defaultValue: true,
}),
},
async run({ propsValue, auth }) {
const workbookId = propsValue['workbook_id'];
const worksheetId = propsValue['worksheet_id'];
const selectRange = propsValue['selectRange'];
const hasHeaders = propsValue['hasHeaders'];
let range: string | undefined;
if (selectRange === 'auto') {
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/usedRange`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth['access_token'],
},
queryParams: {
select: 'address',
},
});
range = response.body['address'].split('!')[1];
} else {
range = propsValue['range'];
}
const result = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/add`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth['access_token'],
},
body: {
address: range,
hasHeaders,
},
});
return result.body;
},
});

View File

@@ -0,0 +1,45 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
import {
httpClient,
HttpMethod,
AuthenticationType,
} from '@activepieces/pieces-common';
export const createWorkbook = createAction({
auth: excelAuth,
name: 'createWorkbook',
displayName: 'Create Workbook',
description: 'Create a new workbook at the specified location',
props: {
name: Property.ShortText({
displayName: "Name",
description: "The name of the new workbook",
required: true
}),
parentFolder: excelCommon.parent_folder
},
async run(context) {
const { name, parentFolder } = context.propsValue
const response = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${excelCommon.baseUrl}/${parentFolder === 'root' ? '' : 'items/'}${parentFolder}/children`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: context.auth['access_token'],
},
headers: {
'Content-Type': 'application/json'
},
body: {
file: {},
name: name.endsWith('.xlsx') ? name : `${name}.xlsx`,
'@microsoft.graph.conflictBehavior': 'rename'
}
})
return response
}
});

View File

@@ -0,0 +1,102 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
import {
httpClient,
HttpMethod,
AuthenticationType
} from '@activepieces/pieces-common';
// Define the response type for creating a worksheet for better type-safety
interface CreateWorksheetResponse {
id: string;
name: string;
position: number;
visibility: string;
}
export const createWorksheetAction = createAction({
auth: excelAuth,
name: 'create_worksheet',
displayName: 'Create Worksheet',
description:
'Add a new worksheet (tab) to an existing workbook with optional default headers.',
props: {
workbook_id: excelCommon.workbook_id,
name: Property.ShortText({
displayName: 'Worksheet Name',
description:
"The name for the new worksheet. If not provided, a default name like 'Sheet1' will be assigned.",
required: false
}),
headers: Property.Array({
displayName: 'Headers',
description:
'Optional: A list of headers to add to the first row. A table will be created from these headers.',
required: false
})
},
async run(context) {
const { workbook_id, name, headers } = context.propsValue;
const { access_token } = context.auth;
// Step 1: Create the new worksheet
const createWorksheetResponse =
await httpClient.sendRequest<CreateWorksheetResponse>({
method: HttpMethod.POST,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/worksheets/add`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: access_token
},
body: {
// Conditionally add the name property to the request body if it exists
...(name ? { name } : {})
}
});
const newWorksheetName = createWorksheetResponse.body.name;
// Step 2: If headers are provided, add them and create a table from them
if (headers && Array.isArray(headers) && headers.length > 0) {
const headersArray = headers as string[];
// Calculate the table range, e.g., "A1:C1" for 3 headers
const endColumn = excelCommon.numberToColumnName(headersArray.length);
const address = `A1:${endColumn}1`;
// Add the header values to the first row of the new worksheet
await httpClient.sendRequest({
method: HttpMethod.PATCH,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/worksheets/${newWorksheetName}/range(address='${address}')`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: access_token
},
body: {
values: [headersArray] // Values must be a 2D array
}
});
// Create a table from the newly added header range
const createTableResponse = await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/worksheets/${newWorksheetName}/tables/add`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: access_token
},
body: {
address: address,
hasHeaders: true
}
});
// Return the result of the table creation
return createTableResponse.body;
}
// If no headers were provided, return the result of the worksheet creation
return createWorksheetResponse.body;
}
});

View File

@@ -0,0 +1,36 @@
import { createAction } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType,
} from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
export const deleteTableAction = createAction({
auth: excelAuth,
name: 'delete_table',
description: 'Delete a table from a worksheet',
displayName: 'Delete Table',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
table_id: excelCommon.table_id,
},
async run({ propsValue, auth }) {
const workbookId = propsValue['workbook_id'];
const worksheetId = propsValue['worksheet_id'];
const tableId = propsValue['table_id'];
const response = await httpClient.sendRequest({
method: HttpMethod.DELETE,
url: `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth['access_token'],
},
});
return response.body;
},
});

View File

@@ -0,0 +1,35 @@
import { createAction } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType,
HttpRequest,
} from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
export const deleteWorkbookAction = createAction({
auth: excelAuth,
name: 'delete_workbook',
description: 'Delete a workbook',
displayName: 'Delete Workbook',
props: {
workbook_id: excelCommon.workbook_id,
},
async run({ propsValue, auth }) {
const workbookId = propsValue['workbook_id'];
const accessToken = auth['access_token'];
const request: HttpRequest = {
method: HttpMethod.DELETE,
url: `${excelCommon.baseUrl}/items/${workbookId}`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: accessToken,
},
};
await httpClient.sendRequest(request);
return { success: true };
},
});

View File

@@ -0,0 +1,35 @@
import { createAction } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType,
} from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
export const deleteWorksheetAction = createAction({
auth: excelAuth,
name: 'delete_worksheet',
description: 'Delete a worksheet in a workbook',
displayName: 'Delete Worksheet',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
},
async run({ propsValue, auth }) {
const workbookId = propsValue['workbook_id'];
const worksheetId = propsValue['worksheet_id'];
const request = {
method: HttpMethod.DELETE,
url: `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}`,
authentication: {
type: AuthenticationType.BEARER_TOKEN as const,
token: auth['access_token'],
},
};
const response = await httpClient.sendRequest(request);
return response.body;
},
});

View File

@@ -0,0 +1,121 @@
import {
createAction,
Property,
OAuth2PropertyValue
} from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType
} from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
export const findRowAction = createAction({
auth: excelAuth,
name: 'find_row',
displayName: 'Find Row',
description:
'Locate a row by specifying a lookup column and value (e.g. find a row where “ID” = 123).',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
table_id: excelCommon.table_id,
lookup_column: Property.Dropdown({
auth: excelAuth,
displayName: 'Lookup Column',
description: 'The column to search in.',
required: true,
refreshers: ['workbook_id', 'table_id'],
options: async ({ auth, workbook_id, table_id }) => {
if (!auth || !workbook_id || !table_id) {
return {
disabled: true,
options: [],
placeholder: 'Please select a workbook and table first.'
};
}
const authProp = auth as OAuth2PropertyValue;
const response = await httpClient.sendRequest<{
value: { id: string; name: string }[];
}>({
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/tables/${table_id}/columns`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: authProp.access_token
}
});
return {
disabled: false,
options: response.body.value.map((column) => ({
label: column.name,
value: column.id
}))
};
}
}),
lookup_value: Property.ShortText({
displayName: 'Lookup Value',
description: 'The value to find in the lookup column.',
required: true
})
},
async run(context) {
const { workbook_id, table_id, lookup_column, lookup_value } =
context.propsValue;
const { access_token } = context.auth;
const columnId = lookup_column;
const sanitizedValue = (lookup_value as string).replace(/'/g, "''");
// Define the URL to clear the filter, which will be used in the 'finally' block
const clearFilterUrl = `${excelCommon.baseUrl}/items/${workbook_id}/workbook/tables/${table_id}/columns/${columnId}/filter/clear`;
try {
// Step 1: Apply the filter to the specified column
await httpClient.sendRequest({
method: HttpMethod.POST,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/tables/${table_id}/columns/${columnId}/filter/apply`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: access_token
},
body: {
criteria: {
criterion1: `=${sanitizedValue}`,
filterOn: 'Custom'
}
}
});
// Step 2: Get the visible rows (i.e., the filtered results)
const foundRowsResponse = await httpClient.sendRequest<{
value: unknown[];
}>({
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/tables/${table_id}/range/visibleView/rows`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: access_token
}
});
// The result is the array of rows that matched the filter
return foundRowsResponse.body.value;
} finally {
// Step 3: Clear the filter to restore the table to its original state.
// This runs regardless of whether the previous steps succeeded or failed.
await httpClient.sendRequest({
method: HttpMethod.POST,
url: clearFilterUrl,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: access_token
},
body: {} // Clear action does not require a body
});
}
}
});

View File

@@ -0,0 +1,48 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType
} from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
export const getRangeAction = createAction({
auth: excelAuth,
name: 'get_range',
displayName: 'Get Cells in Range',
description: 'Retrieve the values in a given cell range (e.g., “A1:C10”).',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
range: Property.ShortText({
displayName: 'Range',
description:
'The range of cells to retrieve, in A1 notation (e.g., "A1:C10").',
required: true
})
},
async run(context) {
const { workbook_id, worksheet_id, range } = context.propsValue;
const { access_token } = context.auth;
if (!/^[A-Z]+[1-9][0-9]*(:[A-Z]+[1-9][0-9]*)?$/.test(range as string)) {
throw new Error(
'Invalid range format. Please use A1 notation (e.g., "A1" or "A1:C5").'
);
}
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/worksheets/${worksheet_id}/range(address='${range}')`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: access_token
}
});
// The response body contains the workbookRange object with details
// like values, text, formulas, rowCount, etc.
return response.body;
}
});

View File

@@ -0,0 +1,67 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType,
HttpError
} from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
export const getRowAction = createAction({
auth: excelAuth,
name: 'getRowById',
displayName: 'Get Row by ID',
description: '  Retrieve the entire content of a row by its row ID.',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
table_id: excelCommon.table_id,
row_id: Property.Number({
displayName: 'Row ID (Index)',
description:
'The zero-based index of the row to retrieve (e.g., 0 for the first row, 1 for the second).',
required: true
})
},
async run(context) {
const { workbook_id, table_id, row_id } = context.propsValue;
const { access_token } = context.auth;
const maxRetries = 3;
let attempt = 0;
while (attempt < maxRetries) {
try {
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/tables/${table_id}/rows/itemAt(index=${row_id})`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: access_token
}
});
return response.body;
} catch (error) {
const httpError = error as HttpError;
if (httpError.response?.status === 503 && attempt < maxRetries - 1) {
const delayMs = 2 ** attempt * 1000;
console.warn(
`Excel API is unavailable (503). Retrying after ${delayMs}ms... (Attempt ${
attempt + 1
}/${maxRetries})`
);
await delay(delayMs);
attempt++;
} else {
throw error;
}
}
}
throw new Error(
'Failed to retrieve row after multiple retries due to API unavailability.'
);
}
});

View File

@@ -0,0 +1,52 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { excelCommon } from '../common/common';
import { excelAuth } from '../..';
import {
httpClient,
HttpMethod,
AuthenticationType,
} from '@activepieces/pieces-common';
export const getTableColumnsAction = createAction({
auth: excelAuth,
name: 'get_table_columns',
description: 'List columns of a table in a worksheet',
displayName: 'Get Table Columns',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
table: excelCommon.table_id,
limit: Property.Number({
displayName: 'Limit',
description: 'Limit the number of columns retrieved',
required: false,
}),
},
async run({ propsValue, auth }) {
const workbookId = propsValue['workbook_id'];
const worksheetId = propsValue['worksheet_id'];
const tableId = propsValue['table'];
const limit = propsValue['limit'];
let url = `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/columns`;
if (limit) {
url += `?$top=${limit}`;
}
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: url,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth['access_token'],
},
});
const columnNames = response.body['value'].map(
(column: { name: any }) => column.name
);
return columnNames;
},
});

View File

@@ -0,0 +1,52 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { excelCommon } from '../common/common';
import { excelAuth } from '../..';
import {
httpClient,
HttpMethod,
AuthenticationType,
} from '@activepieces/pieces-common';
export const getTableRowsAction = createAction({
auth: excelAuth,
name: 'get_table_rows',
description: 'List rows of a table in a worksheet',
displayName: 'Get Table Rows',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
table: excelCommon.table_id,
limit: Property.Number({
displayName: 'Limit',
description: 'Limit the number of rows retrieved',
required: false,
}),
},
async run({ propsValue, auth }) {
const workbookId = propsValue['workbook_id'];
const worksheetId = propsValue['worksheet_id'];
const tableId = propsValue['table'];
const limit = propsValue['limit'];
let url = `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/rows`;
if (limit) {
url += `?$top=${limit}`;
}
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: url,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth['access_token'],
},
});
const rowsValues = response.body['value'].map(
(row: { values: any[] }) => row.values[0]
);
return rowsValues;
},
});

View File

@@ -0,0 +1,56 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType,
} from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
export const getWorkbooksAction = createAction({
auth: excelAuth,
name: 'get_workbooks',
description: 'Retrieve a list of workbooks',
displayName: 'Get Workbooks',
props: {
limit: Property.Number({
displayName: 'Limit',
description:
'Limits the number of workbooks returned, returns all workbooks if empty',
required: false,
}),
},
async run({ propsValue, auth }) {
const limit = propsValue['limit'];
const queryParams: any = {
$filter:
"file ne null and file/mimeType eq 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'",
};
if (limit !== null && limit !== undefined) {
queryParams.$top = limit.toString();
}
const request = {
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/root/search(q='.xlsx')`,
authentication: {
type: AuthenticationType.BEARER_TOKEN as const,
token: auth['access_token'],
},
queryParams: queryParams,
};
const response = await httpClient.sendRequest(request);
const workbooks = response.body['value'].map(
(item: { id: any; name: any; webUrl: any }) => ({
id: item.id,
name: item.name,
webUrl: item.webUrl,
})
);
return workbooks;
},
});

View File

@@ -0,0 +1,33 @@
import { createAction } from '@activepieces/pieces-framework';
import { httpClient, HttpMethod, AuthenticationType } from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
export const getWorksheetAction = createAction({
auth: excelAuth,
name: 'get_worksheet',
displayName: 'Get Worksheet by ID',
description: 'Retrieve metadata of a worksheet by its ID.',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id, // This dropdown provides the worksheet name as its value
},
async run(context) {
const { workbook_id, worksheet_id } = context.propsValue;
const { access_token } = context.auth;
// The worksheet_id prop from excelCommon returns the worksheet's name,
// which can be used to identify it in the API URL as per the documentation ({id|name}).
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/worksheets/${worksheet_id}`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: access_token,
},
});
// The response body contains the workbookWorksheet object with its metadata.
return response.body;
},
});

View File

@@ -0,0 +1,73 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType,
} from '@activepieces/pieces-common';
import { excelCommon } from '../common/common';
import { excelAuth } from '../../index';
export const getWorksheetRowsAction = createAction({
auth: excelAuth,
name: 'get_worksheet_rows',
description: 'Retrieve rows from a worksheet',
displayName: 'Get Worksheet Rows',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
range: Property.ShortText({
displayName: 'Range',
description: 'Range of the rows to retrieve (e.g., A2:B2)',
required: false,
}),
headerRow: Property.Number({
displayName: 'Header Row',
description: 'Row number of the header',
required: false,
}),
firstDataRow: Property.Number({
displayName: 'First Data Row',
description: 'Row number of the first data row',
required: false,
}),
},
async run({ propsValue, auth }) {
const workbookId = propsValue['workbook_id'];
const worksheetId = propsValue['worksheet_id'];
const range = propsValue['range'];
const headerRow = propsValue['headerRow'];
const firstDataRow = propsValue['firstDataRow'];
let url = `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/`;
if (!range) {
url += 'usedRange(valuesOnly=true)';
} else {
url += `range(address = '${range}')`;
}
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: url,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth['access_token'],
},
});
const rows = response.body['values'];
if (headerRow && firstDataRow) {
return rows.slice(firstDataRow - 1).map((row: any[]) => {
const obj: { [key: string]: any } = {};
rows[headerRow - 1].forEach(
(header: any, colIndex: string | number) => {
obj[String(header)] = row[Number(colIndex)];
}
);
return obj;
});
}
return rows;
},
});

View File

@@ -0,0 +1,59 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { httpClient, HttpMethod } from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
export const getWorksheetsAction = createAction({
auth: excelAuth,
name: 'get_worksheets',
description: 'Retrieve worksheets from a workbook',
displayName: 'Get Worksheets',
props: {
workbook: excelCommon.workbook_id,
returnAll: Property.Checkbox({
displayName: 'Return All',
description: 'If checked, all worksheets will be returned',
required: false,
defaultValue: false,
}),
limit: Property.Number({
displayName: 'Limit',
description: 'Limit the number of worksheets returned',
required: false,
defaultValue: 10,
}),
},
async run({ propsValue, auth }) {
const workbookId = propsValue['workbook'];
const returnAll = propsValue['returnAll'];
const limit = propsValue['limit'];
const endpoint = `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets`;
const headers = {
Authorization: `Bearer ${auth['access_token']}`,
'Content-Type': 'application/json',
};
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: endpoint,
headers: headers,
});
if (response.status !== 200) {
throw new Error(`Failed to retrieve worksheet: ${response.body}`);
}
const worksheets = response.body['value'];
if (returnAll) {
return worksheets;
} else {
const limitedWorksheets = [];
for (let i = 0; i < Math.min(worksheets['length'], limit ?? 0); i++) {
limitedWorksheets.push(worksheets[i]);
}
return limitedWorksheets;
}
},
});

View File

@@ -0,0 +1,88 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType,
} from '@activepieces/pieces-common';
import { excelAuth } from '../..';
import { excelCommon } from '../common/common';
export const lookupTableColumnAction = createAction({
auth: excelAuth,
name: 'lookup_table_column',
description: 'Lookup a value in a table column in a worksheet',
displayName: 'Lookup Table Column',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
table_id: excelCommon.table_id,
lookup_column: Property.ShortText({
displayName: 'Lookup Column',
description: 'The column name to lookup the value in',
required: true,
}),
lookup_value: Property.ShortText({
displayName: 'Lookup Value',
description: 'The value to lookup',
required: true,
}),
return_all_matches: Property.Checkbox({
displayName: 'Return All Matches',
description: 'If checked, all matching rows will be returned',
required: false,
defaultValue: false,
}),
},
async run({ propsValue, auth }) {
const workbookId = propsValue['workbook_id'];
const worksheetId = propsValue['worksheet_id'];
const tableName = propsValue['table_id'];
const lookupColumn = propsValue['lookup_column'];
const lookupValue = propsValue['lookup_value'];
const returnAllMatches = propsValue['return_all_matches'];
const rowsUrl = `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableName}/rows`;
const rowsResponse = await httpClient.sendRequest({
method: HttpMethod.GET,
url: rowsUrl,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth['access_token'],
},
});
const columnsUrl = `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableName}/columns`;
const columnsResponse = await httpClient.sendRequest({
method: HttpMethod.GET,
url: columnsUrl,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth['access_token'],
},
});
const columns = columnsResponse.body['value'];
const columnIndex = columns.findIndex(
(column: any) => column.name === lookupColumn
);
if (columnIndex === -1) {
throw new Error(`Column "${lookupColumn}" not found in the table.`);
}
const rows = rowsResponse.body['value'];
const matchedRows = rows.filter(
(row: any) => row.values[0][columnIndex] === lookupValue
);
const matchedValues = matchedRows.map(
(row: { values: any[] }) => row.values[0]
);
if (returnAllMatches) {
return matchedValues;
} else {
return matchedValues[0] || null;
}
},
});

View File

@@ -0,0 +1,52 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType
} from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon } from '../common/common';
const namingRules = `
The new name for the worksheet. The name must adhere to the following rules:
- Cannot be blank.
- Cannot exceed 31 characters.
- Must not contain any of the following characters: \`/\`, \`\\\`, \`?\`, \`*\`, \`:\`, \`[\`, \`]\`.
- The name "History" is reserved by Excel and cannot be used.
`;
export const renameWorksheetAction = createAction({
auth: excelAuth,
name: 'rename_worksheet',
displayName: 'Rename Worksheet',
description: 'Change the name of an existing worksheet.',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
new_name: Property.ShortText({
displayName: 'New Worksheet Name',
description: namingRules,
required: true
})
},
async run(context) {
const { workbook_id, worksheet_id, new_name } = context.propsValue;
const { access_token } = context.auth;
// The worksheet_id prop from excelCommon returns the worksheet's current name,
// which can be used to identify it in the API URL.
const response = await httpClient.sendRequest({
method: HttpMethod.PATCH,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/worksheets/${worksheet_id}`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: access_token
},
body: {
name: new_name
}
});
return response.body;
}
});

View File

@@ -0,0 +1,58 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { httpClient, HttpMethod, AuthenticationType } from '@activepieces/pieces-common';
import { excelAuth } from '../../index';
import { excelCommon, objectToArray } from '../common/common';
export const updateRowAction = createAction({
auth: excelAuth,
name: 'update_row',
description: 'Update a row in a worksheet',
displayName: 'Update Worksheet Rows',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
row_number: Property.Number({
displayName: 'Row number',
description: 'The row number to update',
required: true,
}),
first_row_headers: Property.Checkbox({
displayName: 'Does the first row contain headers?',
description: 'If the first row is headers',
required: true,
defaultValue: false,
}),
values: excelCommon.values,
},
async run({ propsValue, auth }) {
const workbookId = propsValue['workbook_id'];
const worksheetId = propsValue['worksheet_id'];
const rowNumber = propsValue['row_number'];
const values = propsValue.first_row_headers
? objectToArray(propsValue['values'])
: Object.values(propsValue['values']);
const requestBody = {
values: [values],
};
const lastUsedColumn = excelCommon.numberToColumnName(Object.values(values).length);
const rangeFrom = `A${rowNumber}`;
const rangeTo = `${lastUsedColumn}${rowNumber}`;
const request = {
method: HttpMethod.PATCH,
url: `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/range(address='${rangeFrom}:${rangeTo}')`,
body: requestBody,
authentication: {
type: AuthenticationType.BEARER_TOKEN as const,
token: auth['access_token'],
},
};
const response = await httpClient.sendRequest(request);
return response.body;
},
});

View File

@@ -0,0 +1,407 @@
import { Property, OAuth2PropertyValue } from '@activepieces/pieces-framework';
import {
httpClient,
HttpMethod,
AuthenticationType,
HttpRequest
} from '@activepieces/pieces-common';
import { isNil } from '@activepieces/shared';
import { excelAuth } from '../..';
export const excelCommon = {
baseUrl: 'https://graph.microsoft.com/v1.0/me/drive',
workbook_id: Property.Dropdown({
auth: excelAuth,
displayName: 'Workbook',
required: true,
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please authenticate first'
};
}
const authProp: OAuth2PropertyValue = auth as OAuth2PropertyValue;
const workbooks: { id: string; name: string }[] = (
await httpClient.sendRequest<{ value: { id: string; name: string }[] }>(
{
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/items/root/search(q='.xlsx')?$select=id,name`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: authProp['access_token']
}
}
)
).body.value;
return {
disabled: false,
options: workbooks.map((workbook: { id: string; name: string }) => {
return {
label: workbook.name,
value: workbook.id
};
})
};
},
refreshers: []
}),
worksheet_id: Property.Dropdown({
auth: excelAuth,
displayName: 'Worksheet',
required: true,
refreshers: ['workbook_id'],
options: async ({ auth, workbook_id }) => {
if (!auth || !workbook_id) {
return {
disabled: true,
options: [],
placeholder: 'Please select a workbook first'
};
}
const authProp: OAuth2PropertyValue = auth as OAuth2PropertyValue;
const worksheets: { id: string; name: string }[] = (
await httpClient.sendRequest<{ value: { id: string; name: string }[] }>(
{
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/worksheets?$select=id,name`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: authProp['access_token']
}
}
)
).body.value;
return {
disabled: false,
options: worksheets.map((worksheet: { id: string; name: string }) => {
return {
label: worksheet.name,
value: worksheet.name
};
})
};
}
}),
table_id: Property.Dropdown({
auth: excelAuth,
displayName: 'Table',
required: true,
refreshers: ['workbook_id', 'worksheet_id'],
options: async ({ auth, workbook_id, worksheet_id }) => {
if (!auth || !workbook_id || !worksheet_id) {
return {
disabled: true,
options: [],
placeholder: 'Please select a workbook and worksheet first'
};
}
const authProp: OAuth2PropertyValue = auth as OAuth2PropertyValue;
const tables: { id: string; name: string }[] = (
await httpClient.sendRequest<{ value: { id: string; name: string }[] }>(
{
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/items/${workbook_id}/workbook/worksheets/${worksheet_id}/tables`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: authProp['access_token']
}
}
)
).body.value;
return {
disabled: false,
options: tables.map((table: { id: string; name: string }) => {
return {
label: table.name,
value: table.id
};
})
};
}
}),
values: Property.DynamicProperties({
auth: excelAuth,
displayName: 'Values',
description: 'The values to insert',
required: true,
refreshers: ['workbook_id', 'worksheet_id', 'first_row_headers'],
props: async ({ auth, workbook_id, worksheet_id, first_row_headers }) => {
if (
!auth ||
(workbook_id ?? '').toString().length === 0 ||
(worksheet_id ?? '').toString().length === 0
) {
return {};
}
const authProp: OAuth2PropertyValue = auth as OAuth2PropertyValue;
if (!first_row_headers) {
return {
values: Property.Array({
displayName: 'Values',
required: true
})
};
}
const firstRow = await excelCommon.getHeaders(
workbook_id as unknown as string,
authProp['access_token'],
worksheet_id as unknown as string
);
const properties: {
[key: string]: any;
} = {};
for (const key in firstRow) {
properties[key] = Property.ShortText({
displayName: firstRow[key].toString(),
description: firstRow[key].toString(),
required: false,
defaultValue: ''
});
}
return properties;
}
}),
table_values: Property.DynamicProperties({
auth: excelAuth,
displayName: 'Values',
description: 'The values to insert',
required: true,
refreshers: ['workbook_id', 'worksheet_id', 'table_id'],
props: async ({ auth, workbook_id, worksheet_id, table_id }) => {
if (
!auth ||
(workbook_id ?? '').toString().length === 0 ||
(worksheet_id ?? '').toString().length === 0 ||
(worksheet_id ?? '').toString().length === 0
) {
return {};
}
const authProp: OAuth2PropertyValue = auth as OAuth2PropertyValue;
const headers = await excelCommon.getTableHeaders(
workbook_id as unknown as string,
authProp['access_token'],
worksheet_id as unknown as string,
table_id as unknown as string
);
const properties: {
[key: string]: any;
} = {};
for (const key in headers) {
properties[key] = Property.ShortText({
displayName: headers[key].toString(),
description: headers[key].toString(),
required: false,
defaultValue: ''
});
}
return properties;
}
}),
parent_folder: Property.Dropdown({
auth: excelAuth,
displayName: 'Parent Folder',
description: 'The parent folder to use',
required: true,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
options: [],
placeholder: 'Please authenticate first'
};
}
const authProp: OAuth2PropertyValue = auth as OAuth2PropertyValue;
const rootFolderId = 'root';
const allFolders: { id: string; name: string }[] =
await excelCommon.getAllFolders(
rootFolderId,
authProp['access_token'],
''
);
allFolders.unshift({
id: rootFolderId,
name: '/'
});
return {
disabled: false,
options: allFolders.map((table: { id: string; name: string }) => {
return {
label: table.name,
value: table.id
};
})
};
}
}),
getHeaders: async function (
workbookId: string,
accessToken: string,
worksheetId: string
) {
const response = await httpClient.sendRequest<{
values: (string | number | boolean)[][];
}>({
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/usedRange(valuesOnly=true)`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: accessToken
}
});
return response.body.values?.[0] ?? [];
},
getTableHeaders: async function (
workbookId: string,
accessToken: string,
worksheetId: string,
tableId: string
) {
const response = await httpClient.sendRequest({
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/tables/${tableId}/columns`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: accessToken
}
});
const columnNames = response.body['value'].map(
(column: { name: any }) => column.name
);
return columnNames;
},
getLastUsedRow: async function (
workbookId: string,
worksheetId: string,
accessToken: string
): Promise<number> {
const url = `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/usedRange`;
const request: HttpRequest = {
method: HttpMethod.GET,
url: url,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: accessToken
}
};
const response = await httpClient.sendRequest(request);
const usedRange = response.body['address'].split('!')[1];
const lastCell = usedRange.indexOf(':') != -1 ? usedRange.split(':')[1] : usedRange;
const lastRow = parseInt(lastCell.match(/\d+/)[0], 10);
return lastRow;
},
getLastUsedColumn: async function (
workbookId: string,
worksheetId: string,
accessToken: string
): Promise<string> {
const url = `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/usedRange`;
const request: HttpRequest = {
method: HttpMethod.GET,
url: url,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: accessToken
}
};
const response = await httpClient.sendRequest(request);
const usedRange = response.body['address'].split('!')[1];
const [, lastCell] = usedRange.split(':');
const lastColumnLetter = lastCell.match(/[A-Z]+/)[0];
return lastColumnLetter;
},
getAllRows: async function (
workbookId: string,
worksheetId: string,
accessToken: string
): Promise<(string | number | boolean)[][]> {
const response = await httpClient.sendRequest<{
values: (string | number | boolean)[][];
}>({
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets/${worksheetId}/usedRange(valuesOnly=true)`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: accessToken
}
});
return response.body['values'] ?? [];
},
numberToColumnName: function (num: number): string {
let columnName = '';
while (num > 0) {
const modulo = (num - 1) % 26;
columnName = String.fromCharCode(65 + modulo) + columnName;
num = Math.floor((num - modulo) / 26);
}
return columnName;
},
getAllFolders: async function (
folderId: string,
authToken: string,
currentPath: string
): Promise<{ id: string; name: string }[]> {
const apiUrl = `${excelCommon.baseUrl}/items/${folderId}/children?$filter=folder ne null`;
const response = await httpClient.sendRequest<{
value: { id: string; name: string; folder?: unknown }[];
}>({
url: apiUrl,
method: HttpMethod.GET,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: authToken
}
});
if (!response.body || !response.body.value) {
return [];
}
const folders = response.body.value.map((folder) => ({
id: `${folder.id}`,
name: `${currentPath}/${folder.name}`
}));
let allSubFolders: { id: string; name: string }[] = [...folders];
for (const folder of folders) {
const subFolders = await excelCommon.getAllFolders(
folder.id,
authToken,
folder.name
);
allSubFolders = allSubFolders.concat(subFolders);
}
return allSubFolders;
}
};
export function objectToArray(obj: { [x: string]: any }) {
const maxIndex = Math.max(...Object.keys(obj).map(Number));
const arr = new Array(maxIndex + 1).fill(null);
for (const key in obj) {
arr[Number(key)] = obj[key];
}
return arr;
}

View File

@@ -0,0 +1,112 @@
import {
AppConnectionValueForAuthProperty,
Property,
createTrigger,
} from '@activepieces/pieces-framework';
import { TriggerStrategy } from '@activepieces/pieces-framework';
import { excelCommon } from '../common/common';
import {
DedupeStrategy,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import { isNil } from '@activepieces/shared';
import { excelAuth } from '../..';
const polling: Polling<
AppConnectionValueForAuthProperty<typeof excelAuth>,
{
workbook_id: string;
worksheet_id: string;
max_rows_to_poll: number | undefined;
}
> = {
strategy: DedupeStrategy.LAST_ITEM,
items: async ({ auth, propsValue, lastItemId }) => {
const fetchedValues =
(await excelCommon.getAllRows(
propsValue.workbook_id,
propsValue.worksheet_id,
auth.access_token
)) ?? [];
const currentValues = fetchedValues.map((row: any[], rowIndex: number) => {
const rowObject: any = {};
row.forEach((cell: any, cellIndex: number) => {
const columnName = String.fromCharCode(65 + cellIndex);
rowObject[columnName] = cell;
});
return {
row: rowIndex + 1,
values: rowObject,
};
});
const items = currentValues
.filter((f: any) => Object.keys(f.values).length > 0)
.map((item: any, index: number) => ({
id: index + 1,
data: item,
}))
.filter(
(f: any) => isNil(lastItemId) || f.data.row > (lastItemId as number)
);
return items.reverse();
},
};
export const readNewRows = createTrigger({
auth: excelAuth,
name: 'new_row',
displayName: 'New Row',
description:
'Trigger when a new row is added, and it can include existing rows as well.',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
max_rows_to_poll: Property.Number({
displayName: 'Max Rows to Poll',
description:
'The maximum number of rows to poll, the rest will be polled on the next run.',
required: false,
defaultValue: 10,
}),
},
type: TriggerStrategy.POLLING,
sampleData: {},
onEnable: async (context) => {
await pollingHelper.onEnable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
onDisable: async (context) => {
await pollingHelper.onDisable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
run: async (context) => {
return await pollingHelper.poll(polling, {
auth: context.auth,
store: context.store,
maxItemsToPoll: Math.max(
1,
Math.min(10, context.propsValue.max_rows_to_poll ?? 10)
),
propsValue: context.propsValue,
files: context.files,
});
},
test: async (context) => {
return await pollingHelper.test(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
files: context.files,
});
},
});

View File

@@ -0,0 +1,170 @@
import {
AppConnectionValueForAuthProperty,
OAuth2PropertyValue,
Property,
createTrigger,
} from '@activepieces/pieces-framework';
import { TriggerStrategy } from '@activepieces/pieces-framework';
import { excelCommon } from '../common/common';
import {
DedupeStrategy,
Polling,
pollingHelper,
httpClient,
HttpMethod,
AuthenticationType
} from '@activepieces/pieces-common';
import { isNil } from '@activepieces/shared';
import { excelAuth } from '../..';
interface TableRow {
index: number;
values: [[string | number | boolean]];
}
// Helper function to get all rows from a specific table
async function getTableRows(auth: OAuth2PropertyValue, workbookId: string, tableId: string): Promise<TableRow[]> {
try {
const response = await httpClient.sendRequest<{ value: TableRow[] }>({
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/items/${workbookId}/workbook/tables/${encodeURIComponent(tableId)}/rows`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth.access_token,
},
});
return response.body.value ?? [];
} catch (error) {
throw new Error(`Failed to fetch table rows: ${error}`);
}
}
const polling: Polling<
AppConnectionValueForAuthProperty<typeof excelAuth>,
{
workbook_id: string;
worksheet_id: string;
table_id: string;
has_headers: boolean;
}
> = {
strategy: DedupeStrategy.LAST_ITEM,
items: async ({ auth, propsValue, lastItemId, store }) => {
const rows = await getTableRows(auth, propsValue.workbook_id, propsValue.table_id);
if (rows.length === 0) {
return [];
}
const cachedHeaders = await store.get<string[]>('table_headers');
let headers: string[] = [];
if (cachedHeaders && cachedHeaders.length > 0) {
headers = cachedHeaders
} else {
try {
headers = await excelCommon.getTableHeaders(
propsValue.workbook_id,
auth.access_token,
propsValue.worksheet_id,
propsValue.table_id
);
await store.put('table_headers', headers);
} catch (error) {
headers = []
}
}
const processedRows = rows.map(row => {
let rowData: Record<string, unknown> = {};
if (propsValue.has_headers && headers.length > 0) {
// Map values to header keys
rowData = headers.reduce((acc, header, index) => {
acc[header] = row.values[0]?.[index] ?? null;
return acc;
}, {} as Record<string, unknown>);
} else {
// Use default column letter keys (A, B, C...)
rowData = row.values[0]?.reduce((acc, value, index) => {
acc[excelCommon.numberToColumnName(index + 1)] = value;
return acc;
}, {} as Record<string, unknown>) ?? {};
}
return {
id: row.index, // The row's zero-based index is its unique ID
data: {
rowIndex: row.index,
values: rowData
}
};
});
// The polling helper will filter for new rows where the ID (row.index) is greater than lastItemId
const newItems = processedRows.filter(item => isNil(lastItemId) || item.id > (lastItemId as number));
return newItems;
}
};
export const newRowInTableTrigger = createTrigger({
auth: excelAuth,
name: 'new_row_in_table',
displayName: 'New Row in Table',
description: 'Fires when a new row is added to a table within a worksheet.',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
table_id: excelCommon.table_id,
has_headers: Property.Checkbox({
displayName: "My table has headers",
description: "Enable this if the first row of your table is a header row.",
required: true,
defaultValue: true,
})
},
type: TriggerStrategy.POLLING,
sampleData: {
"rowIndex": 0,
"values": {
"ID": 1,
"Name": "John Doe",
"Email": "john.doe@example.com"
}
},
onEnable: async (context) => {
await pollingHelper.onEnable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
onDisable: async (context) => {
await pollingHelper.onDisable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
run: async (context) => {
return await pollingHelper.poll(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
files: context.files,
});
},
test: async (context) => {
return await pollingHelper.test(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
files: context.files,
});
},
});

View File

@@ -0,0 +1,118 @@
import {
AppConnectionValueForAuthProperty,
OAuth2PropertyValue,
createTrigger
} from '@activepieces/pieces-framework';
import { TriggerStrategy } from '@activepieces/pieces-framework';
import { excelCommon } from '../common/common';
import { excelAuth } from '../..';
import {
httpClient,
HttpMethod,
AuthenticationType,
Polling,
pollingHelper,
DedupeStrategy
} from '@activepieces/pieces-common';
interface Worksheet {
id: string;
name: string;
position: number;
visibility: string;
}
async function getWorksheets(
auth: OAuth2PropertyValue,
workbookId: string
): Promise<Worksheet[]> {
if (!workbookId) return [];
try {
const response = await httpClient.sendRequest<{ value: Worksheet[] }>({
method: HttpMethod.GET,
url: `${excelCommon.baseUrl}/items/${workbookId}/workbook/worksheets`,
authentication: {
type: AuthenticationType.BEARER_TOKEN,
token: auth.access_token
}
});
return response.body.value ?? [];
} catch (error) {
throw new Error(`Failed to fetch worksheets: ${error}`);
}
}
const polling: Polling<AppConnectionValueForAuthProperty<typeof excelAuth>, { workbook_id: string }> = {
strategy: DedupeStrategy.LAST_ITEM,
items: async ({ auth, propsValue, store }) => {
const worksheets = await getWorksheets(auth, propsValue.workbook_id);
const storedWorksheetIds = await store.get<string[]>('worksheet_ids') ?? [];
const newWorksheets = worksheets.filter(ws => !storedWorksheetIds.includes(ws.id));
const currentWorksheetIds = worksheets.map(ws => ws.id);
await store.put('worksheet_ids', currentWorksheetIds);
const processedWorksheets = newWorksheets.map((worksheet) => ({
id: worksheet.id,
data: worksheet
}));
return processedWorksheets;
}
};
export const newWorksheetTrigger = createTrigger({
auth: excelAuth,
name: 'new_worksheet',
displayName: 'New Worksheet',
description: 'Fires when a new worksheet is created in a workbook.',
props: {
workbook_id: excelCommon.workbook_id
},
type: TriggerStrategy.POLLING,
sampleData: {
'@odata.id':
'/workbook/worksheets(%27%7B00000000-0001-0000-0100-000000000000%7D%27)',
id: '{00000000-0001-0000-0100-000000000000}',
name: 'Sheet2',
position: 1,
visibility: 'Visible'
},
onEnable: async (context) => {
await pollingHelper.onEnable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue
});
},
onDisable: async (context) => {
await pollingHelper.onDisable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue
});
},
run: async (context) => {
return await pollingHelper.poll(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
files: context.files
});
},
test: async (context) => {
return await pollingHelper.test(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
files: context.files
});
}
});

View File

@@ -0,0 +1,155 @@
import {
AppConnectionValueForAuthProperty,
Property,
createTrigger,
} from '@activepieces/pieces-framework';
import { TriggerStrategy } from '@activepieces/pieces-framework';
import { excelCommon } from '../common/common';
import { excelAuth } from '../..';
import {
DedupeStrategy,
Polling,
pollingHelper,
} from '@activepieces/pieces-common';
import { createHmac } from 'node:crypto';
const triggerName = 'updated_row';
function createRowHash(rowData: unknown[]): string {
const rowString = JSON.stringify(rowData);
return createHmac('sha1', 'activepieces').update(rowString).digest('hex');
}
// Helper function to get all worksheet rows with error handling
async function getWorksheetRows(auth: AppConnectionValueForAuthProperty<typeof excelAuth>, workbookId: string, worksheetId: string): Promise<(string | number | boolean)[][]> {
try {
return await excelCommon.getAllRows(workbookId, worksheetId, auth.access_token);
} catch (error) {
throw new Error(`Failed to fetch worksheet rows: ${error}`);
}
}
// Polling implementation using the framework's best practices
const polling: Polling<
AppConnectionValueForAuthProperty<typeof excelAuth>,
{
workbook_id: string;
worksheet_id: string;
has_headers: boolean;
}
> = {
strategy: DedupeStrategy.TIMEBASED,
items: async ({ auth, propsValue, store }) => {
const allRows = await getWorksheetRows(auth, propsValue.workbook_id, propsValue.worksheet_id);
if (allRows.length === 0) {
return [];
}
// Get stored row hashes from previous run
const oldHashes = await store.get<Record<number, string>>('row_hashes') ?? {};
const headers = (propsValue.has_headers && allRows.length > 0) ? allRows[0] : [];
const dataRows = (propsValue.has_headers && allRows.length > 0) ? allRows.slice(1) : allRows;
const currentHashes: Record<number, string> = {};
const changedItems: Array<{ epochMilliSeconds: number; data: unknown }> = [];
const currentTime = Date.now();
// Process each data row
dataRows.forEach((row, index) => {
const rowIndex = propsValue.has_headers ? index + 1 : index;
const newHash = createRowHash(row);
currentHashes[rowIndex] = newHash;
const oldHash = oldHashes[rowIndex];
// Row has changed or is new
if (oldHash !== newHash) {
const formattedRow: Record<string, unknown> = {};
if (propsValue.has_headers && headers.length > 0) {
headers.forEach((header, colIndex) => {
formattedRow[String(header)] = row[colIndex] ?? null;
});
} else {
row.forEach((cell, colIndex) => {
formattedRow[excelCommon.numberToColumnName(colIndex + 1)] = cell;
});
}
changedItems.push({
epochMilliSeconds: currentTime,
data: {
rowIndex: rowIndex + 1, // Make it 1-based for user readability
values: formattedRow,
changeType: oldHash ? 'updated' : 'added'
}
});
}
});
// Update stored hashes for next run
await store.put('row_hashes', currentHashes);
return changedItems;
}
};
export const updatedRowTrigger = createTrigger({
auth: excelAuth,
name: triggerName,
displayName: 'Updated Row',
description: 'Fires when a row (in a worksheet) is added or updated.',
props: {
workbook_id: excelCommon.workbook_id,
worksheet_id: excelCommon.worksheet_id,
has_headers: Property.Checkbox({
displayName: "First row has headers",
description: "Enable this if the first row of your worksheet should be treated as headers.",
required: true,
defaultValue: false,
})
},
type: TriggerStrategy.POLLING,
sampleData: {
"rowIndex": 1,
"values": { "ID": 101, "Product": "Widget", "Price": 19.99 }
},
onEnable: async (context) => {
await pollingHelper.onEnable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
onDisable: async (context) => {
await pollingHelper.onDisable(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
});
},
run: async (context) => {
return await pollingHelper.poll(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
files: context.files,
});
},
test: async (context) => {
return await pollingHelper.test(polling, {
auth: context.auth,
store: context.store,
propsValue: context.propsValue,
files: context.files,
});
},
});

View File

@@ -0,0 +1,20 @@
{
"extends": "../../../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"importHelpers": true
},
"files": [],
"include": [],
"references": [
{
"path": "./tsconfig.lib.json"
}
]
}

View File

@@ -0,0 +1,11 @@
{
"extends": "./tsconfig.json",
"compilerOptions": {
"module": "commonjs",
"outDir": "../../../../dist/out-tsc",
"declaration": true,
"types": ["node"]
},
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"],
"include": ["src/**/*.ts"]
}