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,33 @@
{
"extends": [
"../../../../.eslintrc.base.json"
],
"ignorePatterns": [
"!**/*"
],
"overrides": [
{
"files": [
"*.ts",
"*.tsx",
"*.js",
"*.jsx"
],
"rules": {}
},
{
"files": [
"*.ts",
"*.tsx"
],
"rules": {}
},
{
"files": [
"*.js",
"*.jsx"
],
"rules": {}
}
]
}

View File

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

View File

@@ -0,0 +1,4 @@
{
"name": "@activepieces/piece-smartsheet",
"version": "0.0.7"
}

View File

@@ -0,0 +1,65 @@
{
"name": "pieces-smartsheet",
"$schema": "../../../../node_modules/nx/schemas/project-schema.json",
"sourceRoot": "packages/pieces/community/smartsheet/src",
"projectType": "library",
"release": {
"version": {
"currentVersionResolver": "git-tag",
"preserveLocalDependencyProtocols": false,
"manifestRootsToUpdate": [
"dist/{projectRoot}"
]
}
},
"tags": [],
"targets": {
"build": {
"executor": "@nx/js:tsc",
"outputs": [
"{options.outputPath}"
],
"options": {
"outputPath": "dist/packages/pieces/community/smartsheet",
"tsConfig": "packages/pieces/community/smartsheet/tsconfig.lib.json",
"packageJson": "packages/pieces/community/smartsheet/package.json",
"main": "packages/pieces/community/smartsheet/src/index.ts",
"assets": [
"packages/pieces/community/smartsheet/*.md",
{
"input": "packages/pieces/community/smartsheet/src/i18n",
"output": "./src/i18n",
"glob": "**/!(i18n.json)"
}
],
"buildableProjectDepsInPackageJsonType": "dependencies",
"updateBuildableProjectDepsInPackageJson": true
},
"dependsOn": [
"^build",
"prebuild"
]
},
"nx-release-publish": {
"options": {
"packageRoot": "dist/{projectRoot}"
}
},
"lint": {
"executor": "@nx/eslint:lint",
"outputs": [
"{options.outputFile}"
]
},
"prebuild": {
"executor": "nx:run-commands",
"options": {
"cwd": "packages/pieces/community/smartsheet",
"command": "bun install --no-save --silent"
},
"dependsOn": [
"^build"
]
}
}
}

View File

@@ -0,0 +1,150 @@
{
"Dynamic work execution platform for teams to plan, capture, manage, automate, and report on work at scale.": "Dynamische Arbeitserführungsplattform für Teams zum Planen, Erfassen, Verwalten, Automatisieren und Berichten von Arbeiten in Skala.",
"\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n": "\nUm Ihr Smartsheet Zugangs-Token zu erhalten:\n\n1. Melden Sie sich bei Ihrem Smartsheet Konto an.\n2. Klicken Sie auf Ihr Profilbild in der oberen rechten Ecke.\n3. Wählen Sie im Dropdown-Menü **persönliche Einstellungen** aus.\n4. Klicken Sie im linken Fenster auf **API-Zugang**.\n5. Klicken Sie auf **Generiere neuen Zugangs-Token**.\n6. Geben Sie einen Namen für Ihr Token ein (z.B. \"Activepieces Integration\").\n7. Klicken Sie auf **OK** um den Token zu generieren..\n8. Kopieren Sie den Zugangstoken und fügen Sie ihn in das Verbindungsfeld ein.\n",
"Add Row to Sheet": "Füge Zeile zu Tabelle hinzu",
"Update Row": "Zeile aktualisieren",
"Attach File to Row": "Datei an Zeile anhängen",
"Find Row": "Finde Zeile",
"List Row Attachments": "Listenzeilen-Anhänge",
"Find Sheet(s)": "Tabelle(n) finden",
"Adds new row to a sheet.": "Fügt eine neue Zeile zu einer Tabelle hinzu.",
"Updates an existing row.": "Aktualisiert eine vorhandene Zeile.",
"Adds a file attachment to a row.": "Fügt einen Dateianhang zu einer Zeile hinzu.",
"Finds rows in a specific sheet or across all accessible sheets using text queries with advanced filtering options.": "Findet Datensätze in einem bestimmten Blatt oder über alle zugänglichen Tabellen mit Hilfe von Textabfragen mit erweiterten Filteroptionen.",
"Get all attachments for a specific row in a Smartsheet, including row and discussion-level attachments with comprehensive pagination and filtering options": "Holen Sie sich alle Anhänge für eine bestimmte Zeile in einem Smartsheet, einschließlich Datensatz- und Diskussionsanhänge mit umfassenden Seitenaufzeichnungen und Filteroptionen",
"Fetches existings sheets matching provided filter criteria.": "Ruft vorhandene Tabellen ab, die den angegebenen Filterkriterien entsprechen.",
"Sheet": "Blatt",
"Cells": "Zellen",
"Add Row to Top or Bottom": "Zeile oben oder unten hinzufügen",
"Row": "Zeile",
"Attachment Type": "Anhang-Typ",
"File": "Datei",
"URL": "URL",
"Attachment Name": "Anhangname",
"Attachment Sub Type": "Anhang Untertyp",
"MIME Type": "MIME-Typ",
"Search Scope": "Suchbereich",
"Search Query": "Suchanfrage",
"Search Scopes": "Suchbereiche",
"Include Favorite Flags": "Favoriten einbeziehen",
"Modified Since": "Geändert seit",
"Max Results": "Maximale Ergebnisse",
"Filter by Object Types": "Nach Objekttypen filtern",
"Include All Results": "Alle Ergebnisse einbeziehen",
"Page Number": "Seitennummer",
"Page Size": "Einträge pro Seite",
"Filter by Attachment Type": "Filtern nach Anhang-Typ",
"Filter by Parent Type": "Nach Elterntyp filtern",
"Minimum File Size (KB)": "Minimale Dateigröße (KB)",
"Maximum File Size (KB)": "Maximale Dateigröße (KB)",
"Sheet Name Filter": "Plattennamen-Filter",
"Exact Name Match": "Genaues Namensmatch",
"Access API Level": "Zugriffs-API-Level",
"Filter by Access Level": "Nach Zugriffsebene filtern",
"Include Sheet Version": "Blattversion einschließen",
"Include Source Information": "Quellinformationen einbeziehen",
"Numeric Dates": "Zahlendaten",
"Created Date Range": "Erstellte Datumsbereich",
"Sort Results By": "Ergebnisse sortieren nach",
"Select a sheet": "Wähle ein Blatt",
"Cell data with properties based on column types": "Zellendaten mit Eigenschaften basierend auf Spaltentypen",
"Type of attachment to add": "Anhangtyp zum Hinzufügen",
"The file to attach (required for FILE type)": "Die anzuhängende Datei (erforderlich für DATEI-Typ)",
"The URL to attach (required for URL-based attachment types)": "Die anzuhängende URL (erforderlich für URL-basierte Anhangtypen)",
"Name for the attachment (optional, will use file name or URL if not provided)": "Name für den Anhang (optional, wird Dateiname oder URL verwenden, wenn nicht angegeben)",
"Sub type for Google Drive and Egnyte attachments": "Untertyp für Google Drive und Egnyte Anhänge",
"MIME type of the attachment (optional, auto-detected for files)": "MIME Typ des Anhangs (optional, automatisch erkannt für Dateien)",
"Choose whether to search within a specific sheet or across all accessible sheets.": "Wählen Sie, ob Sie in einem bestimmten Blatt oder in allen zugänglichen Blättern suchen möchten.",
"Text to search for. Use double quotes for exact phrase matching (e.g., \"project status\")": "Text nach dem gesucht werden soll. Verwenden Sie doppelte Anführungszeichen für exakte Suchbegriffe (z.B. \"Projektstatus\")",
"Specify what types of content to search in (leave empty to search all)": "Geben Sie an, in welche Art von Inhalt gesucht werden soll (lassen Sie leer um alle zu suchen)",
"Include information about which items are marked as favorites": "Füge Informationen hinzu, welche Elemente als Favoriten markiert werden",
"Only return results modified on or after this date/time": "Gibt nur Ergebnisse zurück, die am oder nach diesem Datum/der Uhrzeit geändert wurden",
"Maximum number of results to return (default: 50, max: 100)": "Maximale Anzahl der zurückzugebenden Ergebnisse (Standard: 50, max: 100)",
"Only return results of specific object types (leave empty for all types)": "Gibt nur Ergebnisse bestimmter Objekttypen zurück (leer lassen für alle Typen)",
"If true, include all results without pagination (overrides page and page size)": "Wenn aktiviert, alle Ergebnisse ohne Seitennavigation einbeziehen (Überschreibt die Seitengröße und Seitengröße)",
"Which page to return (defaults to 1, ignored if \"Include All Results\" is true)": "Welche Seite zurückgegeben werden soll (standardmäßig 1, ignoriert, wenn \"Alle Ergebnisse einbeziehen\" wahr ist)",
"Maximum number of items to return per page (defaults to 100, max 10000, ignored if \"Include All Results\" is true)": "Maximale Anzahl der Elemente, die pro Seite zurückgegeben werden sollen (Standardwert ist 100, max 10000, ignoriert, wenn \"Alle Ergebnisse einbeziehen\" wahr ist)",
"Only return attachments of specific types (leave empty for all types)": "Nur Anhänge bestimmter Typen zurückgeben (leer lassen für alle Typen)",
"Only return attachments from specific parent types (leave empty for all)": "Nur Anhänge von bestimmten übergeordneten Typen zurückgeben (leer lassen für alle)",
"Only return files with size greater than or equal to this value (applies to FILE type only)": "Gibt nur Dateien mit einer Größe größer oder gleich diesem Wert zurück (gilt nur für DATEI-Typ)",
"Only return files with size less than or equal to this value (applies to FILE type only)": "Gibt nur Dateien mit einer Größe kleiner oder gleich diesem Wert zurück (gilt nur für DATEI-Typ)",
"Filter sheets by name (partial or exact match). Leave empty to list all sheets.": "Tabellen nach Namen filtern (partielle oder exakte Übereinstimmung). Leer lassen um alle Tabellen aufzulisten.",
"When filtering by name, require exact match instead of partial match": "Beim Filtern nach Namen benötigen Sie exakte Übereinstimmung statt partieller Übereinstimmung",
"API access level for viewing and filtering permissions": "API-Zugriffsebene für Anzeige und Filterung von Berechtigungen",
"Only return sheets where you have specific access levels (leave empty for all)": "Nur Tabellen zurückgeben, auf denen Sie bestimmte Zugriffsebenen haben (leer lassen für alle)",
"Only return sheets modified on or after this date/time": "Nur Tabellen zurückgeben, die am oder nach diesem Datum/der Uhrzeit geändert wurden",
"Include current version number of each sheet": "Aktuelle Versionsnummer jedes Blatts einbeziehen",
"Include information about the source (template/sheet) each sheet was created from": "Fügen Sie Informationen über die Quelle (Vorlage/Blatt) ein, aus der jedes Blatt erstellt wurde",
"Return dates as milliseconds since UNIX epoch instead of ISO strings": "Gibt Daten als Millisekunden seit UNIX Epoche anstelle von ISO-Zeichenketten zurück",
"Filter sheets by creation date range": "Tabellen nach Erstellungsdatumsbereich filtern",
"How to sort the returned sheets": "Sortieren der zurückgegebenen Blätter",
"Top of sheet": "Spitze des Blattes",
"Bottom of sheet": "Unterseite des Blattes",
"File Upload": "Datei hochladen",
"URL Link": "URL-Link",
"Box.com": "Box.com",
"Dropbox": "Dropbox",
"Egnyte": "Jörg",
"Evernote": "Evernote",
"Google Drive": "Google Drive",
"OneDrive": "OneDrive",
"Document": "Dokument",
"Drawing": "Zeichnen",
"Folder": "Ordner",
"PDF": "PDF",
"Presentation": "Präsentation",
"Spreadsheet": "Tabellenblatt",
"Specific Sheet": "Spezifisches Blatt",
"All Accessible Sheets": "Alle zugänglichen Blätter",
"Cell Data": "Zellendaten",
"Comments": "Kommentare",
"Attachments": "Anhänge",
"Sheet Names": "Plattennamen",
"Folder Names": "Ordnernamen",
"Report Names": "Berichtsnamen",
"Dashboard Names": "Dashboard-Namen",
"Template Names": "Vorlagennamen",
"Workspace Names": "Name des Arbeitsbereiches",
"Summary Fields": "Zusammenfassung Felder",
"Rows": "Zeilen",
"Sheets": "Blätter",
"Comments/Discussions": "Kommentare/Diskussionen",
"Dashboards": "Dashboards",
"Reports": "Berichte",
"Folders": "Ordner",
"Templates": "Vorlagen",
"Workspaces": "Arbeitsbereiche",
"Files": "Dateien",
"URLs/Links": "URLs/Links",
"Trello": "Tirllo",
"Row Attachments": "Zeilenanhänge",
"Comment Attachments": "Anhänge kommentieren",
"Sheet Attachments": "Plattenanhänge",
"Proof Attachments": "Anhänge nachweisen",
"Viewer (default)": "Viewer (Standard)",
"Commenter": "Kommentar",
"Owner": "Besitzer",
"Admin": "Admin",
"Editor (with sharing)": "Editor (mit Teilen)",
"Editor": "Redakteur",
"Viewer": "Betrachter",
"All time": "Gesamt",
"Last 7 days": "Letzte 7 Tage",
"Last 30 days": "Letzte 30 Tage",
"Last 90 days": "Letzte 90 Tage",
"Last 365 days": "Letzte 365 Tage",
"Sheet Name": "Plattenname",
"Creation Date (newest first)": "Erstellungsdatum (neueste zuerst)",
"Creation Date (oldest first)": "Erstellungsdatum (älteste zuerst)",
"Modified Date (newest first)": "Änderungsdatum (neueste zuerst)",
"Modified Date (oldest first)": "Geändertes Datum (älteste zuerst)",
"Access Level": "Zugriffsebene",
"New Row Added": "Neue Zeile hinzugefügt",
"Row Updated": "Zeile aktualisiert",
"New Attachment Added": "Neuer Anhang hinzugefügt",
"New Comment Added": "Neuer Kommentar hinzugefügt",
"Triggers when a new row is added.": "Wird ausgelöst, wenn eine neue Zeile hinzugefügt wird.",
"Triggers when an existing row is updated.": "Wird ausgelöst, wenn eine vorhandene Zeile aktualisiert wird.",
"Triggers when a new attachment is added to a row or sheet.": "Wird ausgelöst, wenn ein neuer Anhang einer Zeile oder Tabelle hinzugefügt wird.",
"Triggers when a new comment is added to a discussion on a sheet.": "Wird ausgelöst, wenn zu einer Diskussion auf einem Blatt ein neuer Kommentar hinzugefügt wird."
}

View File

@@ -0,0 +1,150 @@
{
"Dynamic work execution platform for teams to plan, capture, manage, automate, and report on work at scale.": "Plataforma dinámica de ejecución de trabajo para equipos para planificar, capturar, administrar, automatizar e informar sobre el trabajo a escala.",
"\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n": "\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n",
"Add Row to Sheet": "Añadir fila a hoja",
"Update Row": "Actualizar fila",
"Attach File to Row": "Adjuntar archivo a la fila",
"Find Row": "Buscar fila",
"List Row Attachments": "Lista de adjuntos de fila",
"Find Sheet(s)": "Buscar hoja(s)",
"Adds new row to a sheet.": "Añade una nueva fila a una hoja.",
"Updates an existing row.": "Actualiza una fila existente.",
"Adds a file attachment to a row.": "Añade un archivo adjunto a una fila.",
"Finds rows in a specific sheet or across all accessible sheets using text queries with advanced filtering options.": "Encuentra registros en una hoja específica o en todas las hojas accesibles usando consultas de texto con opciones avanzadas de filtrado.",
"Get all attachments for a specific row in a Smartsheet, including row and discussion-level attachments with comprehensive pagination and filtering options": "Obtener todos los archivos adjuntos de una fila específica en una hoja inteligente, incluyendo archivos adjuntos a nivel de fila y discusión con opciones completas de paginación y filtrado",
"Fetches existings sheets matching provided filter criteria.": "Obtiene las hojas existentes que coinciden con los criterios de filtro proporcionados.",
"Sheet": "Hoja",
"Cells": "Celdas",
"Add Row to Top or Bottom": "Añadir fila arriba o abajo",
"Row": "Fila",
"Attachment Type": "Tipo de archivo adjunto",
"File": "Archivo",
"URL": "URL",
"Attachment Name": "Nombre del archivo adjunto",
"Attachment Sub Type": "Sub tipo de adjunto",
"MIME Type": "Tipo MIME",
"Search Scope": "Buscar Ámbito",
"Search Query": "Buscar consulta",
"Search Scopes": "Buscar Ámbitos",
"Include Favorite Flags": "Incluye banderas favoritas",
"Modified Since": "Modificado Desde",
"Max Results": "Resultados máximos",
"Filter by Object Types": "Filtrar por tipos de objeto",
"Include All Results": "Incluye todos los resultados",
"Page Number": "Número de página",
"Page Size": "Tamaño de página",
"Filter by Attachment Type": "Filtrar por tipo de archivo adjunto",
"Filter by Parent Type": "Filtrar por tipo padre",
"Minimum File Size (KB)": "Tamaño mínimo de archivo (KB)",
"Maximum File Size (KB)": "Tamaño máximo de archivo (KB)",
"Sheet Name Filter": "Filtro de nombre de la hoja",
"Exact Name Match": "Nombre exacto coincidencia",
"Access API Level": "Nivel de acceso API",
"Filter by Access Level": "Filtrar por nivel de acceso",
"Include Sheet Version": "Incluye la versión de la hoja",
"Include Source Information": "Incluye información de origen",
"Numeric Dates": "Fechas numéricas",
"Created Date Range": "Rango de fechas creado",
"Sort Results By": "Ordenar resultados por",
"Select a sheet": "Seleccione una hoja",
"Cell data with properties based on column types": "Datos de celda con propiedades basadas en tipos de columna",
"Type of attachment to add": "Tipo de archivo adjunto a añadir",
"The file to attach (required for FILE type)": "El archivo a adjuntar (obligatorio para el tipo ARCHIVO)",
"The URL to attach (required for URL-based attachment types)": "La URL a adjuntar (requerida para tipos de archivo adjunto basados en URL)",
"Name for the attachment (optional, will use file name or URL if not provided)": "Nombre del archivo adjunto (opcional, utilizará el nombre del archivo o la URL si no se proporciona)",
"Sub type for Google Drive and Egnyte attachments": "Subtipo para adjuntos de Google Drive y Egnyte",
"MIME type of the attachment (optional, auto-detected for files)": "Tipo MIME del archivo adjunto (opcional, auto-detectado para archivos)",
"Choose whether to search within a specific sheet or across all accessible sheets.": "Elija si desea buscar dentro de una hoja específica o en todas las hojas accesibles.",
"Text to search for. Use double quotes for exact phrase matching (e.g., \"project status\")": "Texto a buscar. Utilice comillas dobles para coincidir con la frase exacta (por ej., \"estado del proyecto\")",
"Specify what types of content to search in (leave empty to search all)": "Especificar en qué tipo de contenido buscar (dejar vacío para buscar todos)",
"Include information about which items are marked as favorites": "Incluye información sobre qué elementos están marcados como favoritos",
"Only return results modified on or after this date/time": "Devuelve sólo los resultados modificados en o después de esta fecha/hora",
"Maximum number of results to return (default: 50, max: 100)": "Número máximo de resultados a devolver (por defecto: 50, máximo: 100)",
"Only return results of specific object types (leave empty for all types)": "Devuelve sólo resultados de tipos de objeto específicos (dejar vacío para todos los tipos)",
"If true, include all results without pagination (overrides page and page size)": "Si es verdadero, incluir todos los resultados sin paginación (sobreescribe página y tamaño de página)",
"Which page to return (defaults to 1, ignored if \"Include All Results\" is true)": "Qué página devolver (por defecto es 1, ignorado si \"Incluye todos los resultados\" es verdadero)",
"Maximum number of items to return per page (defaults to 100, max 10000, ignored if \"Include All Results\" is true)": "Número máximo de elementos a devolver por página (por defecto 100, máx. 10000, ignorado si \"Incluye todos los resultados\" es verdadero)",
"Only return attachments of specific types (leave empty for all types)": "Devolver sólo adjuntos de tipos específicos (dejar vacío para todos los tipos)",
"Only return attachments from specific parent types (leave empty for all)": "Devolver sólo archivos adjuntos de tipos padre específicos (dejar vacío para todos)",
"Only return files with size greater than or equal to this value (applies to FILE type only)": "Devuelve sólo archivos con tamaño mayor o igual a este valor (sólo se aplica al tipo ARCHIVO)",
"Only return files with size less than or equal to this value (applies to FILE type only)": "Devuelve sólo archivos con tamaño menor o igual a este valor (sólo se aplica al tipo ARCHIVO)",
"Filter sheets by name (partial or exact match). Leave empty to list all sheets.": "Filtrar hojas por nombre (coincidencia parcial o exacta). Dejar en blanco para listar todas las hojas.",
"When filtering by name, require exact match instead of partial match": "Cuando se filtra por nombre, requiere coincidencia exacta en lugar de coincidencia parcial",
"API access level for viewing and filtering permissions": "Nivel de acceso API para ver y filtrar permisos",
"Only return sheets where you have specific access levels (leave empty for all)": "Sólo retorna hojas donde tenga niveles de acceso específicos (dejar vacío para todos)",
"Only return sheets modified on or after this date/time": "Sólo las hojas de retorno modificadas en o después de esta fecha/hora",
"Include current version number of each sheet": "Incluye el número de versión actual de cada hoja",
"Include information about the source (template/sheet) each sheet was created from": "Incluye información sobre la fuente (plantilla/hoja) desde la que se creó cada hoja",
"Return dates as milliseconds since UNIX epoch instead of ISO strings": "Devuelve las fechas como milisegundos desde el epicentro UNIX en lugar de las cadenas ISO",
"Filter sheets by creation date range": "Filtrar hojas por rango de fechas de creación",
"How to sort the returned sheets": "Cómo ordenar las hojas devueltas",
"Top of sheet": "Top de la hoja",
"Bottom of sheet": "Tomo de la hoja",
"File Upload": "Subir archivo",
"URL Link": "Enlace URL",
"Box.com": "Box.com",
"Dropbox": "Soltar",
"Egnyte": "Huevo",
"Evernote": "Puntuar",
"Google Drive": "Google Drive",
"OneDrive": "OneDrive",
"Document": "Documento",
"Drawing": "Dibujando",
"Folder": "Carpeta",
"PDF": "DF",
"Presentation": "Presentación",
"Spreadsheet": "Hoja de cálculo",
"Specific Sheet": "Hoja específica",
"All Accessible Sheets": "Todas las Hojas Accesibles",
"Cell Data": "Datos de celda",
"Comments": "Comentarios",
"Attachments": "Adjuntos",
"Sheet Names": "Nombres de hoja",
"Folder Names": "Nombres de carpeta",
"Report Names": "Nombres del informe",
"Dashboard Names": "Nombres del panel",
"Template Names": "Nombres de plantilla",
"Workspace Names": "Nombres del área de trabajo",
"Summary Fields": "Campos de resumen",
"Rows": "Filas",
"Sheets": "Hojas",
"Comments/Discussions": "Comentarios/discusiones",
"Dashboards": "Tableros",
"Reports": "Informes",
"Folders": "Carpetas",
"Templates": "Plantillas",
"Workspaces": "Espacios de trabajo",
"Files": "Archivos",
"URLs/Links": "URLs/Enlaces",
"Trello": "Trello",
"Row Attachments": "Fila de adjuntos",
"Comment Attachments": "Comentar adjuntos",
"Sheet Attachments": "Adjuntos de la hoja",
"Proof Attachments": "Prueba de archivos adjuntos",
"Viewer (default)": "Visor (por defecto)",
"Commenter": "Comentario",
"Owner": "Propietario",
"Admin": "Admin",
"Editor (with sharing)": "Editor (con compartir)",
"Editor": "Editor",
"Viewer": "Visor",
"All time": "Todo el tiempo",
"Last 7 days": "Últimos 7 días",
"Last 30 days": "Últimos 30 días",
"Last 90 days": "Últimos 90 días",
"Last 365 days": "Últimos 365 días",
"Sheet Name": "Nombre de la hoja",
"Creation Date (newest first)": "Fecha de Creación (más reciente primero)",
"Creation Date (oldest first)": "Fecha de creación (más antigua primero)",
"Modified Date (newest first)": "Fecha modificada (más reciente primero)",
"Modified Date (oldest first)": "Fecha modificada (más antigua primero)",
"Access Level": "Nivel de acceso",
"New Row Added": "Nueva fila añadida",
"Row Updated": "Fila actualizada",
"New Attachment Added": "Nuevo adjunto añadido",
"New Comment Added": "Nuevo comentario añadido",
"Triggers when a new row is added.": "Se activa cuando se añade una nueva fila.",
"Triggers when an existing row is updated.": "Se activa cuando se actualiza una fila existente.",
"Triggers when a new attachment is added to a row or sheet.": "Se activa cuando se añade un nuevo archivo adjunto a una fila o una hoja.",
"Triggers when a new comment is added to a discussion on a sheet.": "Se activa cuando se añade un nuevo comentario a una discusión en una hoja."
}

View File

@@ -0,0 +1,150 @@
{
"Dynamic work execution platform for teams to plan, capture, manage, automate, and report on work at scale.": "Plateforme dexécution de travail dynamique pour les équipes afin de planifier, capturer, gérer, automatiser et rapporter le travail à léchelle.",
"\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n": "\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n",
"Add Row to Sheet": "Ajouter une ligne à la feuille",
"Update Row": "Mettre à jour la ligne",
"Attach File to Row": "Joindre un fichier à la ligne",
"Find Row": "Trouver une ligne",
"List Row Attachments": "Lister les pièces jointes de ligne",
"Find Sheet(s)": "Trouver la/les feuille(s)",
"Adds new row to a sheet.": "Ajoute une nouvelle ligne à une feuille.",
"Updates an existing row.": "Met à jour une ligne existante.",
"Adds a file attachment to a row.": "Ajoute une pièce jointe à une ligne.",
"Finds rows in a specific sheet or across all accessible sheets using text queries with advanced filtering options.": "Trouve des lignes dans une feuille spécifique ou sur toutes les feuilles accessibles en utilisant des requêtes textuelles avec des options de filtrage avancées.",
"Get all attachments for a specific row in a Smartsheet, including row and discussion-level attachments with comprehensive pagination and filtering options": "Obtenir toutes les pièces jointes pour une ligne spécifique dans une Smartsheet, y compris les pièces jointes au niveau ligne et discussion avec des options de pagination et de filtrage complètes",
"Fetches existings sheets matching provided filter criteria.": "Récupère les fiches existantes correspondant aux critères de filtrage fournis.",
"Sheet": "Feuille",
"Cells": "Cellules",
"Add Row to Top or Bottom": "Ajouter une ligne au haut ou au bas",
"Row": "Ligne",
"Attachment Type": "Type de pièce jointe",
"File": "Ficher",
"URL": "URL",
"Attachment Name": "Nom de la pièce jointe",
"Attachment Sub Type": "Sous-type de pièce jointe",
"MIME Type": "Type MIME",
"Search Scope": "Périmètre de recherche",
"Search Query": "Requête de recherche",
"Search Scopes": "Portées de la recherche",
"Include Favorite Flags": "Inclure les drapeaux favoris",
"Modified Since": "Modifié depuis",
"Max Results": "Nombre maximum de résultats",
"Filter by Object Types": "Filtrer par types d'objet",
"Include All Results": "Inclure tous les résultats",
"Page Number": "Numéro de page",
"Page Size": "Nombre d'élément",
"Filter by Attachment Type": "Filtrer par type de pièce jointe",
"Filter by Parent Type": "Filtrer par type parent",
"Minimum File Size (KB)": "Taille minimale du fichier (KB)",
"Maximum File Size (KB)": "Taille maximale du fichier (KB)",
"Sheet Name Filter": "Filtre de nom de feuille",
"Exact Name Match": "Correspondance de nom exacte",
"Access API Level": "Niveau d'accès à l'API",
"Filter by Access Level": "Filtrer par niveau d'accès",
"Include Sheet Version": "Inclure la version de feuille",
"Include Source Information": "Inclure les informations source",
"Numeric Dates": "Dates numériques",
"Created Date Range": "Plage de dates de création",
"Sort Results By": "Trier les résultats par",
"Select a sheet": "Sélectionnez une feuille",
"Cell data with properties based on column types": "Données de la cellule avec des propriétés basées sur les types de colonnes",
"Type of attachment to add": "Type de pièce jointe à ajouter",
"The file to attach (required for FILE type)": "Le fichier à joindre (requis pour le type FILE)",
"The URL to attach (required for URL-based attachment types)": "L'URL à joindre (requis pour les types de pièces jointes basés sur l'URL)",
"Name for the attachment (optional, will use file name or URL if not provided)": "Nom de la pièce jointe (facultatif, utilisera le nom du fichier ou l'URL si non fourni)",
"Sub type for Google Drive and Egnyte attachments": "Sous-type pour les pièces jointes Google Drive et Egnyte",
"MIME type of the attachment (optional, auto-detected for files)": "Type MIME de la pièce jointe (optionnel, auto-détecté pour les fichiers)",
"Choose whether to search within a specific sheet or across all accessible sheets.": "Choisissez si vous souhaitez effectuer une recherche dans une feuille spécifique ou dans toutes les feuilles accessibles.",
"Text to search for. Use double quotes for exact phrase matching (e.g., \"project status\")": "Texte à rechercher. Utilisez des guillemets doubles pour la correspondance exacte de la phrase (par exemple, \"statut du projet\")",
"Specify what types of content to search in (leave empty to search all)": "Spécifier les types de contenu à rechercher (laisser vide pour rechercher tous)",
"Include information about which items are marked as favorites": "Inclure des informations sur les éléments qui sont marqués comme favoris",
"Only return results modified on or after this date/time": "Renvoie uniquement les résultats modifiés à ou après cette date/heure",
"Maximum number of results to return (default: 50, max: 100)": "Nombre maximum de résultats à retourner (par défaut: 50, max: 100)",
"Only return results of specific object types (leave empty for all types)": "Renvoie uniquement les résultats des types d'objets spécifiques (laisser vide pour tous les types)",
"If true, include all results without pagination (overrides page and page size)": "Si vrai, inclure tous les résultats sans pagination (remplace la taille de la page et de la page)",
"Which page to return (defaults to 1, ignored if \"Include All Results\" is true)": "Quelle page retourner (par défaut à 1, ignorée si \"Inclure tous les résultats\" est vrai)",
"Maximum number of items to return per page (defaults to 100, max 10000, ignored if \"Include All Results\" is true)": "Nombre maximum d'éléments à retourner par page (par défaut 100, max 10000, ignoré si \"Inclure tous les résultats\" est vrai)",
"Only return attachments of specific types (leave empty for all types)": "Renvoyer uniquement les pièces jointes de types spécifiques (laisser vide pour tous les types)",
"Only return attachments from specific parent types (leave empty for all)": "Renvoyer uniquement les pièces jointes de types parents spécifiques (laisser vide pour tous)",
"Only return files with size greater than or equal to this value (applies to FILE type only)": "Renvoyer uniquement les fichiers avec une taille supérieure ou égale à cette valeur (s'applique uniquement au type FILE)",
"Only return files with size less than or equal to this value (applies to FILE type only)": "Renvoyer uniquement les fichiers dont la taille est inférieure ou égale à cette valeur (s'applique uniquement au type FILE)",
"Filter sheets by name (partial or exact match). Leave empty to list all sheets.": "Filtrer les feuilles par nom (partiel ou exact). Laisser vide pour lister toutes les feuilles.",
"When filtering by name, require exact match instead of partial match": "Lors du filtrage par nom, nécessite une correspondance exacte au lieu d'une correspondance partielle",
"API access level for viewing and filtering permissions": "Niveau d'accès à l'API pour la visualisation et le filtrage des autorisations",
"Only return sheets where you have specific access levels (leave empty for all)": "Seulement les feuilles de retour où vous avez des niveaux d'accès spécifiques (laisser vide pour tous)",
"Only return sheets modified on or after this date/time": "Ne retourne que les feuilles modifiées à ou après cette date/heure",
"Include current version number of each sheet": "Inclure le numéro de version actuel de chaque feuille",
"Include information about the source (template/sheet) each sheet was created from": "Inclure des informations sur la source (modèle/feuille) depuis laquelle chaque feuille a été créée",
"Return dates as milliseconds since UNIX epoch instead of ISO strings": "Renvoie les dates en millisecondes depuis l'époque UNIX au lieu des chaînes ISO",
"Filter sheets by creation date range": "Filtrer les feuilles par plage de dates de création",
"How to sort the returned sheets": "Comment trier les feuilles retournées",
"Top of sheet": "Haut de la feuille",
"Bottom of sheet": "Bas de la feuille",
"File Upload": "Envoi de fichier",
"URL Link": "Lien URL",
"Box.com": "Box.com",
"Dropbox": "Dropbox",
"Egnyte": "Egnyte",
"Evernote": "Evernote",
"Google Drive": "Google Drive",
"OneDrive": "OneDrive",
"Document": "Document",
"Drawing": "Dessin",
"Folder": "Dossier",
"PDF": "PDF",
"Presentation": "Présentation",
"Spreadsheet": "Feuille de calcul",
"Specific Sheet": "Feuille spécifique",
"All Accessible Sheets": "Toutes les feuilles accessibles",
"Cell Data": "Données de la cellule",
"Comments": "Commentaires",
"Attachments": "Fichiers joints",
"Sheet Names": "Noms de feuille",
"Folder Names": "Noms des dossiers",
"Report Names": "Noms du rapport",
"Dashboard Names": "Noms du tableau de bord",
"Template Names": "Noms du modèle",
"Workspace Names": "Noms de l'espace de travail",
"Summary Fields": "Champs de résumé",
"Rows": "Lignes",
"Sheets": "Feuilles",
"Comments/Discussions": "Commentaires/Discussions",
"Dashboards": "Tableaux de bord",
"Reports": "Rapports",
"Folders": "Dossiers",
"Templates": "Modèles",
"Workspaces": "Workspaces",
"Files": "Fichiers",
"URLs/Links": "URLs/liens",
"Trello": "Trello",
"Row Attachments": "Pièces jointes à la ligne",
"Comment Attachments": "Pièces jointes au commentaire",
"Sheet Attachments": "Pièces jointes",
"Proof Attachments": "Pièces jointes Preuve",
"Viewer (default)": "Visionneuse (par défaut)",
"Commenter": "Commentateur",
"Owner": "Propriétaire",
"Admin": "Administrateur",
"Editor (with sharing)": "Éditeur (avec partage)",
"Editor": "Editor",
"Viewer": "Viewer",
"All time": "Tous les temps",
"Last 7 days": "Les 7 derniers jours",
"Last 30 days": "Les 30 derniers jours",
"Last 90 days": "Les 90 derniers jours",
"Last 365 days": "365 derniers jours",
"Sheet Name": "Nom de la feuille",
"Creation Date (newest first)": "Date de création (plus récente en premier)",
"Creation Date (oldest first)": "Date de création (plus ancienne en premier)",
"Modified Date (newest first)": "Date de modification (plus récente en premier)",
"Modified Date (oldest first)": "Date de modification (plus ancienne en premier)",
"Access Level": "Niveau d'accès",
"New Row Added": "Nouvelle ligne ajoutée",
"Row Updated": "Ligne mise à jour",
"New Attachment Added": "Nouvelle pièce jointe ajoutée",
"New Comment Added": "Nouveau commentaire ajouté",
"Triggers when a new row is added.": "Déclenche quand une nouvelle ligne est ajoutée.",
"Triggers when an existing row is updated.": "Déclenche quand une ligne existante est mise à jour.",
"Triggers when a new attachment is added to a row or sheet.": "Déclenche lorsqu'une nouvelle pièce jointe est ajoutée à une ligne ou une feuille.",
"Triggers when a new comment is added to a discussion on a sheet.": "Déclenche lorsqu'un nouveau commentaire est ajouté à une discussion sur une feuille."
}

View File

@@ -0,0 +1,150 @@
{
"Dynamic work execution platform for teams to plan, capture, manage, automate, and report on work at scale.": "チームが大規模に作業を計画、キャプチャ、管理、自動化、レポートするためのダイナミックな作業実行プラットフォーム。",
"\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n": "\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n",
"Add Row to Sheet": "シートに行を追加",
"Update Row": "行を更新",
"Attach File to Row": "行にファイルを添付",
"Find Row": "行を検索",
"List Row Attachments": "行の添付ファイル一覧",
"Find Sheet(s)": "シートを検索",
"Adds new row to a sheet.": "シートに新しい行を追加します。",
"Updates an existing row.": "既存の行を更新します。",
"Adds a file attachment to a row.": "行に添付ファイルを追加します。",
"Finds rows in a specific sheet or across all accessible sheets using text queries with advanced filtering options.": "高度なフィルタリングオプションを使用して、特定のシートまたはアクセス可能なすべてのシートの行を検索します。",
"Get all attachments for a specific row in a Smartsheet, including row and discussion-level attachments with comprehensive pagination and filtering options": "包括的なページネーションとフィルタリングオプションを備えた行と掲示板レベルの添付ファイルを含む、Smartsheetの特定の行のすべての添付ファイルを取得します",
"Fetches existings sheets matching provided filter criteria.": "提供されたフィルタ条件に一致する既存のシートをフェッチします。",
"Sheet": "シート",
"Cells": "セル",
"Add Row to Top or Bottom": "上下に行を追加",
"Row": "行",
"Attachment Type": "添付ファイルの種類",
"File": "ファイル",
"URL": "URL",
"Attachment Name": "添付ファイル名",
"Attachment Sub Type": "Attachment Sub Type",
"MIME Type": "MIMEタイプ",
"Search Scope": "検索範囲",
"Search Query": "検索クエリ",
"Search Scopes": "スコープの検索",
"Include Favorite Flags": "お気に入りのフラグを含める",
"Modified Since": "変更元",
"Max Results": "最大結果",
"Filter by Object Types": "オブジェクトの種類でフィルター",
"Include All Results": "すべての結果を含める",
"Page Number": "ページ番号",
"Page Size": "ページサイズ",
"Filter by Attachment Type": "添付ファイルタイプでフィルター",
"Filter by Parent Type": "親タイプでフィルター",
"Minimum File Size (KB)": "最小ファイルサイズ (KB)",
"Maximum File Size (KB)": "最大サイズ (KB)",
"Sheet Name Filter": "シート名フィルタ",
"Exact Name Match": "完全な名前一致",
"Access API Level": "アクセスAPIレベル",
"Filter by Access Level": "アクセスレベルでフィルター",
"Include Sheet Version": "シートのバージョンを含める",
"Include Source Information": "ソース情報を含める",
"Numeric Dates": "数値の日付",
"Created Date Range": "作成日付範囲",
"Sort Results By": "並べ替え結果",
"Select a sheet": "シートを選択",
"Cell data with properties based on column types": "列型に基づくプロパティを持つセル",
"Type of attachment to add": "追加する添付の種類",
"The file to attach (required for FILE type)": "添付するファイル(ファイルの種類には必須)",
"The URL to attach (required for URL-based attachment types)": "添付するURLURLベースの添付タイプに必要",
"Name for the attachment (optional, will use file name or URL if not provided)": "添付ファイルの名前オプション、指定されていない場合はファイル名またはURLを使用します",
"Sub type for Google Drive and Egnyte attachments": "Google ドライブとEgnyte 添付ファイルのサブタイプ",
"MIME type of the attachment (optional, auto-detected for files)": "添付ファイルのMIMEタイプ (オプション、ファイルに自動検出)",
"Choose whether to search within a specific sheet or across all accessible sheets.": "特定のシート内で検索するか、アクセス可能なすべてのシート間で検索するかを選択します。",
"Text to search for. Use double quotes for exact phrase matching (e.g., \"project status\")": "検索するテキスト。完全に一致するフレーズにダブルクォートを使用してください (例: \"プロジェクトの状態\")",
"Specify what types of content to search in (leave empty to search all)": "検索するコンテンツの種類を指定します(すべてを検索するには空白のままにします)",
"Include information about which items are marked as favorites": "お気に入りとしてマークされているアイテムに関する情報を含める",
"Only return results modified on or after this date/time": "この日付/時刻以降に変更された結果のみを返します",
"Maximum number of results to return (default: 50, max: 100)": "Maximum number of results to return (default: 50, max: 100)",
"Only return results of specific object types (leave empty for all types)": "特定のオブジェクト型の結果のみを返します (すべての型に対して空のままにします)",
"If true, include all results without pagination (overrides page and page size)": "true の場合、ページネーションなしですべての結果を含めます (ページとページサイズを上書きします)",
"Which page to return (defaults to 1, ignored if \"Include All Results\" is true)": "どのページを返すかデフォルトでは1に設定されています。「すべての結果を含める」がtrueの場合は無視されます",
"Maximum number of items to return per page (defaults to 100, max 10000, ignored if \"Include All Results\" is true)": "ページあたりのリターンアイテムの最大数 (デフォルトは 100, max 10000, \"Include All Results\" が true の場合は無視)",
"Only return attachments of specific types (leave empty for all types)": "特定のタイプの添付ファイルのみを返します (すべてのタイプでは空のままにしてください)",
"Only return attachments from specific parent types (leave empty for all)": "特定の親タイプからの添付ファイルのみを返します (すべての場合は空のままにしてください)",
"Only return files with size greater than or equal to this value (applies to FILE type only)": "サイズがこの値以上のファイルのみを返します (ファイルの種類にのみ適用されます)",
"Only return files with size less than or equal to this value (applies to FILE type only)": "サイズがこの値以下のファイルのみを返します (ファイルの種類にのみ適用されます)",
"Filter sheets by name (partial or exact match). Leave empty to list all sheets.": "シートを名前でフィルタリングします。空白の場合、すべてのシートが一覧表示されます。",
"When filtering by name, require exact match instead of partial match": "名前でフィルタリングする場合は、部分一致の代わりに完全一致が必要です",
"API access level for viewing and filtering permissions": "アクセス権を表示およびフィルタリングするためのAPIアクセスレベルです",
"Only return sheets where you have specific access levels (leave empty for all)": "特定のアクセスレベルを持つシートのみを返します(すべてには空のままにします)",
"Only return sheets modified on or after this date/time": "この日付/時刻以降に変更されたシートのみを返します",
"Include current version number of each sheet": "各シートの最新バージョン番号を含める",
"Include information about the source (template/sheet) each sheet was created from": "各シートが作成されたソース(テンプレート/シート)に関する情報を含める",
"Return dates as milliseconds since UNIX epoch instead of ISO strings": "ISO文字列の代わりにUNIXエポックからミリ秒で日付を返します",
"Filter sheets by creation date range": "作成日付の範囲でシートをフィルター",
"How to sort the returned sheets": "返されたシートを並べ替える方法",
"Top of sheet": "シート上部へ",
"Bottom of sheet": "シートの下",
"File Upload": "ファイルアップロード",
"URL Link": "URL リンク",
"Box.com": "Box.com",
"Dropbox": "Dropbox",
"Egnyte": "エニュテ",
"Evernote": "Evernote",
"Google Drive": "Google ドライブ",
"OneDrive": "OneDrive",
"Document": "ドキュメント",
"Drawing": "図形描画",
"Folder": "Folder",
"PDF": "PDF",
"Presentation": "プレゼンテーション",
"Spreadsheet": "表計算ドキュメント",
"Specific Sheet": "特定のシート",
"All Accessible Sheets": "すべてのアクセシブルシート",
"Cell Data": "セルデータ",
"Comments": "コメント",
"Attachments": "添付ファイル",
"Sheet Names": "シート名",
"Folder Names": "フォルダ名",
"Report Names": "レポート名",
"Dashboard Names": "ダッシュボード名",
"Template Names": "テンプレート名",
"Workspace Names": "ワークスペース名",
"Summary Fields": "サマリーフィールド",
"Rows": "行",
"Sheets": "シート",
"Comments/Discussions": "コメント/ディスカッション",
"Dashboards": "ダッシュボード",
"Reports": "レポート",
"Folders": "Folders",
"Templates": "テンプレート",
"Workspaces": "ワークスペース",
"Files": "ファイル",
"URLs/Links": "URL/リンク",
"Trello": "Trello",
"Row Attachments": "行の添付ファイル",
"Comment Attachments": "コメントの添付ファイル",
"Sheet Attachments": "シートの添付ファイル",
"Proof Attachments": "添付ファイルの証拠",
"Viewer (default)": "ビューアー (既定)",
"Commenter": "コメント",
"Owner": "所有者",
"Admin": "管理者",
"Editor (with sharing)": "エディター(共有機能あり)",
"Editor": "エディター",
"Viewer": "ビューアー",
"All time": "すべて",
"Last 7 days": "過去 7 日間",
"Last 30 days": "過去 30 日間",
"Last 90 days": "過去 90 日間",
"Last 365 days": "過去365 日",
"Sheet Name": "シート名",
"Creation Date (newest first)": "作成日(新しい順)",
"Creation Date (oldest first)": "作成日(古い順)",
"Modified Date (newest first)": "修正日時(最新のものが先頭)",
"Modified Date (oldest first)": "修正日時(古い順)",
"Access Level": "アクセスレベル",
"New Row Added": "新しい行を追加しました",
"Row Updated": "行の更新",
"New Attachment Added": "新しい添付ファイルが追加されました",
"New Comment Added": "新しいコメントが追加されました",
"Triggers when a new row is added.": "新しい行が追加されたときにトリガーします。",
"Triggers when an existing row is updated.": "既存の行が更新されたときにトリガーします。",
"Triggers when a new attachment is added to a row or sheet.": "行またはシートに新しい添付ファイルを追加したときにトリガーします。",
"Triggers when a new comment is added to a discussion on a sheet.": "シート上のディスカッションに新しいコメントが追加されたときにトリガーされます。"
}

View File

@@ -0,0 +1,150 @@
{
"Dynamic work execution platform for teams to plan, capture, manage, automate, and report on work at scale.": "Dynamisch werkuitvoeringsplatform voor teams om werk op schaal te plannen, verzamelen, beheren, automatiseren en rapporteren.",
"\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n": "\nOm uw Smartsheet toegang te krijgen:\n\n1. Meld u aan bij uw Smartsheet account.\n2. Klik op je profielfoto in de rechterbovenhoek.\n3. Selecteer **Persoonlijke instellingen** in het dropdown menu.\n4. Klik in het linkerpaneel op **API Access**.\n5. Klik **Genereer nieuwe toegangstoken**.\n6. Voer een naam in voor je token (bijv. \"Activepieces Integration\").\n7. Klik **OK** om de token te genereren..\n8. Kopieer de toegangstoken en plak deze in het verbindingsveld.\n",
"Add Row to Sheet": "Rij toevoegen aan plaat",
"Update Row": "Rij bijwerken",
"Attach File to Row": "Bestand toevoegen aan Rij",
"Find Row": "Rij zoeken",
"List Row Attachments": "Rij bijlagen weergeven",
"Find Sheet(s)": "Schaap(en) zoeken",
"Adds new row to a sheet.": "Voegt nieuwe rij toe aan een vel.",
"Updates an existing row.": "Werkt een bestaande rij bij.",
"Adds a file attachment to a row.": "Voegt een bestandsbijlage toe aan een rij.",
"Finds rows in a specific sheet or across all accessible sheets using text queries with advanced filtering options.": "Rijen in een specifiek blad of over alle toegankelijke vellen met behulp van tekstzoekopdrachten met geavanceerde filteropties.",
"Get all attachments for a specific row in a Smartsheet, including row and discussion-level attachments with comprehensive pagination and filtering options": "Haal alle bijlagen voor een specifieke rij in een Smartsheet, inclusief rij- en discussieniveaus met uitgebreide paginerings- en filteropties",
"Fetches existings sheets matching provided filter criteria.": "Ophalen van bestaande vellen die aan de opgegeven filtercriteria voldoen.",
"Sheet": "Sheet",
"Cells": "Cellen",
"Add Row to Top or Bottom": "Rij toevoegen aan boven of onder",
"Row": "Rij",
"Attachment Type": "Type bijlage",
"File": "Bestand",
"URL": "URL",
"Attachment Name": "Bijlage naam",
"Attachment Sub Type": "Sub type bijlage",
"MIME Type": "MIME-type",
"Search Scope": "Toepassingsgebied zoeken",
"Search Query": "Zoek query",
"Search Scopes": "Zoek scopes",
"Include Favorite Flags": "Favoriete vlaggen toevoegen",
"Modified Since": "Gewijzigd sinds",
"Max Results": "Max. aantal resultaten",
"Filter by Object Types": "Filter op objecttypes",
"Include All Results": "Alle resultaten toevoegen",
"Page Number": "Pagina Nummer",
"Page Size": "Paginagrootte",
"Filter by Attachment Type": "Filteren op bijlage type",
"Filter by Parent Type": "Filteren op bovenliggende type",
"Minimum File Size (KB)": "Minimale bestandsgrootte (KB)",
"Maximum File Size (KB)": "Maximale bestandsgrootte (KB)",
"Sheet Name Filter": "Plaatnaam filter",
"Exact Name Match": "Exacte naam overeenkomst",
"Access API Level": "Toegang tot API niveau",
"Filter by Access Level": "Filter op toegangsniveau",
"Include Sheet Version": "Inclusief plaatversie",
"Include Source Information": "Broninformatie opnemen",
"Numeric Dates": "Numerieke datums",
"Created Date Range": "Gemaakte datumbereik",
"Sort Results By": "Resultaten sorteren op",
"Select a sheet": "Selecteer een blad",
"Cell data with properties based on column types": "Mobiele gegevens met eigenschappen gebaseerd op kolomtypes",
"Type of attachment to add": "Type bijlage om toe te voegen",
"The file to attach (required for FILE type)": "Het toe te voegen bestand (vereist voor FILE type)",
"The URL to attach (required for URL-based attachment types)": "De URL om toe te voegen (vereist voor URL-gebaseerde bijlagetypes)",
"Name for the attachment (optional, will use file name or URL if not provided)": "Naam voor de bijlage (optioneel, bestandsnaam of URL gebruiken indien niet opgegeven)",
"Sub type for Google Drive and Egnyte attachments": "Sub type voor Google Drive en Egnyte bijlagen",
"MIME type of the attachment (optional, auto-detected for files)": "MIME type van de bijlage (optioneel, automatisch gedetecteerd voor bestanden)",
"Choose whether to search within a specific sheet or across all accessible sheets.": "Kies of u wilt zoeken binnen een specifiek blad of over alle toegankelijke velden.",
"Text to search for. Use double quotes for exact phrase matching (e.g., \"project status\")": "Tekst om naar te zoeken. Gebruik dubbele aanhalingstekens voor exacte zinsdelen (bijv. \"projectstatus\")",
"Specify what types of content to search in (leave empty to search all)": "Specificeer in welke type inhoud gezocht moet worden (laat leeg om alles te zoeken)",
"Include information about which items are marked as favorites": "Inclusief informatie over welke items zijn gemarkeerd als favoriet",
"Only return results modified on or after this date/time": "Geef alleen resultaat gewijzigd op of na deze datum/tijd",
"Maximum number of results to return (default: 50, max: 100)": "Maximum aantal resultaten om te retourneren (standaard: 50, max: 100)",
"Only return results of specific object types (leave empty for all types)": "Alleen resultaat van specifieke objecttypes (leeg laten voor alle soorten)",
"If true, include all results without pagination (overrides page and page size)": "Indien waar, inclusief alle resultaten zonder paginering (overschrijft pagina en paginagrootte grootte)",
"Which page to return (defaults to 1, ignored if \"Include All Results\" is true)": "Welke pagina terug te geven (standaard 1 genegeerde als \"Alle resultaten bijvoegen\" waar is)",
"Maximum number of items to return per page (defaults to 100, max 10000, ignored if \"Include All Results\" is true)": "Maximum aantal items om te retourneren per pagina (standaard 100, max 10000, genegeerd als \"Alle resultaten bijvoegen\" waar is)",
"Only return attachments of specific types (leave empty for all types)": "Alleen bijlagen van specifieke types weergeven (leeg laten voor alle types)",
"Only return attachments from specific parent types (leave empty for all)": "Retourneer alleen bijlagen van specifieke bovenliggende types (laat leeg voor alles)",
"Only return files with size greater than or equal to this value (applies to FILE type only)": "Alleen retour bestanden met grootte groter dan of gelijk aan deze waarde (alleen van toepassing op FILE type)",
"Only return files with size less than or equal to this value (applies to FILE type only)": "Alleen retourbestanden met grootte kleiner dan of gelijk aan deze waarde (alleen van toepassing op FILE type)",
"Filter sheets by name (partial or exact match). Leave empty to list all sheets.": "Filter vellen op naam (gedeeltelijke of exacte overeenkomst). Laat leeg om alle vellen weer te geven.",
"When filtering by name, require exact match instead of partial match": "Bij het filteren op naam, vereist exacte overeenkomst in plaats van gedeeltelijke overeenkomst",
"API access level for viewing and filtering permissions": "API toegangsniveau voor het bekijken en filteren van rechten",
"Only return sheets where you have specific access levels (leave empty for all)": "Alleen vellen retour waar u specifieke toegangsniveaus heeft (laat leeg voor alles)",
"Only return sheets modified on or after this date/time": "Alleen vellen retourneren die zijn gewijzigd op of na deze datum/tijd",
"Include current version number of each sheet": "Het huidige versienummer van elk blad weergeven",
"Include information about the source (template/sheet) each sheet was created from": "Informatie over de bron (sjabloon/sheet) van elk blad gemaakt",
"Return dates as milliseconds since UNIX epoch instead of ISO strings": "Retourneer data als milliseconden sinds UNIX epoch in plaats van de ISO-strings",
"Filter sheets by creation date range": "Pagina's filteren op aanmaak datumbereik",
"How to sort the returned sheets": "Hoe de geretourneerde bladen sorteren",
"Top of sheet": "Bovenkant van de plaat",
"Bottom of sheet": "Onderkant van de plaat",
"File Upload": "Bestand uploaden",
"URL Link": "URL link",
"Box.com": "Box.com",
"Dropbox": "Dropbox",
"Egnyte": "Ei",
"Evernote": "Evernote",
"Google Drive": "Google Drive",
"OneDrive": "OneDrive",
"Document": "Document",
"Drawing": "Tekenen",
"Folder": "Map",
"PDF": "PDF-bestand",
"Presentation": "Presentatie",
"Spreadsheet": "Spreadsheet",
"Specific Sheet": "Specifieke plaat",
"All Accessible Sheets": "Alle toegankelijke platen",
"Cell Data": "Cel gegevens",
"Comments": "Opmerkingen",
"Attachments": "Bijlagen",
"Sheet Names": "Plaat namen",
"Folder Names": "Mapnamen",
"Report Names": "Namen melden",
"Dashboard Names": "Dashboard namen",
"Template Names": "Template namen",
"Workspace Names": "Werkruimte namen",
"Summary Fields": "Samenvatting velden",
"Rows": "Rijen",
"Sheets": "platen",
"Comments/Discussions": "Reacties/discussies",
"Dashboards": "Dashboards",
"Reports": "Rapporten",
"Folders": "Mappen",
"Templates": "Sjablonen",
"Workspaces": "Werkruimtes",
"Files": "Bestanden",
"URLs/Links": "URLs/links",
"Trello": "Trello",
"Row Attachments": "Rij bijlagen",
"Comment Attachments": "Commentaar bijlagen",
"Sheet Attachments": "Plaat bijlagen",
"Proof Attachments": "Voordeel bijlages",
"Viewer (default)": "Bekijker (standaard)",
"Commenter": "Commentaar",
"Owner": "Eigenaar",
"Admin": "Beheerder",
"Editor (with sharing)": "Tekstverwerker (met delen)",
"Editor": "Bewerker",
"Viewer": "Bekijker",
"All time": "Gehele tijd",
"Last 7 days": "Afgelopen 7 dagen",
"Last 30 days": "Laatste 30 dagen",
"Last 90 days": "Last 90 Days",
"Last 365 days": "Laatste 365 dagen",
"Sheet Name": "Plaat naam",
"Creation Date (newest first)": "Aanmaakdatum (nieuwste eerst)",
"Creation Date (oldest first)": "Aanmaakdatum (oudste eerst)",
"Modified Date (newest first)": "Gewijzigde datum (nieuwste eerst)",
"Modified Date (oldest first)": "Gewijzigde datum (oudste eerst)",
"Access Level": "Toegang tot niveau",
"New Row Added": "Nieuwe rij toegevoegd",
"Row Updated": "Rij bijgewerkt",
"New Attachment Added": "Nieuwe bijlage toegevoegd",
"New Comment Added": "Nieuwe reactie toegevoegd",
"Triggers when a new row is added.": "Triggert wanneer een nieuwe rij wordt toegevoegd.",
"Triggers when an existing row is updated.": "Triggert wanneer een bestaande rij is bijgewerkt.",
"Triggers when a new attachment is added to a row or sheet.": "Triggert wanneer een nieuwe bijlage is toegevoegd aan een rij of vel.",
"Triggers when a new comment is added to a discussion on a sheet.": "Triggert wanneer een nieuwe reactie wordt toegevoegd aan een discussie op een vel."
}

View File

@@ -0,0 +1,150 @@
{
"Dynamic work execution platform for teams to plan, capture, manage, automate, and report on work at scale.": "Plataforma dinâmica de execução de trabalho para equipes planejar, capturar, gerenciar, automatizar e reportar em escala.",
"\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n": "\nPara obter seu token de acesso a folhas:\n\n1. Faça login em sua conta de folha.\n2. Clique na foto do seu perfil no canto superior direito.\n3. Selecione **Configurações Pessoais** no menu suspenso.\n4. No painel à esquerda, clique em **Acesso à API**.\n5. Clique em **Gerar um novo token de acesso**.\n6. Insira um nome para seu token (ex.: \"Integração de peças ativas\").\n7. Clique em **OK** para gerar o token..\n8. Copie o token de acesso e cole-o no campo de conexão.\n",
"Add Row to Sheet": "Adicionar Linha à Chapa",
"Update Row": "Atualizar linha",
"Attach File to Row": "Anexar Arquivo à Linha",
"Find Row": "Encontrar linha",
"List Row Attachments": "Listar anexos da linha",
"Find Sheet(s)": "Localizar Chapa(s)",
"Adds new row to a sheet.": "Adiciona uma nova linha a uma folha.",
"Updates an existing row.": "Atualiza uma linha existente.",
"Adds a file attachment to a row.": "Adiciona um anexo de arquivo a uma linha.",
"Finds rows in a specific sheet or across all accessible sheets using text queries with advanced filtering options.": "Localiza linhas em uma folha específica ou em todas as planilhas acessíveis usando consultas de texto com opções de filtragem avançadas.",
"Get all attachments for a specific row in a Smartsheet, including row and discussion-level attachments with comprehensive pagination and filtering options": "Obtenha todos os anexos para uma linha específica em uma Smartsheet, incluindo anexos em nível de linha e discussão com uma ampla paginação e opções de filtragem",
"Fetches existings sheets matching provided filter criteria.": "Busca as folhas existentes correspondentes aos critérios de filtro fornecidos.",
"Sheet": "Folhas",
"Cells": "Células",
"Add Row to Top or Bottom": "Adicionar Linha ao Topo ou Inferior",
"Row": "Linha",
"Attachment Type": "Tipo de anexo",
"File": "Arquivo",
"URL": "URL:",
"Attachment Name": "Nome do anexo",
"Attachment Sub Type": "Sub Tipo de anexo",
"MIME Type": "Tipo MIME",
"Search Scope": "Escopo da Pesquisa",
"Search Query": "Consulta de Pesquisa",
"Search Scopes": "Âmbitos de pesquisa",
"Include Favorite Flags": "Incluir Sinalizadores Favoritos",
"Modified Since": "Modificado desde",
"Max Results": "Resultados no Máx.",
"Filter by Object Types": "Filtrar por Tipos de Objeto",
"Include All Results": "Incluir todos os resultados",
"Page Number": "Número da página",
"Page Size": "Tamanho da página",
"Filter by Attachment Type": "Filtrar por tipo de anexo",
"Filter by Parent Type": "Filtrar por tipo pai",
"Minimum File Size (KB)": "Tamanho mínimo do arquivo (KB)",
"Maximum File Size (KB)": "Tamanho máximo do arquivo (KB)",
"Sheet Name Filter": "Filtro de Nome da Chapa",
"Exact Name Match": "Correspondência de nome exata",
"Access API Level": "Nível de acesso API",
"Filter by Access Level": "Filtrar por Nível de Acesso",
"Include Sheet Version": "Incluir Versão da Planilha",
"Include Source Information": "Incluir Informações da Fonte",
"Numeric Dates": "Datas Numéricas",
"Created Date Range": "Intervalo de datas criado",
"Sort Results By": "Classificar Resultados Por",
"Select a sheet": "Selecione uma folha",
"Cell data with properties based on column types": "Dados de célula com propriedades baseadas nos tipos de coluna",
"Type of attachment to add": "Tipo de anexo a adicionar",
"The file to attach (required for FILE type)": "O arquivo a ser anexado (necessário para o tipo FILE)",
"The URL to attach (required for URL-based attachment types)": "A URL para anexar (necessário para tipos de anexos baseados em URL)",
"Name for the attachment (optional, will use file name or URL if not provided)": "Nome do anexo (opcional, usará o nome do arquivo ou URL se não for fornecido)",
"Sub type for Google Drive and Egnyte attachments": "Sub type para anexos do Google Drive e Egnyte",
"MIME type of the attachment (optional, auto-detected for files)": "Tipo MIME do anexo (opcional, auto-detectado para arquivos)",
"Choose whether to search within a specific sheet or across all accessible sheets.": "Escolha se deseja pesquisar dentro de uma planilha específica ou em todas as planilhas acessíveis.",
"Text to search for. Use double quotes for exact phrase matching (e.g., \"project status\")": "Texto para procurar. Use aspas duplas para uma frase exata correspondente (por exemplo, \"status do projeto\")",
"Specify what types of content to search in (leave empty to search all)": "Especificar os tipos de conteúdo para pesquisar (deixe vazio para pesquisar todos)",
"Include information about which items are marked as favorites": "Incluir informações sobre quais itens estão marcados como favoritos",
"Only return results modified on or after this date/time": "Somente os resultados retornados modificados em ou após esta data/hora",
"Maximum number of results to return (default: 50, max: 100)": "Número máximo de resultados a retornar (padrão: 50, máximo: 100)",
"Only return results of specific object types (leave empty for all types)": "Retorna apenas os resultados de tipos de objeto específicos (deixe em branco para todos os tipos)",
"If true, include all results without pagination (overrides page and page size)": "Se verdadeiro, incluir todos os resultados sem paginação (substitui a página e o tamanho da página)",
"Which page to return (defaults to 1, ignored if \"Include All Results\" is true)": "Qual página a retornar (o padrão é 1, ignorado se \"Incluir Todos os Resultados\" é verdadeiro)",
"Maximum number of items to return per page (defaults to 100, max 10000, ignored if \"Include All Results\" is true)": "Número máximo de itens a retornar por página (o padrão é 100, máximo de 10000, ignorado se \"Incluir todos os resultados\" é verdadeiro)",
"Only return attachments of specific types (leave empty for all types)": "Retorna apenas anexos de tipos específicos (deixe em branco para todos os tipos)",
"Only return attachments from specific parent types (leave empty for all)": "Só retorna anexos de tipos pai específicos (deixe em branco para todos)",
"Only return files with size greater than or equal to this value (applies to FILE type only)": "Somente retornar arquivos com tamanho maior ou igual a este valor (aplica-se somente ao tipo ARQUIVO)",
"Only return files with size less than or equal to this value (applies to FILE type only)": "Só retornar arquivos com tamanho inferior ou igual a este valor (aplica-se somente ao tipo ARQUIVO)",
"Filter sheets by name (partial or exact match). Leave empty to list all sheets.": "Filtrar folhas por nome (correspondência parcial ou exata). Deixe em branco para listar todas as folhas.",
"When filtering by name, require exact match instead of partial match": "Quando filtragem por nome, exigir correspondência exata em vez de correspondência parcial",
"API access level for viewing and filtering permissions": "Nível de acesso API para visualizar e filtrar permissões",
"Only return sheets where you have specific access levels (leave empty for all)": "Apenas as planilhas de retorno onde você tenha níveis de acesso específicos (deixe em branco para todas)",
"Only return sheets modified on or after this date/time": "Somente as folhas de devolução modificadas ou após esta data/hora",
"Include current version number of each sheet": "Incluir número da versão atual de cada folha",
"Include information about the source (template/sheet) each sheet was created from": "Incluir informações sobre a fonte (modelo/folha) cada folha foi criada de",
"Return dates as milliseconds since UNIX epoch instead of ISO strings": "Devolver datas como milissegundos desde o período UNIX em vez de sequências de caracteres ISO",
"Filter sheets by creation date range": "Filtrar folhas por intervalo de datas de criação",
"How to sort the returned sheets": "Como classificar as folhas devolvidas",
"Top of sheet": "Parte superior da folha",
"Bottom of sheet": "Rodapé da folha",
"File Upload": "Envio de arquivo",
"URL Link": "Link da URL",
"Box.com": "Box.com",
"Dropbox": "Escaninho",
"Egnyte": "Adormecido",
"Evernote": "Observar",
"Google Drive": "Google Drive",
"OneDrive": "OneDrive",
"Document": "Documento",
"Drawing": "Desenho",
"Folder": "Pasta",
"PDF": "Pdf",
"Presentation": "Apresentação",
"Spreadsheet": "Planilha",
"Specific Sheet": "Folha específica",
"All Accessible Sheets": "Todas as Folhas Acessíveis",
"Cell Data": "Dados da Célula",
"Comments": "comentários",
"Attachments": "Anexos",
"Sheet Names": "Nomes de Chapas",
"Folder Names": "Nomes de pasta",
"Report Names": "Denunciar nomes",
"Dashboard Names": "Nomes do Painel",
"Template Names": "Nomes dos Modelos",
"Workspace Names": "Nomes do Workspace",
"Summary Fields": "Campos de Resumo",
"Rows": "Linhas",
"Sheets": "Chapas",
"Comments/Discussions": "Comentários/Discussões",
"Dashboards": "Painéis",
"Reports": "relatórios",
"Folders": "Pastas",
"Templates": "Modelos",
"Workspaces": "Projetos",
"Files": "arquivos",
"URLs/Links": "URLs/Links",
"Trello": "Trello",
"Row Attachments": "Anexos da linha",
"Comment Attachments": "Anexos do comentário",
"Sheet Attachments": "Folhas anexadas",
"Proof Attachments": "Prova de Anexos",
"Viewer (default)": "Visualizador (padrão)",
"Commenter": "Comentador",
"Owner": "Proprietário",
"Admin": "Administrador",
"Editor (with sharing)": "Editor (com compartilhamento)",
"Editor": "Editores",
"Viewer": "Visualizador",
"All time": "Desde o início",
"Last 7 days": "Últimos 7 Dias",
"Last 30 days": "Últimos 30 Dias",
"Last 90 days": "Últimos 90 Dias",
"Last 365 days": "Últimos 365 dias",
"Sheet Name": "Nome da Chapa",
"Creation Date (newest first)": "Data de Criação (mais recente primeiro)",
"Creation Date (oldest first)": "Data de Criação (mais antigo primeiro)",
"Modified Date (newest first)": "Data de Modificação (mais recente primeiro)",
"Modified Date (oldest first)": "Data de Modificação (mais antigo primeiro)",
"Access Level": "Nível de Acesso",
"New Row Added": "Nova linha adicionada",
"Row Updated": "Linha atualizada",
"New Attachment Added": "Novo Anexo Adicionado",
"New Comment Added": "Novo Comentário Adicionado",
"Triggers when a new row is added.": "Dispara quando uma nova linha é adicionada.",
"Triggers when an existing row is updated.": "Dispara quando uma linha existente é atualizada.",
"Triggers when a new attachment is added to a row or sheet.": "Dispara quando um novo anexo é adicionado a uma linha ou folha.",
"Triggers when a new comment is added to a discussion on a sheet.": "Dispara quando um novo comentário é adicionado a uma discussão em uma planilha."
}

View File

@@ -0,0 +1,151 @@
{
"Smartsheet": "Smartsheet",
"Dynamic work execution platform for teams to plan, capture, manage, automate, and report on work at scale.": "Динамическая платформа выполнения работ для планирования, захвата, управления и автоматизации работы в масштабе.",
"\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n": "\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n",
"Add Row to Sheet": "Добавить строку в лист",
"Update Row": "Обновить строку",
"Attach File to Row": "Прикрепить файл к строке",
"Find Row": "Найти строку",
"List Row Attachments": "Список вложений строки",
"Find Sheet(s)": "Найти лист (листов)",
"Adds new row to a sheet.": "Добавляет новую строку в лист.",
"Updates an existing row.": "Обновляет существующую строку.",
"Adds a file attachment to a row.": "Добавляет вложение файла в строку.",
"Finds rows in a specific sheet or across all accessible sheets using text queries with advanced filtering options.": "Поиск строк в спецификации или по всем доступным листам, используя текстовые запросы с расширенными настройками фильтрации.",
"Get all attachments for a specific row in a Smartsheet, including row and discussion-level attachments with comprehensive pagination and filtering options": "Получить все вложения для определенного ряда в Smartsheet, включая вложения ряда и уровня обсуждения с подробной пагинацией и фильтрацией опций",
"Fetches existings sheets matching provided filter criteria.": "Извлекает существующие таблицы, соответствующие установленным критериям фильтрации.",
"Sheet": "Лист",
"Cells": "Гены",
"Add Row to Top or Bottom": "Добавить строку вверху или внизу",
"Row": "Строка",
"Attachment Type": "Тип вложения",
"File": "Файл",
"URL": "URL",
"Attachment Name": "Название вложения",
"Attachment Sub Type": "Вложение подтипа",
"MIME Type": "MIME-тип",
"Search Scope": "Область поиска",
"Search Query": "Поисковый запрос",
"Search Scopes": "Поиск по сферам",
"Include Favorite Flags": "Включить флаги избранного",
"Modified Since": "Изменено с",
"Max Results": "Макс. результатов",
"Filter by Object Types": "Фильтр по типам объектов",
"Include All Results": "Включить все результаты",
"Page Number": "Номер страницы",
"Page Size": "Размер страницы",
"Filter by Attachment Type": "Фильтровать по типу вложения",
"Filter by Parent Type": "Фильтр по родительскому типу",
"Minimum File Size (KB)": "Минимальный размер файла (KB)",
"Maximum File Size (KB)": "Максимальный размер файла (КБ)",
"Sheet Name Filter": "Фильтр имен листа",
"Exact Name Match": "Точное соответствие имен",
"Access API Level": "Уровень доступа к API",
"Filter by Access Level": "Фильтр по уровню доступа",
"Include Sheet Version": "Включить версию листа",
"Include Source Information": "Включить информацию об источнике",
"Numeric Dates": "Числовые даты",
"Created Date Range": "Дата создания",
"Sort Results By": "Сортировать по",
"Select a sheet": "Выберите лист",
"Cell data with properties based on column types": "Данные ячейки со свойствами на основе типов столбцов",
"Type of attachment to add": "Тип вложения для добавления",
"The file to attach (required for FILE type)": "Прикрепляемый файл (требуется для типа ФАЙЛ)",
"The URL to attach (required for URL-based attachment types)": "URL-адрес для вложения (требуется для типов вложений по URL)",
"Name for the attachment (optional, will use file name or URL if not provided)": "Имя для вложения (необязательно, будет использовать имя файла или URL, если не указано)",
"Sub type for Google Drive and Egnyte attachments": "Тип вложений Google Drive и Egnyte",
"MIME type of the attachment (optional, auto-detected for files)": "MIME тип вложения (опционально, автоопределение для файлов)",
"Choose whether to search within a specific sheet or across all accessible sheets.": "Выберите, нужно ли искать в конкретном листе или на всех доступных листах.",
"Text to search for. Use double quotes for exact phrase matching (e.g., \"project status\")": "Текст для поиска. Используйте двойные кавычки для точного совпадения фразы (например, «статус проекта»)",
"Specify what types of content to search in (leave empty to search all)": "Укажите типы содержимого для поиска (оставьте пустым для поиска всех)",
"Include information about which items are marked as favorites": "Включить информацию о том, какие элементы помечены как избранные",
"Only return results modified on or after this date/time": "Изменены только результаты возврата на или после этой даты/времени",
"Maximum number of results to return (default: 50, max: 100)": "Максимальное количество результатов (по умолчанию: 50, макс: 100)",
"Only return results of specific object types (leave empty for all types)": "Возвращает только результаты определенных типов объектов (оставьте пустым для всех типов)",
"If true, include all results without pagination (overrides page and page size)": "Если включено, включить все результаты без пагинации (переопределяет страницу и размер страницы)",
"Which page to return (defaults to 1, ignored if \"Include All Results\" is true)": "Какая страница возврата (по умолчанию 1, проигнорирована, если «Включить все результаты» истинно)",
"Maximum number of items to return per page (defaults to 100, max 10000, ignored if \"Include All Results\" is true)": "Максимальное количество элементов для возврата на странице (по умолчанию 100, максимум 10000, проигнорировано, если «Включить все результаты» истинны)",
"Only return attachments of specific types (leave empty for all types)": "Возврат вложений определенных типов (оставьте пустым для всех типов)",
"Only return attachments from specific parent types (leave empty for all)": "Возвращать вложения только от определенных родительских типов (оставьте пустым для всех)",
"Only return files with size greater than or equal to this value (applies to FILE type only)": "Возвращает только файлы с размером больше или равным этому значению (относится только к типу ФАЙЛ)",
"Only return files with size less than or equal to this value (applies to FILE type only)": "Возвращает файлы только с размером меньше или равным этому значению (относится только к типу ФАЙЛ)",
"Filter sheets by name (partial or exact match). Leave empty to list all sheets.": "Фильтр по имени (частичное или точное соответствие). Оставьте пустым для списка всех листов.",
"When filtering by name, require exact match instead of partial match": "При фильтрации по имени, требуется точное совпадение вместо частичного совпадения",
"API access level for viewing and filtering permissions": "Уровень доступа к API для просмотра и фильтрации разрешений",
"Only return sheets where you have specific access levels (leave empty for all)": "Возвращаемые листы с определенными уровнями доступа (оставьте пустым для всех)",
"Only return sheets modified on or after this date/time": "Только возвращаемые листы изменены на или после этой даты/времени",
"Include current version number of each sheet": "Включить номер текущей версии каждого листа",
"Include information about the source (template/sheet) each sheet was created from": "Включать информацию об источнике (шаблон/листа) каждый лист был создан из",
"Return dates as milliseconds since UNIX epoch instead of ISO strings": "Даты возврата в миллисекундах, начиная с UNIX эпохи вместо строк ISO",
"Filter sheets by creation date range": "Фильтр по диапазону дат создания",
"How to sort the returned sheets": "Как сортировать возвращаемые листы",
"Top of sheet": "Верх листа",
"Bottom of sheet": "Нижняя листа",
"File Upload": "Загрузка файла",
"URL Link": "Ссылка URL",
"Box.com": "Box.com",
"Dropbox": "Dropbox",
"Egnyte": "Эгнит",
"Evernote": "Evernote",
"Google Drive": "Google диск",
"OneDrive": "OneDrive",
"Document": "Документ",
"Drawing": "Рисунок",
"Folder": "Папка",
"PDF": "PDF",
"Presentation": "Представление",
"Spreadsheet": "Электронная таблица",
"Specific Sheet": "Конкретный лист",
"All Accessible Sheets": "Все доступные листы",
"Cell Data": "Данные ячейки",
"Comments": "Комментарии",
"Attachments": "Вложения",
"Sheet Names": "Имена листов",
"Folder Names": "Названия папок",
"Report Names": "Имена отчетов",
"Dashboard Names": "Название панели инструментов",
"Template Names": "Названия шаблонов",
"Workspace Names": "Названия проекта",
"Summary Fields": "Сводные поля",
"Rows": "Строки",
"Sheets": "Листы",
"Comments/Discussions": "Комментарии/обсуждения",
"Dashboards": "Рабочие столы",
"Reports": "Отчёты",
"Folders": "Папки",
"Templates": "Шаблоны",
"Workspaces": "Рабочие области",
"Files": "Файлы",
"URLs/Links": "URL-адресов/ссылки",
"Trello": "Трелло",
"Row Attachments": "Вложения строк",
"Comment Attachments": "Вложения комментария",
"Sheet Attachments": "Вложения листа",
"Proof Attachments": "Подтверждение вложений",
"Viewer (default)": "Просмотрщик (по умолчанию)",
"Commenter": "Комментатор",
"Owner": "Владелец",
"Admin": "Admin",
"Editor (with sharing)": "Редактор (с общим доступом)",
"Editor": "Editor",
"Viewer": "Просмотрщик",
"All time": "За все время",
"Last 7 days": "Последние 7 дней",
"Last 30 days": "Последние 30 дней",
"Last 90 days": "Последние 90 дней",
"Last 365 days": "Последние 365 дней",
"Sheet Name": "Название листа",
"Creation Date (newest first)": "Дата создания (сначала новые)",
"Creation Date (oldest first)": "Дата создания (сначала старые)",
"Modified Date (newest first)": "Дата изменения (сначала новые)",
"Modified Date (oldest first)": "Дата изменения (сначала старые)",
"Access Level": "Уровень доступа",
"New Row Added": "Добавлена новая строка",
"Row Updated": "Строка обновлена",
"New Attachment Added": "Добавлено новое вложение",
"New Comment Added": "Новый комментарий добавлен",
"Triggers when a new row is added.": "Триггеры при добавлении новой строки.",
"Triggers when an existing row is updated.": "Триггеры при обновлении существующей строки.",
"Triggers when a new attachment is added to a row or sheet.": "Включает при добавлении нового вложения в ряд или лист.",
"Triggers when a new comment is added to a discussion on a sheet.": "Включает при добавлении нового комментария к обсуждению на листах."
}

View File

@@ -0,0 +1,150 @@
{
"Dynamic work execution platform for teams to plan, capture, manage, automate, and report on work at scale.": "Dynamic work execution platform for teams to plan, capture, manage, automate, and report on work at scale.",
"\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n": "\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n",
"Add Row to Sheet": "Add Row to Sheet",
"Update Row": "Update Row",
"Attach File to Row": "Attach File to Row",
"Find Row": "Find Row",
"List Row Attachments": "List Row Attachments",
"Find Sheet(s)": "Find Sheet(s)",
"Adds new row to a sheet.": "Adds new row to a sheet.",
"Updates an existing row.": "Updates an existing row.",
"Adds a file attachment to a row.": "Adds a file attachment to a row.",
"Finds rows in a specific sheet or across all accessible sheets using text queries with advanced filtering options.": "Finds rows in a specific sheet or across all accessible sheets using text queries with advanced filtering options.",
"Get all attachments for a specific row in a Smartsheet, including row and discussion-level attachments with comprehensive pagination and filtering options": "Get all attachments for a specific row in a Smartsheet, including row and discussion-level attachments with comprehensive pagination and filtering options",
"Fetches existings sheets matching provided filter criteria.": "Fetches existings sheets matching provided filter criteria.",
"Sheet": "Sheet",
"Cells": "Cells",
"Add Row to Top or Bottom": "Add Row to Top or Bottom",
"Row": "Row",
"Attachment Type": "Attachment Type",
"File": "File",
"URL": "URL",
"Attachment Name": "Attachment Name",
"Attachment Sub Type": "Attachment Sub Type",
"MIME Type": "MIME Type",
"Search Scope": "Search Scope",
"Search Query": "Search Query",
"Search Scopes": "Search Scopes",
"Include Favorite Flags": "Include Favorite Flags",
"Modified Since": "Modified Since",
"Max Results": "Max Results",
"Filter by Object Types": "Filter by Object Types",
"Include All Results": "Include All Results",
"Page Number": "Page Number",
"Page Size": "Page Size",
"Filter by Attachment Type": "Filter by Attachment Type",
"Filter by Parent Type": "Filter by Parent Type",
"Minimum File Size (KB)": "Minimum File Size (KB)",
"Maximum File Size (KB)": "Maximum File Size (KB)",
"Sheet Name Filter": "Sheet Name Filter",
"Exact Name Match": "Exact Name Match",
"Access API Level": "Access API Level",
"Filter by Access Level": "Filter by Access Level",
"Include Sheet Version": "Include Sheet Version",
"Include Source Information": "Include Source Information",
"Numeric Dates": "Numeric Dates",
"Created Date Range": "Created Date Range",
"Sort Results By": "Sort Results By",
"Select a sheet": "Select a sheet",
"Cell data with properties based on column types": "Cell data with properties based on column types",
"Type of attachment to add": "Type of attachment to add",
"The file to attach (required for FILE type)": "The file to attach (required for FILE type)",
"The URL to attach (required for URL-based attachment types)": "The URL to attach (required for URL-based attachment types)",
"Name for the attachment (optional, will use file name or URL if not provided)": "Name for the attachment (optional, will use file name or URL if not provided)",
"Sub type for Google Drive and Egnyte attachments": "Sub type for Google Drive and Egnyte attachments",
"MIME type of the attachment (optional, auto-detected for files)": "MIME type of the attachment (optional, auto-detected for files)",
"Choose whether to search within a specific sheet or across all accessible sheets.": "Choose whether to search within a specific sheet or across all accessible sheets.",
"Text to search for. Use double quotes for exact phrase matching (e.g., \"project status\")": "Text to search for. Use double quotes for exact phrase matching (e.g., \"project status\")",
"Specify what types of content to search in (leave empty to search all)": "Specify what types of content to search in (leave empty to search all)",
"Include information about which items are marked as favorites": "Include information about which items are marked as favorites",
"Only return results modified on or after this date/time": "Only return results modified on or after this date/time",
"Maximum number of results to return (default: 50, max: 100)": "Maximum number of results to return (default: 50, max: 100)",
"Only return results of specific object types (leave empty for all types)": "Only return results of specific object types (leave empty for all types)",
"If true, include all results without pagination (overrides page and page size)": "If true, include all results without pagination (overrides page and page size)",
"Which page to return (defaults to 1, ignored if \"Include All Results\" is true)": "Which page to return (defaults to 1, ignored if \"Include All Results\" is true)",
"Maximum number of items to return per page (defaults to 100, max 10000, ignored if \"Include All Results\" is true)": "Maximum number of items to return per page (defaults to 100, max 10000, ignored if \"Include All Results\" is true)",
"Only return attachments of specific types (leave empty for all types)": "Only return attachments of specific types (leave empty for all types)",
"Only return attachments from specific parent types (leave empty for all)": "Only return attachments from specific parent types (leave empty for all)",
"Only return files with size greater than or equal to this value (applies to FILE type only)": "Only return files with size greater than or equal to this value (applies to FILE type only)",
"Only return files with size less than or equal to this value (applies to FILE type only)": "Only return files with size less than or equal to this value (applies to FILE type only)",
"Filter sheets by name (partial or exact match). Leave empty to list all sheets.": "Filter sheets by name (partial or exact match). Leave empty to list all sheets.",
"When filtering by name, require exact match instead of partial match": "When filtering by name, require exact match instead of partial match",
"API access level for viewing and filtering permissions": "API access level for viewing and filtering permissions",
"Only return sheets where you have specific access levels (leave empty for all)": "Only return sheets where you have specific access levels (leave empty for all)",
"Only return sheets modified on or after this date/time": "Only return sheets modified on or after this date/time",
"Include current version number of each sheet": "Include current version number of each sheet",
"Include information about the source (template/sheet) each sheet was created from": "Include information about the source (template/sheet) each sheet was created from",
"Return dates as milliseconds since UNIX epoch instead of ISO strings": "Return dates as milliseconds since UNIX epoch instead of ISO strings",
"Filter sheets by creation date range": "Filter sheets by creation date range",
"How to sort the returned sheets": "How to sort the returned sheets",
"Top of sheet": "Top of sheet",
"Bottom of sheet": "Bottom of sheet",
"File Upload": "File Upload",
"URL Link": "URL Link",
"Box.com": "Box.com",
"Dropbox": "Dropbox",
"Egnyte": "Egnyte",
"Evernote": "Evernote",
"Google Drive": "Google Drive",
"OneDrive": "OneDrive",
"Document": "Document",
"Drawing": "Drawing",
"Folder": "Folder",
"PDF": "PDF",
"Presentation": "Presentation",
"Spreadsheet": "Spreadsheet",
"Specific Sheet": "Specific Sheet",
"All Accessible Sheets": "All Accessible Sheets",
"Cell Data": "Cell Data",
"Comments": "Comments",
"Attachments": "Attachments",
"Sheet Names": "Sheet Names",
"Folder Names": "Folder Names",
"Report Names": "Report Names",
"Dashboard Names": "Dashboard Names",
"Template Names": "Template Names",
"Workspace Names": "Workspace Names",
"Summary Fields": "Summary Fields",
"Rows": "Rows",
"Sheets": "Sheets",
"Comments/Discussions": "Comments/Discussions",
"Dashboards": "Dashboards",
"Reports": "Reports",
"Folders": "Folders",
"Templates": "Templates",
"Workspaces": "Workspaces",
"Files": "Files",
"URLs/Links": "URLs/Links",
"Trello": "Trello",
"Row Attachments": "Row Attachments",
"Comment Attachments": "Comment Attachments",
"Sheet Attachments": "Sheet Attachments",
"Proof Attachments": "Proof Attachments",
"Viewer (default)": "Viewer (default)",
"Commenter": "Commenter",
"Owner": "Owner",
"Admin": "Admin",
"Editor (with sharing)": "Editor (with sharing)",
"Editor": "Editor",
"Viewer": "Viewer",
"All time": "All time",
"Last 7 days": "Last 7 days",
"Last 30 days": "Last 30 days",
"Last 90 days": "Last 90 days",
"Last 365 days": "Last 365 days",
"Sheet Name": "Sheet Name",
"Creation Date (newest first)": "Creation Date (newest first)",
"Creation Date (oldest first)": "Creation Date (oldest first)",
"Modified Date (newest first)": "Modified Date (newest first)",
"Modified Date (oldest first)": "Modified Date (oldest first)",
"Access Level": "Access Level",
"New Row Added": "New Row Added",
"Row Updated": "Row Updated",
"New Attachment Added": "New Attachment Added",
"New Comment Added": "New Comment Added",
"Triggers when a new row is added.": "Triggers when a new row is added.",
"Triggers when an existing row is updated.": "Triggers when an existing row is updated.",
"Triggers when a new attachment is added to a row or sheet.": "Triggers when a new attachment is added to a row or sheet.",
"Triggers when a new comment is added to a discussion on a sheet.": "Triggers when a new comment is added to a discussion on a sheet."
}

View File

@@ -0,0 +1,151 @@
{
"Smartsheet": "Smartsheet",
"Dynamic work execution platform for teams to plan, capture, manage, automate, and report on work at scale.": "Dynamic work execution platform for teams to plan, capture, manage, automate, and report on work at scale.",
"\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n": "\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n",
"Add Row to Sheet": "Add Row to Sheet",
"Update Row": "Update Row",
"Attach File to Row": "Attach File to Row",
"Find Row": "Find Row",
"List Row Attachments": "List Row Attachments",
"Find Sheet(s)": "Find Sheet(s)",
"Adds new row to a sheet.": "Adds new row to a sheet.",
"Updates an existing row.": "Updates an existing row.",
"Adds a file attachment to a row.": "Adds a file attachment to a row.",
"Finds rows in a specific sheet or across all accessible sheets using text queries with advanced filtering options.": "Finds rows in a specific sheet or across all accessible sheets using text queries with advanced filtering options.",
"Get all attachments for a specific row in a Smartsheet, including row and discussion-level attachments with comprehensive pagination and filtering options": "Get all attachments for a specific row in a Smartsheet, including row and discussion-level attachments with comprehensive pagination and filtering options",
"Fetches existings sheets matching provided filter criteria.": "Fetches existings sheets matching provided filter criteria.",
"Sheet": "Sheet",
"Cells": "Cells",
"Add Row to Top or Bottom": "Add Row to Top or Bottom",
"Row": "Row",
"Attachment Type": "Attachment Type",
"File": "File",
"URL": "URL",
"Attachment Name": "Attachment Name",
"Attachment Sub Type": "Attachment Sub Type",
"MIME Type": "MIME Type",
"Search Scope": "Search Scope",
"Search Query": "Search Query",
"Search Scopes": "Search Scopes",
"Include Favorite Flags": "Include Favorite Flags",
"Modified Since": "Modified Since",
"Max Results": "Max Results",
"Filter by Object Types": "Filter by Object Types",
"Include All Results": "Include All Results",
"Page Number": "Page Number",
"Page Size": "Phân trang",
"Filter by Attachment Type": "Filter by Attachment Type",
"Filter by Parent Type": "Filter by Parent Type",
"Minimum File Size (KB)": "Minimum File Size (KB)",
"Maximum File Size (KB)": "Maximum File Size (KB)",
"Sheet Name Filter": "Sheet Name Filter",
"Exact Name Match": "Exact Name Match",
"Access API Level": "Access API Level",
"Filter by Access Level": "Filter by Access Level",
"Include Sheet Version": "Include Sheet Version",
"Include Source Information": "Include Source Information",
"Numeric Dates": "Numeric Dates",
"Created Date Range": "Created Date Range",
"Sort Results By": "Sort Results By",
"Select a sheet": "Select a sheet",
"Cell data with properties based on column types": "Cell data with properties based on column types",
"Type of attachment to add": "Type of attachment to add",
"The file to attach (required for FILE type)": "The file to attach (required for FILE type)",
"The URL to attach (required for URL-based attachment types)": "The URL to attach (required for URL-based attachment types)",
"Name for the attachment (optional, will use file name or URL if not provided)": "Name for the attachment (optional, will use file name or URL if not provided)",
"Sub type for Google Drive and Egnyte attachments": "Sub type for Google Drive and Egnyte attachments",
"MIME type of the attachment (optional, auto-detected for files)": "MIME type of the attachment (optional, auto-detected for files)",
"Choose whether to search within a specific sheet or across all accessible sheets.": "Choose whether to search within a specific sheet or across all accessible sheets.",
"Text to search for. Use double quotes for exact phrase matching (e.g., \"project status\")": "Text to search for. Use double quotes for exact phrase matching (e.g., \"project status\")",
"Specify what types of content to search in (leave empty to search all)": "Specify what types of content to search in (leave empty to search all)",
"Include information about which items are marked as favorites": "Include information about which items are marked as favorites",
"Only return results modified on or after this date/time": "Only return results modified on or after this date/time",
"Maximum number of results to return (default: 50, max: 100)": "Maximum number of results to return (default: 50, max: 100)",
"Only return results of specific object types (leave empty for all types)": "Only return results of specific object types (leave empty for all types)",
"If true, include all results without pagination (overrides page and page size)": "If true, include all results without pagination (overrides page and page size)",
"Which page to return (defaults to 1, ignored if \"Include All Results\" is true)": "Which page to return (defaults to 1, ignored if \"Include All Results\" is true)",
"Maximum number of items to return per page (defaults to 100, max 10000, ignored if \"Include All Results\" is true)": "Maximum number of items to return per page (defaults to 100, max 10000, ignored if \"Include All Results\" is true)",
"Only return attachments of specific types (leave empty for all types)": "Only return attachments of specific types (leave empty for all types)",
"Only return attachments from specific parent types (leave empty for all)": "Only return attachments from specific parent types (leave empty for all)",
"Only return files with size greater than or equal to this value (applies to FILE type only)": "Only return files with size greater than or equal to this value (applies to FILE type only)",
"Only return files with size less than or equal to this value (applies to FILE type only)": "Only return files with size less than or equal to this value (applies to FILE type only)",
"Filter sheets by name (partial or exact match). Leave empty to list all sheets.": "Filter sheets by name (partial or exact match). Leave empty to list all sheets.",
"When filtering by name, require exact match instead of partial match": "When filtering by name, require exact match instead of partial match",
"API access level for viewing and filtering permissions": "API access level for viewing and filtering permissions",
"Only return sheets where you have specific access levels (leave empty for all)": "Only return sheets where you have specific access levels (leave empty for all)",
"Only return sheets modified on or after this date/time": "Only return sheets modified on or after this date/time",
"Include current version number of each sheet": "Include current version number of each sheet",
"Include information about the source (template/sheet) each sheet was created from": "Include information about the source (template/sheet) each sheet was created from",
"Return dates as milliseconds since UNIX epoch instead of ISO strings": "Return dates as milliseconds since UNIX epoch instead of ISO strings",
"Filter sheets by creation date range": "Filter sheets by creation date range",
"How to sort the returned sheets": "How to sort the returned sheets",
"Top of sheet": "Top of sheet",
"Bottom of sheet": "Bottom of sheet",
"File Upload": "File Upload",
"URL Link": "URL Link",
"Box.com": "Box.com",
"Dropbox": "Dropbox",
"Egnyte": "Egnyte",
"Evernote": "Evernote",
"Google Drive": "Google Drive",
"OneDrive": "OneDrive",
"Document": "Document",
"Drawing": "Drawing",
"Folder": "Folder",
"PDF": "PDF",
"Presentation": "Presentation",
"Spreadsheet": "Spreadsheet",
"Specific Sheet": "Specific Sheet",
"All Accessible Sheets": "All Accessible Sheets",
"Cell Data": "Cell Data",
"Comments": "Comments",
"Attachments": "Attachments",
"Sheet Names": "Sheet Names",
"Folder Names": "Folder Names",
"Report Names": "Report Names",
"Dashboard Names": "Dashboard Names",
"Template Names": "Template Names",
"Workspace Names": "Workspace Names",
"Summary Fields": "Summary Fields",
"Rows": "Rows",
"Sheets": "Sheets",
"Comments/Discussions": "Comments/Discussions",
"Dashboards": "Dashboards",
"Reports": "Reports",
"Folders": "Folders",
"Templates": "Templates",
"Workspaces": "Workspaces",
"Files": "Files",
"URLs/Links": "URLs/Links",
"Trello": "Trello",
"Row Attachments": "Row Attachments",
"Comment Attachments": "Comment Attachments",
"Sheet Attachments": "Sheet Attachments",
"Proof Attachments": "Proof Attachments",
"Viewer (default)": "Viewer (default)",
"Commenter": "Commenter",
"Owner": "Owner",
"Admin": "Admin",
"Editor (with sharing)": "Editor (with sharing)",
"Editor": "Editor",
"Viewer": "Viewer",
"All time": "All time",
"Last 7 days": "Last 7 days",
"Last 30 days": "Last 30 days",
"Last 90 days": "Last 90 days",
"Last 365 days": "Last 365 days",
"Sheet Name": "Sheet Name",
"Creation Date (newest first)": "Creation Date (newest first)",
"Creation Date (oldest first)": "Creation Date (oldest first)",
"Modified Date (newest first)": "Modified Date (newest first)",
"Modified Date (oldest first)": "Modified Date (oldest first)",
"Access Level": "Access Level",
"New Row Added": "New Row Added",
"Row Updated": "Row Updated",
"New Attachment Added": "New Attachment Added",
"New Comment Added": "New Comment Added",
"Triggers when a new row is added.": "Triggers when a new row is added.",
"Triggers when an existing row is updated.": "Triggers when an existing row is updated.",
"Triggers when a new attachment is added to a row or sheet.": "Triggers when a new attachment is added to a row or sheet.",
"Triggers when a new comment is added to a discussion on a sheet.": "Triggers when a new comment is added to a discussion on a sheet."
}

View File

@@ -0,0 +1,150 @@
{
"Dynamic work execution platform for teams to plan, capture, manage, automate, and report on work at scale.": "Dynamic work execution platform for teams to plan, capture, manage, automate, and report on work at scale.",
"\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n": "\nTo obtain your Smartsheet access token:\n\n1. Sign in to your Smartsheet account.\n2. Click on your profile picture in the top right corner.\n3. Select **Personal Settings** from the dropdown menu.\n4. In the left panel, click **API Access**.\n5. Click **Generate new access token**.\n6. Enter a name for your token (e.g., \"Activepieces Integration\").\n7. Click **OK** to generate the token..\n8. Copy the access token and paste it into the connection field.\n",
"Add Row to Sheet": "Add Row to Sheet",
"Update Row": "更新行",
"Attach File to Row": "Attach File to Row",
"Find Row": "Find Row",
"List Row Attachments": "List Row Attachments",
"Find Sheet(s)": "Find Sheet(s)",
"Adds new row to a sheet.": "Adds new row to a sheet.",
"Updates an existing row.": "Updates an existing row.",
"Adds a file attachment to a row.": "Adds a file attachment to a row.",
"Finds rows in a specific sheet or across all accessible sheets using text queries with advanced filtering options.": "Finds rows in a specific sheet or across all accessible sheets using text queries with advanced filtering options.",
"Get all attachments for a specific row in a Smartsheet, including row and discussion-level attachments with comprehensive pagination and filtering options": "Get all attachments for a specific row in a Smartsheet, including row and discussion-level attachments with comprehensive pagination and filtering options",
"Fetches existings sheets matching provided filter criteria.": "Fetches existings sheets matching provided filter criteria.",
"Sheet": "工作表",
"Cells": "Cells",
"Add Row to Top or Bottom": "Add Row to Top or Bottom",
"Row": "Row",
"Attachment Type": "Attachment Type",
"File": "文件",
"URL": "URL",
"Attachment Name": "Attachment Name",
"Attachment Sub Type": "Attachment Sub Type",
"MIME Type": "MIME Type",
"Search Scope": "Search Scope",
"Search Query": "Search Query",
"Search Scopes": "Search Scopes",
"Include Favorite Flags": "Include Favorite Flags",
"Modified Since": "Modified Since",
"Max Results": "Max Results",
"Filter by Object Types": "Filter by Object Types",
"Include All Results": "Include All Results",
"Page Number": "Page Number",
"Page Size": "Page Size",
"Filter by Attachment Type": "Filter by Attachment Type",
"Filter by Parent Type": "Filter by Parent Type",
"Minimum File Size (KB)": "Minimum File Size (KB)",
"Maximum File Size (KB)": "Maximum File Size (KB)",
"Sheet Name Filter": "Sheet Name Filter",
"Exact Name Match": "Exact Name Match",
"Access API Level": "Access API Level",
"Filter by Access Level": "Filter by Access Level",
"Include Sheet Version": "Include Sheet Version",
"Include Source Information": "Include Source Information",
"Numeric Dates": "Numeric Dates",
"Created Date Range": "Created Date Range",
"Sort Results By": "Sort Results By",
"Select a sheet": "Select a sheet",
"Cell data with properties based on column types": "Cell data with properties based on column types",
"Type of attachment to add": "Type of attachment to add",
"The file to attach (required for FILE type)": "The file to attach (required for FILE type)",
"The URL to attach (required for URL-based attachment types)": "The URL to attach (required for URL-based attachment types)",
"Name for the attachment (optional, will use file name or URL if not provided)": "Name for the attachment (optional, will use file name or URL if not provided)",
"Sub type for Google Drive and Egnyte attachments": "Sub type for Google Drive and Egnyte attachments",
"MIME type of the attachment (optional, auto-detected for files)": "MIME type of the attachment (optional, auto-detected for files)",
"Choose whether to search within a specific sheet or across all accessible sheets.": "Choose whether to search within a specific sheet or across all accessible sheets.",
"Text to search for. Use double quotes for exact phrase matching (e.g., \"project status\")": "Text to search for. Use double quotes for exact phrase matching (e.g., \"project status\")",
"Specify what types of content to search in (leave empty to search all)": "Specify what types of content to search in (leave empty to search all)",
"Include information about which items are marked as favorites": "Include information about which items are marked as favorites",
"Only return results modified on or after this date/time": "Only return results modified on or after this date/time",
"Maximum number of results to return (default: 50, max: 100)": "Maximum number of results to return (default: 50, max: 100)",
"Only return results of specific object types (leave empty for all types)": "Only return results of specific object types (leave empty for all types)",
"If true, include all results without pagination (overrides page and page size)": "If true, include all results without pagination (overrides page and page size)",
"Which page to return (defaults to 1, ignored if \"Include All Results\" is true)": "Which page to return (defaults to 1, ignored if \"Include All Results\" is true)",
"Maximum number of items to return per page (defaults to 100, max 10000, ignored if \"Include All Results\" is true)": "Maximum number of items to return per page (defaults to 100, max 10000, ignored if \"Include All Results\" is true)",
"Only return attachments of specific types (leave empty for all types)": "Only return attachments of specific types (leave empty for all types)",
"Only return attachments from specific parent types (leave empty for all)": "Only return attachments from specific parent types (leave empty for all)",
"Only return files with size greater than or equal to this value (applies to FILE type only)": "Only return files with size greater than or equal to this value (applies to FILE type only)",
"Only return files with size less than or equal to this value (applies to FILE type only)": "Only return files with size less than or equal to this value (applies to FILE type only)",
"Filter sheets by name (partial or exact match). Leave empty to list all sheets.": "Filter sheets by name (partial or exact match). Leave empty to list all sheets.",
"When filtering by name, require exact match instead of partial match": "When filtering by name, require exact match instead of partial match",
"API access level for viewing and filtering permissions": "API access level for viewing and filtering permissions",
"Only return sheets where you have specific access levels (leave empty for all)": "Only return sheets where you have specific access levels (leave empty for all)",
"Only return sheets modified on or after this date/time": "Only return sheets modified on or after this date/time",
"Include current version number of each sheet": "Include current version number of each sheet",
"Include information about the source (template/sheet) each sheet was created from": "Include information about the source (template/sheet) each sheet was created from",
"Return dates as milliseconds since UNIX epoch instead of ISO strings": "Return dates as milliseconds since UNIX epoch instead of ISO strings",
"Filter sheets by creation date range": "Filter sheets by creation date range",
"How to sort the returned sheets": "How to sort the returned sheets",
"Top of sheet": "Top of sheet",
"Bottom of sheet": "Bottom of sheet",
"File Upload": "File Upload",
"URL Link": "URL Link",
"Box.com": "Box.com",
"Dropbox": "Dropbox",
"Egnyte": "Egnyte",
"Evernote": "Evernote",
"Google Drive": "Google Drive",
"OneDrive": "OneDrive",
"Document": "Document",
"Drawing": "Drawing",
"Folder": "Folder",
"PDF": "PDF",
"Presentation": "Presentation",
"Spreadsheet": "电子表格",
"Specific Sheet": "Specific Sheet",
"All Accessible Sheets": "All Accessible Sheets",
"Cell Data": "Cell Data",
"Comments": "Comments",
"Attachments": "Attachments",
"Sheet Names": "Sheet Names",
"Folder Names": "Folder Names",
"Report Names": "Report Names",
"Dashboard Names": "Dashboard Names",
"Template Names": "Template Names",
"Workspace Names": "Workspace Names",
"Summary Fields": "Summary Fields",
"Rows": "Rows",
"Sheets": "Sheets",
"Comments/Discussions": "Comments/Discussions",
"Dashboards": "Dashboards",
"Reports": "Reports",
"Folders": "Folders",
"Templates": "Templates",
"Workspaces": "Workspaces",
"Files": "Files",
"URLs/Links": "URLs/Links",
"Trello": "Trello",
"Row Attachments": "Row Attachments",
"Comment Attachments": "Comment Attachments",
"Sheet Attachments": "Sheet Attachments",
"Proof Attachments": "Proof Attachments",
"Viewer (default)": "Viewer (default)",
"Commenter": "Commenter",
"Owner": "所有者",
"Admin": "管理员",
"Editor (with sharing)": "Editor (with sharing)",
"Editor": "编辑器",
"Viewer": "查看器",
"All time": "All time",
"Last 7 days": "Last 7 days",
"Last 30 days": "Last 30 days",
"Last 90 days": "Last 90 days",
"Last 365 days": "Last 365 days",
"Sheet Name": "Sheet Name",
"Creation Date (newest first)": "Creation Date (newest first)",
"Creation Date (oldest first)": "Creation Date (oldest first)",
"Modified Date (newest first)": "Modified Date (newest first)",
"Modified Date (oldest first)": "Modified Date (oldest first)",
"Access Level": "Access Level",
"New Row Added": "添加新行",
"Row Updated": "Row Updated",
"New Attachment Added": "New Attachment Added",
"New Comment Added": "New Comment Added",
"Triggers when a new row is added.": "Triggers when a new row is added.",
"Triggers when an existing row is updated.": "Triggers when an existing row is updated.",
"Triggers when a new attachment is added to a row or sheet.": "Triggers when a new attachment is added to a row or sheet.",
"Triggers when a new comment is added to a discussion on a sheet.": "Triggers when a new comment is added to a discussion on a sheet."
}

View File

@@ -0,0 +1,82 @@
import { createPiece, PieceAuth } from '@activepieces/pieces-framework';
import { PieceCategory } from '@activepieces/shared';
import { HttpMethod, HttpRequest, httpClient } from '@activepieces/pieces-common';
// Actions
import { addRowToSheet } from './lib/actions/add-row-to-sheet';
import { updateRow } from './lib/actions/update-row';
import { attachFileToRow } from './lib/actions/attach-file-to-row';
import { findRowsByQuery } from './lib/actions/find-rows-by-query';
import { findAttachmentByRowId } from './lib/actions/find-attachment-by-row-id';
import { findSheetByName } from './lib/actions/find-sheet-by-name';
// Webhook Triggers
import { newRowAddedTrigger } from './lib/triggers/new-row-trigger';
import { updatedRowTrigger } from './lib/triggers/updated-row-trigger';
import { newAttachmentTrigger } from './lib/triggers/new-attachment-trigger';
import { newCommentTrigger } from './lib/triggers/new-comment-trigger';
const markdownDescription = `
To obtain your Smartsheet access token:
1. Sign in to your Smartsheet account.
2. Click on your profile picture in the top right corner.
3. Select **Personal Settings** from the dropdown menu.
4. In the left panel, click **API Access**.
5. Click **Generate new access token**.
6. Enter a name for your token (e.g., "Activepieces Integration").
7. Click **OK** to generate the token..
8. Copy the access token and paste it into the connection field.
`;
export const smartsheetAuth = PieceAuth.SecretText({
displayName: 'Access Token',
description: markdownDescription,
required: true,
validate: async ({ auth }) => {
if (!auth) {
return {
valid: false,
error: 'Access token is required',
};
}
try {
const request: HttpRequest = {
method: HttpMethod.GET,
url: 'https://api.smartsheet.com/2.0/sheets',
headers: {
Authorization: `Bearer ${auth}`,
'Content-Type': 'application/json',
},
};
await httpClient.sendRequest(request);
return { valid: true };
} catch (error) {
return {
valid: false,
error:
'Invalid access token, insufficient permissions, or region mismatch. Ensure token is for api.smartsheet.com.',
};
}
},
});
export const smartsheet = createPiece({
displayName: 'Smartsheet',
description:
'Dynamic work execution platform for teams to plan, capture, manage, automate, and report on work at scale.',
auth: smartsheetAuth,
minimumSupportedRelease: '0.36.1',
logoUrl: 'https://cdn.activepieces.com/pieces/smartsheet.png',
categories: [PieceCategory.PRODUCTIVITY],
authors: ['onyedikachi-david', 'kishanprmr'],
actions: [
addRowToSheet,
updateRow,
attachFileToRow,
findRowsByQuery,
findAttachmentByRowId,
findSheetByName,
],
triggers: [newRowAddedTrigger, updatedRowTrigger, newAttachmentTrigger, newCommentTrigger],
});

View File

@@ -0,0 +1,102 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { smartsheetAuth } from '../../index';
import { smartsheetCommon, addRowToSmartsheet } from '../common';
export const addRowToSheet = createAction({
auth: smartsheetAuth,
name: 'add_row_to_sheet',
displayName: 'Add Row to Sheet',
description:'Adds new row to a sheet.',
props: {
sheet_id: smartsheetCommon.sheet_id(),
cells: smartsheetCommon.cells,
location_type: Property.StaticDropdown({
displayName: 'Add Row to Top or Bottom',
required: true,
defaultValue: 'bottom',
options: {
options: [
{ label: 'Top of sheet', value: 'top' },
{ label: 'Bottom of sheet', value: 'bottom' },
],
},
}),
},
async run(context) {
const { sheet_id, cells, location_type } = context.propsValue;
// Transform dynamic cells data into proper Smartsheet format
const cellsData = cells as Record<string, any>;
const transformedCells: any[] = [];
for (const [key, value] of Object.entries(cellsData)) {
if (value === undefined || value === null || value === '') {
continue; // Skip empty values
}
let columnId: number;
const cellObj: any = {};
if (key.startsWith('column_')) {
// Regular column value
columnId = parseInt(key.replace('column_', ''));
cellObj.columnId = columnId;
cellObj.value = value;
} else {
continue; // Skip unknown keys
}
transformedCells.push(cellObj);
}
if (transformedCells.length === 0) {
throw new Error('At least one cell value must be provided');
}
// Build the row object with location specifiers
const rowObj: any = {
cells: transformedCells,
};
// Add location specifiers based on location_type
switch (location_type) {
case 'top':
rowObj.toTop = true;
break;
case 'bottom':
rowObj.toBottom = true;
break;
}
const rowPayload = [rowObj];
try {
const result = await addRowToSmartsheet(
context.auth.secret_text,
sheet_id as string,
rowPayload,
);
return {
success: true,
row: result,
message: 'Row added successfully',
cells_processed: transformedCells.length,
};
} catch (error: any) {
if (error.response?.status === 400) {
const errorBody = error.response.data;
throw new Error(`Bad Request: ${errorBody.message || 'Invalid row data or parameters'}`);
} else if (error.response?.status === 403) {
throw new Error('Insufficient permissions to add rows to this sheet');
} else if (error.response?.status === 404) {
throw new Error('Sheet not found or you do not have access to it');
} else if (error.response?.status === 429) {
throw new Error('Rate limit exceeded. Please try again later.');
}
throw new Error(`Failed to add row: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,204 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { httpClient, HttpMethod, HttpRequest } from '@activepieces/pieces-common';
import { smartsheetAuth } from '../../index';
import { smartsheetCommon } from '../common';
export const attachFileToRow = createAction({
auth: smartsheetAuth,
name: 'attach_file_to_row',
displayName: 'Attach File to Row',
description: 'Adds a file attachment to a row.',
props: {
sheet_id: smartsheetCommon.sheet_id(),
row_id: smartsheetCommon.row_id,
attachment_type: Property.StaticDropdown({
displayName: 'Attachment Type',
description: 'Type of attachment to add',
required: true,
defaultValue: 'FILE',
options: {
options: [
{ label: 'File Upload', value: 'FILE' },
{ label: 'URL Link', value: 'LINK' },
{ label: 'Box.com', value: 'BOX_COM' },
{ label: 'Dropbox', value: 'DROPBOX' },
{ label: 'Egnyte', value: 'EGNYTE' },
{ label: 'Evernote', value: 'EVERNOTE' },
{ label: 'Google Drive', value: 'GOOGLE_DRIVE' },
{ label: 'OneDrive', value: 'ONEDRIVE' },
],
},
}),
// For file uploads
file: Property.File({
displayName: 'File',
description: 'The file to attach (required for FILE type)',
required: false,
}),
// For URL attachments
url: Property.ShortText({
displayName: 'URL',
description: 'The URL to attach (required for URL-based attachment types)',
required: false,
}),
attachment_name: Property.ShortText({
displayName: 'Attachment Name',
description: 'Name for the attachment (optional, will use file name or URL if not provided)',
required: false,
}),
// Advanced options
attachment_sub_type: Property.StaticDropdown({
displayName: 'Attachment Sub Type',
description: 'Sub type for Google Drive and Egnyte attachments',
required: false,
options: {
options: [
{ label: 'Document', value: 'DOCUMENT' },
{ label: 'Drawing', value: 'DRAWING' },
{ label: 'Folder', value: 'FOLDER' },
{ label: 'PDF', value: 'PDF' },
{ label: 'Presentation', value: 'PRESENTATION' },
{ label: 'Spreadsheet', value: 'SPREADSHEET' },
],
},
}),
mime_type: Property.ShortText({
displayName: 'MIME Type',
description: 'MIME type of the attachment (optional, auto-detected for files)',
required: false,
}),
},
async run(context) {
const {
sheet_id,
row_id,
attachment_type,
file,
url,
attachment_name,
attachment_sub_type,
mime_type,
} = context.propsValue;
// Validate input based on attachment type
if (attachment_type === 'FILE') {
if (!file) {
throw new Error('File is required when attachment type is FILE');
}
} else {
if (!url) {
throw new Error('URL is required for URL-based attachment types');
}
// Validate URL format for specific types
if (attachment_type === 'BOX_COM' && !url.includes('box.com')) {
throw new Error('Box.com URLs should contain "box.com" in the domain');
}
if (attachment_type === 'DROPBOX' && !url.includes('dropbox.com')) {
throw new Error('Dropbox URLs should contain "dropbox.com" in the domain');
}
if (attachment_type === 'GOOGLE_DRIVE' && !url.includes('drive.google.com')) {
throw new Error('Google Drive URLs should contain "drive.google.com" in the domain');
}
if (attachment_type === 'ONEDRIVE' && !url.includes('onedrive')) {
throw new Error('OneDrive URLs should contain "onedrive" in the domain');
}
}
const apiUrl = `${smartsheetCommon.baseUrl}/sheets/${sheet_id}/rows/${row_id}/attachments`;
try {
let request: HttpRequest;
if (attachment_type === 'FILE') {
// File upload using multipart/form-data
const formData = new FormData();
// Determine MIME type
const fileMimeType = mime_type || (file?.extension ? `application/${file.extension}` : 'application/octet-stream');
const fileName = attachment_name || file?.filename || 'attachment';
// Create blob with proper MIME type
const blob = new Blob([file!.data as unknown as ArrayBuffer], { type: fileMimeType });
formData.append('file', blob, fileName);
request = {
method: HttpMethod.POST,
url: apiUrl,
headers: {
'Authorization': `Bearer ${context.auth}`,
// Don't set Content-Type for FormData, let the browser set it with boundary
},
body: formData,
};
} else {
// URL attachment using JSON
const attachmentData: any = {
attachmentType: attachment_type,
url: url,
};
if (attachment_name) {
attachmentData.name = attachment_name;
}
if (attachment_sub_type) {
attachmentData.attachmentSubType = attachment_sub_type;
}
if (mime_type) {
attachmentData.mimeType = mime_type;
}
request = {
method: HttpMethod.POST,
url: apiUrl,
headers: {
'Authorization': `Bearer ${context.auth}`,
'Content-Type': 'application/json',
},
body: attachmentData,
};
}
const response = await httpClient.sendRequest(request);
return {
success: true,
attachment: response.body.result,
message: 'Attachment added successfully',
attachment_id: response.body.result?.id,
attachment_type: response.body.result?.attachmentType,
attachment_name: response.body.result?.name,
size_kb: response.body.result?.sizeInKb,
created_at: response.body.result?.createdAt,
created_by: response.body.result?.createdBy,
version: response.body.version,
};
} catch (error: any) {
if (error.response?.status === 400) {
const errorBody = error.response.data;
throw new Error(`Bad Request: ${errorBody.message || 'Invalid attachment data or parameters'}`);
} else if (error.response?.status === 403) {
throw new Error('Insufficient permissions to add attachments to this sheet');
} else if (error.response?.status === 404) {
throw new Error('Sheet or row not found or you do not have access to it');
} else if (error.response?.status === 413) {
throw new Error('File size too large. Check Smartsheet file size limits for your plan.');
} else if (error.response?.status === 415) {
throw new Error('Unsupported media type. Check file format restrictions.');
} else if (error.response?.status === 429) {
throw new Error('Rate limit exceeded. Please try again later.');
}
throw new Error(`Failed to attach file: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,259 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { httpClient, HttpMethod, HttpRequest } from '@activepieces/pieces-common';
import { smartsheetAuth } from '../../index';
import { smartsheetCommon } from '../common';
export const findAttachmentByRowId = createAction({
auth: smartsheetAuth,
name: 'find_attachment_by_row_id',
displayName: 'List Row Attachments',
description: 'Get all attachments for a specific row in a Smartsheet, including row and discussion-level attachments with comprehensive pagination and filtering options',
props: {
sheet_id: smartsheetCommon.sheet_id(),
row_id: smartsheetCommon.row_id,
// Pagination options
include_all: Property.Checkbox({
displayName: 'Include All Results',
description: 'If true, include all results without pagination (overrides page and page size)',
required: false,
defaultValue: false,
}),
page: Property.Number({
displayName: 'Page Number',
description: 'Which page to return (defaults to 1, ignored if "Include All Results" is true)',
required: false,
defaultValue: 1,
}),
page_size: Property.Number({
displayName: 'Page Size',
description: 'Maximum number of items to return per page (defaults to 100, max 10000, ignored if "Include All Results" is true)',
required: false,
defaultValue: 100,
}),
// Filtering options
attachment_type_filter: Property.StaticMultiSelectDropdown({
displayName: 'Filter by Attachment Type',
description: 'Only return attachments of specific types (leave empty for all types)',
required: false,
options: {
options: [
{ label: 'Files', value: 'FILE' },
{ label: 'URLs/Links', value: 'LINK' },
{ label: 'Box.com', value: 'BOX_COM' },
{ label: 'Dropbox', value: 'DROPBOX' },
{ label: 'Egnyte', value: 'EGNYTE' },
{ label: 'Evernote', value: 'EVERNOTE' },
{ label: 'Google Drive', value: 'GOOGLE_DRIVE' },
{ label: 'OneDrive', value: 'ONEDRIVE' },
{ label: 'Trello', value: 'TRELLO' },
],
},
}),
parent_type_filter: Property.StaticMultiSelectDropdown({
displayName: 'Filter by Parent Type',
description: 'Only return attachments from specific parent types (leave empty for all)',
required: false,
options: {
options: [
{ label: 'Row Attachments', value: 'ROW' },
{ label: 'Comment Attachments', value: 'COMMENT' },
{ label: 'Sheet Attachments', value: 'SHEET' },
{ label: 'Proof Attachments', value: 'PROOF' },
],
},
}),
min_file_size_kb: Property.Number({
displayName: 'Minimum File Size (KB)',
description: 'Only return files with size greater than or equal to this value (applies to FILE type only)',
required: false,
}),
max_file_size_kb: Property.Number({
displayName: 'Maximum File Size (KB)',
description: 'Only return files with size less than or equal to this value (applies to FILE type only)',
required: false,
}),
},
async run(context) {
const {
sheet_id,
row_id,
include_all,
page,
page_size,
attachment_type_filter,
parent_type_filter,
min_file_size_kb,
max_file_size_kb,
} = context.propsValue;
// Build query parameters
const queryParams: any = {};
if (include_all) {
queryParams.includeAll = true;
} else {
if (page && page > 1) {
queryParams.page = page;
}
if (page_size && page_size !== 100) {
queryParams.pageSize = Math.min(page_size, 10000); // Cap at API limit
}
}
const apiUrl = `${smartsheetCommon.baseUrl}/sheets/${sheet_id}/rows/${row_id}/attachments`;
try {
const request: HttpRequest = {
method: HttpMethod.GET,
url: apiUrl,
headers: {
'Authorization': `Bearer ${context.auth}`,
'Content-Type': 'application/json',
},
queryParams,
};
const response = await httpClient.sendRequest(request);
const attachmentData = response.body;
// Apply client-side filters
let filteredAttachments = attachmentData.data || [];
// Filter by attachment type
if (attachment_type_filter && attachment_type_filter.length > 0) {
filteredAttachments = filteredAttachments.filter((attachment: any) =>
attachment_type_filter.includes(attachment.attachmentType)
);
}
// Filter by parent type
if (parent_type_filter && parent_type_filter.length > 0) {
filteredAttachments = filteredAttachments.filter((attachment: any) =>
parent_type_filter.includes(attachment.parentType)
);
}
// Filter by file size (only applies to FILE type)
if (min_file_size_kb !== undefined || max_file_size_kb !== undefined) {
filteredAttachments = filteredAttachments.filter((attachment: any) => {
if (attachment.attachmentType !== 'FILE' || !attachment.sizeInKb) {
return true;
}
const size = attachment.sizeInKb;
if (min_file_size_kb !== undefined && size < min_file_size_kb) {
return false;
}
if (max_file_size_kb !== undefined && size > max_file_size_kb) {
return false;
}
return true;
});
}
// Organize attachments by type for better analysis
const attachmentsByType: any = {};
const attachmentsByParent: any = {};
let totalFileSize = 0;
filteredAttachments.forEach((attachment: any) => {
// Group by attachment type
if (!attachmentsByType[attachment.attachmentType]) {
attachmentsByType[attachment.attachmentType] = [];
}
attachmentsByType[attachment.attachmentType].push(attachment);
// Group by parent type
if (!attachmentsByParent[attachment.parentType]) {
attachmentsByParent[attachment.parentType] = [];
}
attachmentsByParent[attachment.parentType].push(attachment);
// Calculate total file size for files
if (attachment.attachmentType === 'FILE' && attachment.sizeInKb) {
totalFileSize += attachment.sizeInKb;
}
});
return {
success: true,
// Pagination info
pagination: {
page_number: attachmentData.pageNumber,
page_size: attachmentData.pageSize,
total_pages: attachmentData.totalPages,
total_count: attachmentData.totalCount,
filtered_count: filteredAttachments.length,
},
// Main results
attachments: filteredAttachments,
// Organized results
attachments_by_type: attachmentsByType,
attachments_by_parent: attachmentsByParent,
// Summary statistics
summary: {
total_attachments: filteredAttachments.length,
files_count: (attachmentsByType.FILE || []).length,
links_count: (attachmentsByType.LINK || []).length,
cloud_storage_count: filteredAttachments.length -
(attachmentsByType.FILE || []).length -
(attachmentsByType.LINK || []).length,
row_attachments: (attachmentsByParent.ROW || []).length,
comment_attachments: (attachmentsByParent.COMMENT || []).length,
total_file_size_kb: totalFileSize,
total_file_size_mb: Math.round(totalFileSize / 1024 * 100) / 100,
},
// Download info for files
download_info: filteredAttachments
.filter((att: any) => att.attachmentType === 'FILE' && att.url)
.map((att: any) => ({
attachment_id: att.id,
name: att.name,
download_url: att.url,
url_expires_in_millis: att.urlExpiresInMillis,
url_expires_at: att.urlExpiresInMillis ?
new Date(Date.now() + att.urlExpiresInMillis).toISOString() : null,
size_kb: att.sizeInKb,
})),
// Applied filters info
filters_applied: {
attachment_types: attachment_type_filter || [],
parent_types: parent_type_filter || [],
min_file_size_kb: min_file_size_kb,
max_file_size_kb: max_file_size_kb,
},
// Row and sheet info
row_id: row_id,
sheet_id: sheet_id,
};
} catch (error: any) {
if (error.response?.status === 400) {
const errorBody = error.response.data;
throw new Error(`Bad Request: ${errorBody.message || 'Invalid request parameters'}`);
} else if (error.response?.status === 403) {
throw new Error('Insufficient permissions to access attachments for this row');
} else if (error.response?.status === 404) {
throw new Error('Sheet or row not found, or you do not have access to it');
} else if (error.response?.status === 429) {
throw new Error('Rate limit exceeded. Please try again later.');
}
throw new Error(`Failed to retrieve attachments: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,213 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { httpClient, HttpMethod, HttpRequest } from '@activepieces/pieces-common';
import { smartsheetAuth } from '../../index';
import { smartsheetCommon } from '../common';
export const findRowsByQuery = createAction({
auth: smartsheetAuth,
name: 'find_rows_by_query',
displayName: 'Find Row',
description: 'Finds rows in a specific sheet or across all accessible sheets using text queries with advanced filtering options.',
props: {
search_scope: Property.StaticDropdown({
displayName: 'Search Scope',
description: 'Choose whether to search within a specific sheet or across all accessible sheets.',
required: true,
defaultValue: 'specific_sheet',
options: {
options: [
{ label: 'Specific Sheet', value: 'specific_sheet' },
{ label: 'All Accessible Sheets', value: 'all_sheets' },
],
},
}),
sheet_id: smartsheetCommon.sheet_id(false),
query: Property.ShortText({
displayName: 'Search Query',
description: 'Text to search for. Use double quotes for exact phrase matching (e.g., "project status")',
required: true,
}),
// Advanced search options
search_scopes: Property.StaticMultiSelectDropdown({
displayName: 'Search Scopes',
description: 'Specify what types of content to search in (leave empty to search all)',
required: false,
options: {
options: [
{ label: 'Cell Data', value: 'cellData' },
{ label: 'Comments', value: 'comments' },
{ label: 'Attachments', value: 'attachments' },
{ label: 'Sheet Names', value: 'sheetNames' },
{ label: 'Folder Names', value: 'folderNames' },
{ label: 'Report Names', value: 'reportNames' },
{ label: 'Dashboard Names', value: 'sightNames' },
{ label: 'Template Names', value: 'templateNames' },
{ label: 'Workspace Names', value: 'workspaceNames' },
{ label: 'Summary Fields', value: 'summaryFields' },
],
},
}),
include_favorites: Property.Checkbox({
displayName: 'Include Favorite Flags',
description: 'Include information about which items are marked as favorites',
required: false,
defaultValue: false,
}),
modified_since: Property.DateTime({
displayName: 'Modified Since',
description: 'Only return results modified on or after this date/time',
required: false,
}),
max_results: Property.Number({
displayName: 'Max Results',
description: 'Maximum number of results to return (default: 50, max: 100)',
required: false,
defaultValue: 50,
}),
object_types_filter: Property.StaticMultiSelectDropdown({
displayName: 'Filter by Object Types',
description: 'Only return results of specific object types (leave empty for all types)',
required: false,
options: {
options: [
{ label: 'Rows', value: 'row' },
{ label: 'Sheets', value: 'sheet' },
{ label: 'Attachments', value: 'attachment' },
{ label: 'Comments/Discussions', value: 'discussion' },
{ label: 'Dashboards', value: 'dashboard' },
{ label: 'Reports', value: 'report' },
{ label: 'Folders', value: 'folder' },
{ label: 'Templates', value: 'template' },
{ label: 'Workspaces', value: 'workspace' },
{ label: 'Summary Fields', value: 'summaryField' },
],
},
}),
},
async run(context) {
const {
search_scope,
sheet_id,
query,
search_scopes,
include_favorites,
modified_since,
max_results,
object_types_filter,
} = context.propsValue;
// Validate sheet_id requirement for specific sheet search
if (search_scope === 'specific_sheet' && !sheet_id) {
throw new Error('Sheet ID is required when searching within a specific sheet');
}
// Build query parameters
const queryParams: any = {
query: query,
};
// Add search scopes if specified
if (search_scopes && search_scopes.length > 0) {
queryParams.scopes = search_scopes;
}
// Add include favorites flag
if (include_favorites) {
queryParams.include = 'favoriteFlag';
}
// Add modified since filter
if (modified_since) {
queryParams.modifiedSince = new Date(modified_since as string).toISOString();
}
// Determine API endpoint
let apiUrl: string;
if (search_scope === 'specific_sheet') {
apiUrl = `${smartsheetCommon.baseUrl}/search/sheets/${sheet_id}`;
} else {
apiUrl = `${smartsheetCommon.baseUrl}/search`;
}
try {
const request: HttpRequest = {
method: HttpMethod.GET,
url: apiUrl,
headers: {
'Authorization': `Bearer ${context.auth}`,
'Content-Type': 'application/json',
},
queryParams,
};
const response = await httpClient.sendRequest(request);
const searchResults = response.body;
// Filter by object types if specified
let filteredResults = searchResults.results || [];
if (object_types_filter && object_types_filter.length > 0) {
filteredResults = filteredResults.filter((result: any) =>
object_types_filter.includes(result.objectType)
);
}
// Limit results if specified
const maxResults = Math.min(max_results || 50, 100);
if (filteredResults.length > maxResults) {
filteredResults = filteredResults.slice(0, maxResults);
}
// Organize results by type for better usability
const resultsByType: any = {};
filteredResults.forEach((result: any) => {
if (!resultsByType[result.objectType]) {
resultsByType[result.objectType] = [];
}
resultsByType[result.objectType].push(result);
});
return {
success: true,
total_count: searchResults.totalCount,
returned_count: filteredResults.length,
search_query: query,
search_scope: search_scope,
results: filteredResults,
results_by_type: resultsByType,
sheet_searched: search_scope === 'specific_sheet' ? sheet_id : 'all_accessible_sheets',
// Summary statistics
summary: {
rows_found: (resultsByType.row || []).length,
sheets_found: (resultsByType.sheet || []).length,
attachments_found: (resultsByType.attachment || []).length,
discussions_found: (resultsByType.discussion || []).length,
other_objects_found: filteredResults.length -
(resultsByType.row || []).length -
(resultsByType.sheet || []).length -
(resultsByType.attachment || []).length -
(resultsByType.discussion || []).length,
},
};
} catch (error: any) {
if (error.response?.status === 400) {
const errorBody = error.response.data;
throw new Error(`Bad Request: ${errorBody.message || 'Invalid request parameters'}`);
} else if (error.response?.status === 403) {
throw new Error('Insufficient permissions to access sheets listing');
} else if (error.response?.status === 429) {
throw new Error('Rate limit exceeded. Please try again later.');
}
throw new Error(`Failed to retrieve sheets: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,395 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { httpClient, HttpMethod, HttpRequest } from '@activepieces/pieces-common';
import { smartsheetAuth } from '../../index';
import { smartsheetCommon } from '../common';
export const findSheetByName = createAction({
auth: smartsheetAuth,
name: 'find_sheet_by_name',
displayName: 'Find Sheet(s)',
description: 'Fetches existings sheets matching provided filter criteria.',
props: {
// Search options
sheet_name: Property.ShortText({
displayName: 'Sheet Name Filter',
description: 'Filter sheets by name (partial or exact match). Leave empty to list all sheets.',
required: false,
}),
exact_match: Property.Checkbox({
displayName: 'Exact Name Match',
description: 'When filtering by name, require exact match instead of partial match',
required: false,
defaultValue: false,
}),
// Pagination options
include_all: Property.Checkbox({
displayName: 'Include All Results',
description: 'If true, include all results without pagination (overrides page and page size)',
required: false,
defaultValue: false,
}),
page: Property.Number({
displayName: 'Page Number',
description: 'Which page to return (defaults to 1, ignored if "Include All Results" is true)',
required: false,
defaultValue: 1,
}),
page_size: Property.Number({
displayName: 'Page Size',
description: 'Maximum number of items to return per page (defaults to 100, max 10000, ignored if "Include All Results" is true)',
required: false,
defaultValue: 100,
}),
// Access and filtering options
access_api_level: Property.StaticDropdown({
displayName: 'Access API Level',
description: 'API access level for viewing and filtering permissions',
required: false,
defaultValue: '0',
options: {
options: [
{ label: 'Viewer (default)', value: '0' },
{ label: 'Commenter', value: '1' },
],
},
}),
access_level_filter: Property.StaticMultiSelectDropdown({
displayName: 'Filter by Access Level',
description: 'Only return sheets where you have specific access levels (leave empty for all)',
required: false,
options: {
options: [
{ label: 'Owner', value: 'OWNER' },
{ label: 'Admin', value: 'ADMIN' },
{ label: 'Editor (with sharing)', value: 'EDITOR_SHARE' },
{ label: 'Editor', value: 'EDITOR' },
{ label: 'Commenter', value: 'COMMENTER' },
{ label: 'Viewer', value: 'VIEWER' },
],
},
}),
modified_since: Property.DateTime({
displayName: 'Modified Since',
description: 'Only return sheets modified on or after this date/time',
required: false,
}),
// Additional data options
include_sheet_version: Property.Checkbox({
displayName: 'Include Sheet Version',
description: 'Include current version number of each sheet',
required: false,
defaultValue: false,
}),
include_source_info: Property.Checkbox({
displayName: 'Include Source Information',
description: 'Include information about the source (template/sheet) each sheet was created from',
required: false,
defaultValue: false,
}),
numeric_dates: Property.Checkbox({
displayName: 'Numeric Dates',
description: 'Return dates as milliseconds since UNIX epoch instead of ISO strings',
required: false,
defaultValue: false,
}),
// Advanced filtering
created_date_range: Property.StaticDropdown({
displayName: 'Created Date Range',
description: 'Filter sheets by creation date range',
required: false,
options: {
options: [
{ label: 'All time', value: 'all' },
{ label: 'Last 7 days', value: 'week' },
{ label: 'Last 30 days', value: 'month' },
{ label: 'Last 90 days', value: 'quarter' },
{ label: 'Last 365 days', value: 'year' },
],
},
}),
sort_by: Property.StaticDropdown({
displayName: 'Sort Results By',
description: 'How to sort the returned sheets',
required: false,
defaultValue: 'name',
options: {
options: [
{ label: 'Sheet Name', value: 'name' },
{ label: 'Creation Date (newest first)', value: 'created_desc' },
{ label: 'Creation Date (oldest first)', value: 'created_asc' },
{ label: 'Modified Date (newest first)', value: 'modified_desc' },
{ label: 'Modified Date (oldest first)', value: 'modified_asc' },
{ label: 'Access Level', value: 'access' },
],
},
}),
},
async run(context) {
const {
sheet_name,
exact_match,
include_all,
page,
page_size,
access_api_level,
access_level_filter,
modified_since,
include_sheet_version,
include_source_info,
numeric_dates,
created_date_range,
sort_by,
} = context.propsValue;
// Build query parameters
const queryParams: any = {};
// Pagination
if (include_all) {
queryParams.includeAll = true;
} else {
if (page && page > 1) {
queryParams.page = page;
}
if (page_size && page_size !== 100) {
queryParams.pageSize = Math.min(page_size, 10000); // Cap at API limit
}
}
// Access level
if (access_api_level && access_api_level !== '0') {
queryParams.accessApiLevel = parseInt(access_api_level as string);
}
// Modified since filter
if (modified_since) {
queryParams.modifiedSince = new Date(modified_since as string).toISOString();
}
// Include options
const includeOptions: string[] = [];
if (include_sheet_version) {
includeOptions.push('sheetVersion');
}
if (include_source_info) {
includeOptions.push('source');
}
if (includeOptions.length > 0) {
queryParams.include = includeOptions.join(',');
}
// Numeric dates
if (numeric_dates) {
queryParams.numericDates = true;
}
const apiUrl = `${smartsheetCommon.baseUrl}/sheets`;
try {
const request: HttpRequest = {
method: HttpMethod.GET,
url: apiUrl,
headers: {
'Authorization': `Bearer ${context.auth}`,
'Content-Type': 'application/json',
},
queryParams,
};
const response = await httpClient.sendRequest(request);
const sheetData = response.body;
// Apply client-side filters
let filteredSheets = sheetData.data || [];
// Filter by sheet name if specified
if (sheet_name) {
const searchName = (sheet_name as string).toLowerCase();
filteredSheets = filteredSheets.filter((sheet: any) => {
const sheetName = sheet.name.toLowerCase();
return exact_match ?
sheetName === searchName :
sheetName.includes(searchName);
});
}
// Filter by access level
if (access_level_filter && access_level_filter.length > 0) {
filteredSheets = filteredSheets.filter((sheet: any) =>
access_level_filter.includes(sheet.accessLevel)
);
}
// Filter by creation date range
if (created_date_range && created_date_range !== 'all') {
const now = new Date();
const cutoffDate = new Date();
switch (created_date_range) {
case 'week': {
cutoffDate.setDate(now.getDate() - 7);
break;
}
case 'month': {
cutoffDate.setDate(now.getDate() - 30);
break;
}
case 'quarter': {
cutoffDate.setDate(now.getDate() - 90);
break;
}
case 'year': {
cutoffDate.setDate(now.getDate() - 365);
break;
}
}
filteredSheets = filteredSheets.filter((sheet: any) => {
const createdDate = new Date(sheet.createdAt);
return createdDate >= cutoffDate;
});
}
// Sort results
if (sort_by) {
filteredSheets.sort((a: any, b: any) => {
switch (sort_by) {
case 'name':
return a.name.localeCompare(b.name);
case 'created_desc':
return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();
case 'created_asc':
return new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime();
case 'modified_desc':
return new Date(b.modifiedAt).getTime() - new Date(a.modifiedAt).getTime();
case 'modified_asc':
return new Date(a.modifiedAt).getTime() - new Date(b.modifiedAt).getTime();
case 'access': {
const accessOrder = ['OWNER', 'ADMIN', 'EDITOR_SHARE', 'EDITOR', 'COMMENTER', 'VIEWER'];
return accessOrder.indexOf(a.accessLevel) - accessOrder.indexOf(b.accessLevel);
}
default:
return 0;
}
});
}
// Organize sheets by access level for analysis
const sheetsByAccess: any = {};
const sheetsBySource: any = {};
filteredSheets.forEach((sheet: any) => {
// Group by access level
if (!sheetsByAccess[sheet.accessLevel]) {
sheetsByAccess[sheet.accessLevel] = [];
}
sheetsByAccess[sheet.accessLevel].push(sheet);
// Group by source type (if source info is included)
if (sheet.source) {
const sourceType = sheet.source.type || 'unknown';
if (!sheetsBySource[sourceType]) {
sheetsBySource[sourceType] = [];
}
sheetsBySource[sourceType].push(sheet);
}
});
// Calculate date-based statistics
const now = new Date();
const recentlyModified = filteredSheets.filter((sheet: any) => {
const modifiedDate = new Date(sheet.modifiedAt);
const daysDiff = (now.getTime() - modifiedDate.getTime()) / (1000 * 3600 * 24);
return daysDiff <= 7;
}).length;
const recentlyCreated = filteredSheets.filter((sheet: any) => {
const createdDate = new Date(sheet.createdAt);
const daysDiff = (now.getTime() - createdDate.getTime()) / (1000 * 3600 * 24);
return daysDiff <= 7;
}).length;
return {
success: true,
// Pagination info
pagination: {
page_number: sheetData.pageNumber,
page_size: sheetData.pageSize,
total_pages: sheetData.totalPages,
total_count: sheetData.totalCount,
filtered_count: filteredSheets.length,
},
// Main results
sheets: filteredSheets,
// Organized results
sheets_by_access_level: sheetsByAccess,
sheets_by_source_type: sheetsBySource,
// Summary statistics
summary: {
total_sheets: filteredSheets.length,
owned_sheets: (sheetsByAccess.OWNER || []).length,
admin_sheets: (sheetsByAccess.ADMIN || []).length,
editor_sheets: ((sheetsByAccess.EDITOR || []).length + (sheetsByAccess.EDITOR_SHARE || []).length),
commenter_sheets: (sheetsByAccess.COMMENTER || []).length,
viewer_sheets: (sheetsByAccess.VIEWER || []).length,
recently_modified: recentlyModified,
recently_created: recentlyCreated,
sheets_with_source: Object.values(sheetsBySource).flat().length,
},
// Access level breakdown
access_breakdown: Object.keys(sheetsByAccess).map(level => ({
access_level: level,
count: sheetsByAccess[level].length,
percentage: Math.round((sheetsByAccess[level].length / filteredSheets.length) * 100),
})),
// Applied filters info
filters_applied: {
name_filter: sheet_name || null,
exact_match: exact_match,
access_levels: access_level_filter || [],
modified_since: modified_since || null,
created_date_range: created_date_range || 'all',
sort_by: sort_by || 'name',
},
// API options used
api_options: {
access_api_level: access_api_level,
include_sheet_version: include_sheet_version,
include_source_info: include_source_info,
numeric_dates: numeric_dates,
},
};
} catch (error: any) {
if (error.response?.status === 400) {
const errorBody = error.response.data;
throw new Error(`Bad Request: ${errorBody.message || 'Invalid request parameters'}`);
} else if (error.response?.status === 403) {
throw new Error('Insufficient permissions to access sheets listing');
} else if (error.response?.status === 429) {
throw new Error('Rate limit exceeded. Please try again later.');
}
throw new Error(`Failed to retrieve sheets: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,78 @@
import { createAction, Property } from '@activepieces/pieces-framework';
import { smartsheetAuth } from '../../index';
import { smartsheetCommon, updateRowInSmartsheet } from '../common';
export const updateRow = createAction({
auth: smartsheetAuth,
name: 'update_row',
displayName: 'Update Row',
description: 'Updates an existing row.',
props: {
sheet_id: smartsheetCommon.sheet_id(),
row_id: smartsheetCommon.row_id,
cells: smartsheetCommon.cells,
},
async run(context) {
const { sheet_id, row_id, cells } = context.propsValue;
const rowObj: any = {
id: row_id,
};
// Transform dynamic cells data into proper Smartsheet format
const cellsData = cells as Record<string, any>;
const transformedCells: any[] = [];
for (const [key, value] of Object.entries(cellsData)) {
if (value === undefined || value === null || value === '') {
continue; // Skip empty values
}
let columnId: number;
const cellObj: any = {};
if (key.startsWith('column_')) {
// Regular column value
columnId = parseInt(key.replace('column_', ''));
cellObj.columnId = columnId;
cellObj.value = value;
} else {
continue; // Skip unknown keys
}
transformedCells.push(cellObj);
}
// Only add cells array if we have cells to update
if (transformedCells.length > 0) {
rowObj.cells = transformedCells;
}
try {
const result = await updateRowInSmartsheet(context.auth.secret_text, sheet_id as string, [
[rowObj],
]);
return {
success: true,
row: result,
message: 'Row updated successfully',
cells_processed: transformedCells.length,
};
} catch (error: any) {
if (error.response?.status === 400) {
const errorBody = error.response.data;
throw new Error(`Bad Request: ${errorBody.message || 'Invalid row data or parameters'}`);
} else if (error.response?.status === 403) {
throw new Error('Insufficient permissions to update rows in this sheet');
} else if (error.response?.status === 404) {
throw new Error('Sheet not found or you do not have access to it');
} else if (error.response?.status === 429) {
throw new Error('Rate limit exceeded. Please try again later.');
}
throw new Error(`Failed to update row: ${error.message}`);
}
},
});

View File

@@ -0,0 +1,900 @@
import { DynamicPropsValue, Property } from '@activepieces/pieces-framework';
import { httpClient, HttpRequest, HttpMethod } from '@activepieces/pieces-common';
import crypto from 'crypto';
import { smartsheetAuth } from '../..';
export const smartsheetCommon = {
baseUrl: 'https://api.smartsheet.com/2.0',
sheet_id:(required=true)=> Property.Dropdown({
auth: smartsheetAuth,
displayName: 'Sheet',
description: 'Select a sheet',
required,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please connect your account first.',
options: [],
};
}
try {
const sheets = await listSheets(auth.secret_text);
if (sheets.length === 0) {
return {
disabled: true,
placeholder: 'No sheets found in your account.',
options: [],
};
}
return {
options: sheets.map((sheet: SmartsheetSheet) => ({
value: sheet.id.toString(),
label: sheet.name,
})),
};
} catch (error) {
return {
disabled: true,
placeholder: 'Failed to load sheets - check your connection.',
options: [],
};
}
},
}),
column_id: Property.Dropdown({
auth: smartsheetAuth,
displayName: 'Column',
description: 'Select a column',
required: true,
refreshers: ['sheet_id'],
options: async ({ auth, sheet_id }) => {
if (!auth) {
return {
disabled: true,
placeholder: '⚠️ Please authenticate with Smartsheet first',
options: [],
};
}
if (!sheet_id) {
return {
disabled: true,
placeholder: '📋 Please select a sheet first',
options: [],
};
}
try {
const columns = await getSheetColumns(
auth.secret_text
,
sheet_id as unknown as string,
);
if (columns.length === 0) {
return {
disabled: true,
placeholder: '📄 No columns found in this sheet',
options: [],
};
}
return {
options: columns.map((column: SmartsheetColumn) => ({
value: column.id.toString(),
label: column.title,
})),
};
} catch (error) {
return {
disabled: true,
placeholder: '❌ Failed to load columns - check your permissions',
options: [],
};
}
},
}),
// Dynamic cell properties based on column types
cells: Property.DynamicProperties({
auth: smartsheetAuth,
displayName: 'Cells',
description: 'Cell data with properties based on column types',
required: true,
refreshers: ['sheet_id'],
props: async ({ auth, sheet_id }) => {
if (!auth || !sheet_id) return {};
const fields: DynamicPropsValue = {};
try {
const columns = await getSheetColumns(
auth.secret_text
,
sheet_id as unknown as string,
);
if (columns.length === 0) {
return {};
}
for (const column of columns) {
const baseProps = {
displayName: column.title,
required: false,
};
// Create cell properties based on column type
switch (column.type?.toLowerCase()) {
case 'TEXT_NUMBER':
fields[`column_${column.id}`] = Property.ShortText({
...baseProps,
});
break;
case 'DATE':
fields[`column_${column.id}`] = Property.DateTime({
...baseProps,
description: `Date/time value for ${column.title}`,
});
break;
case 'CHECKBOX':
fields[`column_${column.id}`] = Property.Checkbox({
...baseProps,
});
break;
case 'PICKLIST':
case 'MULTI_PICKLIST': {
if (column.options && column.options.length > 0) {
const dropdownOptions = column.options.map((option) => ({
label: option,
value: option,
}));
if (column.type?.toLowerCase() === 'multi_picklist') {
fields[`column_${column.id}`] = Property.StaticMultiSelectDropdown({
...baseProps,
description: `Multiple selection for ${column.title}`,
options: {
options: dropdownOptions,
},
});
} else {
fields[`column_${column.id}`] = Property.StaticDropdown({
...baseProps,
description: `Select option for ${column.title}`,
options: {
options: dropdownOptions,
},
});
}
} else {
fields[`column_${column.id}`] = Property.ShortText({
...baseProps,
description: `Value for ${column.title}`,
});
}
break;
}
case 'CONTACT_LIST':
case 'MULTI_CONTACT_LIST':
fields[`column_${column.id}`] = Property.ShortText({
...baseProps,
description: `Contact email(s) for ${column.title}. For multiple contacts, separate with commas.`,
});
break;
case 'DURATION':
fields[`column_${column.id}`] = Property.ShortText({
...baseProps,
description: `For example, 4d 6h 30m`,
});
break;
case 'PREDECESSOR':
fields[`column_${column.id}`] = Property.ShortText({
...baseProps,
description: `Predecessor row numbers for ${column.title}. Format: "1FS+2d,3SS" etc.`,
});
break;
case 'ABSTRACT_DATETIME':
fields[`column_${column.id}`] = Property.DateTime({
...baseProps,
description: `Date/time value for ${column.title}`,
});
break;
default:
fields[`column_${column.id}`] = Property.ShortText({
...baseProps,
description: `Value for ${column.title} (${column.type || 'unknown type'})`,
});
break;
}
}
return fields;
} catch (error) {
console.error('Failed to fetch columns for dynamic properties:', error);
return {};
}
},
}),
// Dynamic row selector
row_id: Property.Dropdown({
auth: smartsheetAuth,
displayName: 'Row',
required: true,
refreshers: ['sheet_id'],
options: async ({ auth, sheet_id }) => {
if (!auth) {
return {
disabled: true,
placeholder: 'Please connect your account first.',
options: [],
};
}
if (!sheet_id) {
return {
disabled: true,
placeholder: 'Please select a sheet first',
options: [],
};
}
try {
const sheet = await getSheet(auth.secret_text
, sheet_id as unknown as string);
const rows = sheet.rows || [];
if (rows.length === 0) {
return {
disabled: true,
placeholder: 'No rows found in this sheet',
options: [],
};
}
return {
disabled:false,
options: rows.slice(0, 100).map((row: any) => {
// Get the primary column value for display
const primaryCell = row.cells?.find((cell: any) =>
sheet.columns?.find((col: any) => col.id === cell.columnId && col.primary),
);
const displayValue =
primaryCell?.displayValue || primaryCell?.value || `Row ${row.rowNumber}`;
return {
value: row.id.toString(),
label: `${displayValue} (Row ${row.rowNumber})`,
};
}),
};
} catch (error) {
return {
disabled: true,
placeholder: 'Failed to load rows - check your permissions',
options: [],
};
}
},
}),
// Dynamic sheet selector for hyperlinks
hyperlink_sheet_id: Property.Dropdown({
auth: smartsheetAuth,
displayName: 'Target Sheet',
description: 'Select a sheet to link to',
required: false,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: '⚠️ Please authenticate with Smartsheet first',
options: [],
};
}
try {
const sheets = await listSheets(auth.secret_text
);
if (sheets.length === 0) {
return {
disabled: true,
placeholder: '📂 No sheets found in your account',
options: [],
};
}
return {
options: sheets.map((sheet: SmartsheetSheet) => ({
value: sheet.id.toString(),
label: sheet.name,
})),
};
} catch (error) {
return {
disabled: true,
placeholder: '❌ Failed to load sheets - check your permissions',
options: [],
};
}
},
}),
// Dynamic report selector for hyperlinks
hyperlink_report_id: Property.Dropdown({
auth: smartsheetAuth,
displayName: 'Target Report',
description: 'Select a report to link to',
required: false,
refreshers: [],
options: async ({ auth }) => {
if (!auth) {
return {
disabled: true,
placeholder: '⚠️ Please authenticate with Smartsheet first',
options: [],
};
}
try {
const reports = await listReports(auth.secret_text
);
if (reports.length === 0) {
return {
disabled: true,
placeholder: '📊 No reports found in your account',
options: [],
};
}
return {
options: reports.map((report: SmartsheetReport) => ({
value: report.id.toString(),
label: `${report.name}${report.isSummaryReport ? ' (Summary)' : ' (Row Report)'}`,
})),
};
} catch (error) {
return {
disabled: true,
placeholder: '❌ Failed to load reports - check your permissions',
options: [],
};
}
},
}),
// Dynamic column selector for search/filter operations
search_columns: Property.MultiSelectDropdown({
auth: smartsheetAuth,
displayName: 'Search Columns',
description: 'Select specific columns to search within (leave empty to search all columns)',
required: false,
refreshers: ['sheet_id'],
options: async ({ auth, sheet_id }) => {
if (!auth) {
return {
disabled: true,
placeholder: '⚠️ Please authenticate with Smartsheet first',
options: [],
};
}
if (!sheet_id) {
return {
disabled: true,
placeholder: '📋 Please select a sheet first',
options: [],
};
}
try {
const columns = await getSheetColumns(
auth.secret_text,
sheet_id as unknown as string,
);
const searchableColumns = columns.filter(
(column) => column.type?.toLowerCase() !== 'auto_number',
);
if (searchableColumns.length === 0) {
return {
disabled: true,
placeholder: '📄 No searchable columns found in this sheet',
options: [],
};
}
return {
options: searchableColumns.map((column: SmartsheetColumn) => ({
value: column.id.toString(),
label: `${column.title} (${column.type || 'unknown'})`,
})),
};
} catch (error) {
return {
disabled: true,
placeholder: '❌ Failed to load columns - check your permissions',
options: [],
};
}
},
}),
};
// Interfaces
export interface SmartsheetSheet {
id: number;
name: string;
accessLevel: string;
permalink: string;
createdAt: string;
modifiedAt: string;
}
export interface SmartsheetColumn {
id: number;
index: number;
title: string;
type?: string;
primary?: boolean;
options?: string[];
validation?: boolean;
width?: number;
hidden?: boolean;
locked?: boolean;
lockedForUser?: boolean;
}
export interface SmartsheetRow {
id: number;
rowNumber: number;
siblingId?: number;
expanded?: boolean;
createdAt: string;
modifiedAt: string;
cells: SmartsheetCell[];
}
export interface SmartsheetCell {
columnId: number;
value?: any;
displayValue?: string;
formula?: string;
}
export interface SmartsheetAttachment {
id: number;
name: string;
url: string;
attachmentType: string;
createdAt: string;
createdBy: {
name: string;
email: string;
};
}
export interface SmartsheetComment {
id: number;
text: string;
createdAt: string;
createdBy: {
name: string;
email: string;
};
}
export interface SmartsheetReport {
id: number;
name: string;
accessLevel: 'ADMIN' | 'COMMENTER' | 'EDITOR' | 'EDITOR_SHARE' | 'OWNER' | 'VIEWER';
isSummaryReport: boolean;
ownerId: number;
createdAt: string;
modifiedAt: string;
permalink: string;
owner?: string;
totalRowCount?: number;
version?: number;
}
export interface SmartsheetReportsResponse {
pageNumber: number;
pageSize: number | null;
totalPages: number;
totalCount: number;
data: SmartsheetReport[];
}
// Helper functions
export async function listSheets(accessToken: string): Promise<SmartsheetSheet[]> {
const request: HttpRequest = {
method: HttpMethod.GET,
url: `${smartsheetCommon.baseUrl}/sheets`,
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
};
const response = await httpClient.sendRequest<{ data: SmartsheetSheet[] }>(request);
return response.body.data;
}
export async function getSheet(accessToken: string, sheetId: string): Promise<any> {
const request: HttpRequest = {
method: HttpMethod.GET,
url: `${smartsheetCommon.baseUrl}/sheets/${sheetId}`,
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
};
const response = await httpClient.sendRequest(request);
return response.body;
}
export async function getSheetColumns(
accessToken: string,
sheetId: string,
): Promise<SmartsheetColumn[]> {
const request: HttpRequest = {
method: HttpMethod.GET,
url: `${smartsheetCommon.baseUrl}/sheets/${sheetId}/columns?include=columnType`,
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
};
const response = await httpClient.sendRequest<{ data: SmartsheetColumn[] }>(request);
return response.body.data;
}
export async function addRowToSmartsheet(
accessToken: string,
sheetId: string,
rowData: any,
queryParams: any = {},
): Promise<SmartsheetRow> {
// Build query string from parameters
const queryString = new URLSearchParams();
if (queryParams.allowPartialSuccess) {
queryString.append('allowPartialSuccess', 'true');
}
if (queryParams.overrideValidation) {
queryString.append('overrideValidation', 'true');
}
if (queryParams.accessApiLevel) {
queryString.append('accessApiLevel', queryParams.accessApiLevel.toString());
}
const url = `${smartsheetCommon.baseUrl}/sheets/${sheetId}/rows${
queryString.toString() ? '?' + queryString.toString() : ''
}`;
const request: HttpRequest = {
method: HttpMethod.POST,
url: url,
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
body: rowData,
};
const response = await httpClient.sendRequest<{ result: SmartsheetRow[] }>(request);
return response.body.result[0];
}
export async function updateRowInSmartsheet(
accessToken: string,
sheetId: string,
rowData: any,
queryParams: any = {},
): Promise<SmartsheetRow> {
// Build query string from parameters
const queryString = new URLSearchParams();
if (queryParams.allowPartialSuccess) {
queryString.append('allowPartialSuccess', 'true');
}
if (queryParams.overrideValidation) {
queryString.append('overrideValidation', 'true');
}
if (queryParams.accessApiLevel) {
queryString.append('accessApiLevel', queryParams.accessApiLevel.toString());
}
const url = `${smartsheetCommon.baseUrl}/sheets/${sheetId}/rows${
queryString.toString() ? '?' + queryString.toString() : ''
}`;
const request: HttpRequest = {
method: HttpMethod.PUT,
url: url,
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
body: rowData,
};
const response = await httpClient.sendRequest<{ result: SmartsheetRow[] }>(request);
return response.body.result[0];
}
export async function getRowAttachments(
accessToken: string,
sheetId: string,
rowId: string,
): Promise<SmartsheetAttachment[]> {
const request: HttpRequest = {
method: HttpMethod.GET,
url: `${smartsheetCommon.baseUrl}/sheets/${sheetId}/rows/${rowId}/attachments`,
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
};
const response = await httpClient.sendRequest<{
data: SmartsheetAttachment[];
}>(request);
return response.body.data || [];
}
export async function findSheetsByName(
accessToken: string,
name: string,
): Promise<SmartsheetSheet[]> {
const sheets = await listSheets(accessToken);
return sheets.filter((sheet) => sheet.name.toLowerCase().includes(name.toLowerCase()));
}
export async function listReports(
accessToken: string,
modifiedSince?: string,
): Promise<SmartsheetReport[]> {
// Build query parameters
const queryParams: any = {};
if (modifiedSince) {
queryParams.modifiedSince = modifiedSince;
}
const request: HttpRequest = {
method: HttpMethod.GET,
url: `${smartsheetCommon.baseUrl}/reports`,
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
queryParams: Object.keys(queryParams).length > 0 ? queryParams : undefined,
};
const response = await httpClient.sendRequest<SmartsheetReportsResponse>(request);
return response.body.data || [];
}
// Webhook management functions
export interface SmartsheetWebhook {
id: number;
name: string;
callbackUrl: string;
scope: string;
scopeObjectId: number;
events: string[];
enabled: boolean;
status: string;
sharedSecret: string;
}
export async function subscribeWebhook(
accessToken: string,
webhookUrl: string,
sheetId: string,
webhookName: string,
): Promise<SmartsheetWebhook> {
const request: HttpRequest = {
method: HttpMethod.POST,
url: `${smartsheetCommon.baseUrl}/webhooks`,
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
body: {
name: webhookName,
callbackUrl: webhookUrl,
scope: 'sheet',
scopeObjectId: parseInt(sheetId),
events: ['*.*'],
version: 1,
},
};
const response = await httpClient.sendRequest<{ result: SmartsheetWebhook }>(request);
return response.body.result;
}
export async function enableWebhook(
accessToken: string,
webhookId: string,
): Promise<SmartsheetWebhook> {
const request: HttpRequest = {
method: HttpMethod.PUT,
url: `${smartsheetCommon.baseUrl}/webhooks/${webhookId}`,
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
body: {
enabled: true,
},
};
const response = await httpClient.sendRequest<{ result: SmartsheetWebhook }>(request);
return response.body.result;
}
export async function unsubscribeWebhook(accessToken: string, webhookId: string): Promise<void> {
const request: HttpRequest = {
method: HttpMethod.DELETE,
url: `${smartsheetCommon.baseUrl}/webhooks/${webhookId}`,
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
};
await httpClient.sendRequest(request);
}
export async function listWebhooks(accessToken: string): Promise<SmartsheetWebhook[]> {
const request: HttpRequest = {
method: HttpMethod.GET,
url: `${smartsheetCommon.baseUrl}/webhooks`,
headers: {
Authorization: `Bearer ${accessToken}`,
'Content-Type': 'application/json',
},
};
const response = await httpClient.sendRequest<{ data: SmartsheetWebhook[] }>(request);
return response.body.data || [];
}
export interface WebhookInformation {
webhookId: string;
sharedSecret: string;
webhookName: string;
}
export async function findOrCreateWebhook(
accessToken: string,
webhookUrl: string,
sheetId: string,
triggerIdentifier: string,
): Promise<SmartsheetWebhook> {
const webhookName = `AP-${triggerIdentifier.slice(-8)}-Sheet${sheetId}`;
const existingWebhooks = await listWebhooks(accessToken);
const existingWebhook = existingWebhooks.find(
(wh) => wh.callbackUrl === webhookUrl && wh.scopeObjectId.toString() === sheetId,
);
if (existingWebhook) {
if (existingWebhook.name !== webhookName) {
console.log(
`Found existing webhook ${existingWebhook.id} with different name: ${existingWebhook.name}. Expected: ${webhookName}`,
);
}
if (!existingWebhook.enabled || existingWebhook.status !== 'ENABLED') {
return await enableWebhook(accessToken, existingWebhook.id.toString());
}
return existingWebhook;
}
const newWebhook = await subscribeWebhook(accessToken, webhookUrl, sheetId, webhookName);
return await enableWebhook(accessToken, newWebhook.id.toString());
}
export function verifyWebhookSignature(
webhookSecret?: string,
webhookSignatureHeader?: string,
webhookRawBody?: any,
): boolean {
if (!webhookSecret || !webhookSignatureHeader || !webhookRawBody) {
return false;
}
try {
const hmac = crypto.createHmac('sha256', webhookSecret);
hmac.update(webhookRawBody);
const expectedSignature = hmac.digest('hex');
return crypto.timingSafeEqual(
Buffer.from(webhookSignatureHeader, 'hex'),
Buffer.from(expectedSignature, 'hex'),
);
} catch (error) {
return false;
}
}
export async function getSheetRowDetails(
accessToken: string,
sheetId: string,
rowId: string,
): Promise<SmartsheetRow | null> {
try {
const req: HttpRequest = {
method: HttpMethod.GET,
url: `${smartsheetCommon.baseUrl}/sheets/${sheetId}/rows/${rowId}`,
headers: { Authorization: `Bearer ${accessToken}` },
};
const response = await httpClient.sendRequest<SmartsheetRow>(req);
return response.body;
} catch (e: any) {
if (e.response?.status === 404) {
console.log(`Row ${rowId} on sheet ${sheetId} not found during detail fetch.`);
return null;
}
console.error(`Error fetching row ${rowId} from sheet ${sheetId}:`, e);
throw e;
}
}
export async function getAttachmentFullDetails(accessToken: string, sheetId: string, attachmentId: string): Promise<SmartsheetAttachment | null> {
try {
const req: HttpRequest = {
method: HttpMethod.GET,
url: `${smartsheetCommon.baseUrl}/sheets/${sheetId}/attachments/${attachmentId}`,
headers: { 'Authorization': `Bearer ${accessToken}` }
};
const response = await httpClient.sendRequest<SmartsheetAttachment>(req);
return response.body;
} catch (e: any) {
if (e.response?.status === 404) {
console.log(`Attachment ${attachmentId} on sheet ${sheetId} not found.`);
return null;
}
console.error(`Error fetching attachment ${attachmentId} from sheet ${sheetId}:`, e);
throw e;
}
}
export async function getCommentFullDetails(accessToken: string, sheetId: string, discussionId: string, commentId: string): Promise<SmartsheetComment | null> {
try {
const req: HttpRequest = {
method: HttpMethod.GET,
url: `${smartsheetCommon.baseUrl}/sheets/${sheetId}/comments/${commentId}`,
headers: { 'Authorization': `Bearer ${accessToken}` }
};
const response = await httpClient.sendRequest<SmartsheetComment>(req);
return response.body;
} catch (e: any) {
if (e.response?.status === 404) {
console.log(`Comment ${commentId} in discussion ${discussionId} on sheet ${sheetId} not found.`);
return null;
}
console.error(`Error fetching comment ${commentId} from sheet ${sheetId}:`, e);
throw e;
}
}

View File

@@ -0,0 +1,139 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { smartsheetAuth } from '../../index';
import {
smartsheetCommon,
findOrCreateWebhook,
WebhookInformation,
verifyWebhookSignature,
getAttachmentFullDetails,
} from '../common';
import { WebhookHandshakeStrategy } from '@activepieces/shared';
const TRIGGER_KEY = 'smartsheet_new_attachment_trigger';
export const newAttachmentTrigger = createTrigger({
auth: smartsheetAuth,
name: 'new_attachment_',
displayName: 'New Attachment Added',
description: 'Triggers when a new attachment is added to a row or sheet.',
props: {
sheet_id: smartsheetCommon.sheet_id(),
},
type: TriggerStrategy.WEBHOOK,
sampleData: {
sheetId: '12345',
eventType: 'created',
objectType: 'attachment',
id: 78901, // Attachment ID
parentId: 67890, // e.g., Row ID if attached to a row
parentType: 'ROW',
timestamp: '2023-10-28T12:10:00Z',
userId: 54321,
attachmentData: {
/* ... full attachment data ... */
},
},
handshakeConfiguration: {
strategy: WebhookHandshakeStrategy.BODY_PARAM_PRESENT,
paramName: 'challenge',
},
async onHandshake(context) {
return {
status: 200,
body: {
smartsheetHookResponse: (context.payload.body as any)['challenge'],
},
};
},
async onEnable(context) {
const { sheet_id } = context.propsValue;
if (!sheet_id) throw new Error('Sheet ID is required to enable the webhook.');
const triggerIdentifier = context.webhookUrl.substring(context.webhookUrl.lastIndexOf('/') + 1);
const webhook = await findOrCreateWebhook(
context.auth.secret_text,
context.webhookUrl,
sheet_id as string,
triggerIdentifier,
);
await context.store.put<WebhookInformation>(TRIGGER_KEY, {
webhookId: webhook.id.toString(),
sharedSecret: webhook.sharedSecret,
webhookName: webhook.name,
});
},
async onDisable(context) {
const { sheet_id } = context.propsValue;
if (!sheet_id) throw new Error('Sheet ID is required to enable the webhook.');
const triggerIdentifier = context.webhookUrl.substring(context.webhookUrl.lastIndexOf('/') + 1);
const webhook = await findOrCreateWebhook(
context.auth.secret_text,
context.webhookUrl,
sheet_id as string,
triggerIdentifier,
);
await context.store.put<WebhookInformation>(TRIGGER_KEY, {
webhookId: webhook.id.toString(),
sharedSecret: webhook.sharedSecret,
webhookName: webhook.name,
});
},
async run(context) {
const payload = context.payload.body as any;
const headers = context.payload.headers as Record<string, string | undefined>;
const webhookInfo = await context.store.get<WebhookInformation>(TRIGGER_KEY);
if (!webhookInfo) {
return [];
}
if (headers && headers['smartsheet-hook-challenge']) {
return [];
}
const webhookSecret = webhookInfo?.sharedSecret;
const webhookSignatureHeader = context.payload.headers['smartsheet-hmac-sha256'];
const rawBody = context.payload.rawBody;
if (!verifyWebhookSignature(webhookSecret, webhookSignatureHeader, rawBody)) {
return [];
}
if (payload.newWebhookStatus) {
return [];
}
if (!payload.events || !Array.isArray(payload.events) || payload.events.length === 0) {
return [];
}
const newAttachmentEvents = [];
for (const event of payload.events) {
if (event.objectType === 'attachment' && event.eventType === 'created') {
const eventOutput: any = { ...event, sheetId: payload.scopeObjectId?.toString() };
const objectSheetId = payload.scopeObjectId?.toString();
if (objectSheetId) {
try {
eventOutput.attachmentData = await getAttachmentFullDetails(
context.auth.secret_text,
objectSheetId,
event.id.toString(),
);
} catch (error: any) {
eventOutput.fetchError = error.message;
}
} else {
eventOutput.fetchError = 'scopeObjectId missing';
}
newAttachmentEvents.push(eventOutput);
}
}
return newAttachmentEvents;
},
});

View File

@@ -0,0 +1,138 @@
import { createTrigger, TriggerStrategy, Property } from '@activepieces/pieces-framework';
import { smartsheetAuth } from '../../index';
import {
smartsheetCommon,
unsubscribeWebhook,
WebhookInformation,
findOrCreateWebhook,
verifyWebhookSignature,
getCommentFullDetails,
} from '../common';
import { WebhookHandshakeStrategy } from '@activepieces/shared';
const TRIGGER_KEY = 'smartsheet_new_comment_trigger';
export const newCommentTrigger = createTrigger({
auth: smartsheetAuth,
name: 'new_comment_webhook',
displayName: 'New Comment Added',
description: 'Triggers when a new comment is added to a discussion on a sheet.',
props: {
sheet_id: smartsheetCommon.sheet_id(),
},
type: TriggerStrategy.WEBHOOK,
sampleData: {
sheetId: '12345',
eventType: 'created',
objectType: 'comment',
id: 89012, // Comment ID
discussionId: 45678,
parentId: 67890, // e.g., Row ID comment is on
parentType: 'ROW',
timestamp: '2023-10-28T12:15:00Z',
userId: 54321,
commentData: {
/* ... full comment data ... */
},
},
handshakeConfiguration: {
strategy: WebhookHandshakeStrategy.BODY_PARAM_PRESENT,
paramName: 'challenge',
},
async onHandshake(context) {
return {
status: 200,
body: {
smartsheetHookResponse: (context.payload.body as any)['challenge'],
},
};
},
async onEnable(context) {
const { sheet_id } = context.propsValue;
if (!sheet_id) throw new Error('Sheet ID is required to enable the webhook.');
const triggerIdentifier = context.webhookUrl.substring(context.webhookUrl.lastIndexOf('/') + 1);
const webhook = await findOrCreateWebhook(
context.auth.secret_text,
context.webhookUrl,
sheet_id as string,
triggerIdentifier,
);
await context.store.put<WebhookInformation>(TRIGGER_KEY, {
webhookId: webhook.id.toString(),
sharedSecret: webhook.sharedSecret,
webhookName: webhook.name,
});
},
async onDisable(context) {
const webhookInfo = await context.store.get<WebhookInformation>(TRIGGER_KEY);
if (webhookInfo && webhookInfo.webhookId) {
try {
await unsubscribeWebhook(context.auth.secret_text, webhookInfo.webhookId);
} catch (error: any) {
if (error.response?.status !== 404) {
console.error(`Error unsubscribing webhook ${webhookInfo.webhookId}: ${error.message}`);
}
}
await context.store.delete(TRIGGER_KEY);
}
},
async run(context): Promise<unknown[]> {
const payload = context.payload.body as any;
const headers = context.payload.headers as Record<string, string | undefined>;
const webhookInfo = await context.store.get<WebhookInformation>(TRIGGER_KEY);
if (!webhookInfo) {
return [];
}
if (headers && headers['smartsheet-hook-challenge']) {
return [];
}
const webhookSecret = webhookInfo?.sharedSecret;
const webhookSignatureHeader = context.payload.headers['smartsheet-hmac-sha256'];
const rawBody = context.payload.rawBody;
if (!verifyWebhookSignature(webhookSecret, webhookSignatureHeader, rawBody)) {
return [];
}
if (payload.newWebhookStatus) {
return [];
}
if (!payload.events || !Array.isArray(payload.events) || payload.events.length === 0) {
return [];
}
const newCommentEvents = [];
for (const event of payload.events) {
if (event.objectType === 'comment' && event.eventType === 'created') {
const eventOutput: any = { ...event, sheetId: payload.scopeObjectId?.toString() };
const objectSheetId = payload.scopeObjectId?.toString();
if (objectSheetId) {
try {
eventOutput.commentData = await getCommentFullDetails(
context.auth.secret_text,
objectSheetId,
event.discussionId.toString(),
event.id.toString(),
);
} catch (error: any) {
eventOutput.fetchError = error.message;
}
} else {
eventOutput.fetchError = 'scopeObjectId missing';
}
newCommentEvents.push(eventOutput);
}
}
return newCommentEvents;
},
});

View File

@@ -0,0 +1,145 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { smartsheetAuth } from '../../index';
import {
smartsheetCommon,
unsubscribeWebhook,
getSheetRowDetails,
WebhookInformation,
findOrCreateWebhook,
verifyWebhookSignature,
} from '../common';
import { WebhookHandshakeStrategy } from '@activepieces/shared';
const TRIGGER_KEY = 'smartsheet_new_row_trigger';
export const newRowAddedTrigger = createTrigger({
auth: smartsheetAuth,
name: 'new_row_added',
displayName: 'New Row Added',
description: 'Triggers when a new row is added.',
props: {
sheet_id: smartsheetCommon.sheet_id(),
},
type: TriggerStrategy.WEBHOOK,
sampleData: {
sheetId: '12345',
eventType: 'created',
objectType: 'row',
id: 67890, // Row ID
timestamp: '2023-10-28T12:00:00Z',
userId: 54321,
rowData: {
id: 67890,
sheetId: 12345,
rowNumber: 15,
createdAt: '2023-10-28T12:00:00Z',
modifiedAt: '2023-10-28T12:00:00Z',
cells: [
{ columnId: 111, value: 'New Task A', displayValue: 'New Task A' },
{ columnId: 222, value: 'Pending', displayValue: 'Pending' },
],
},
},
handshakeConfiguration: {
strategy: WebhookHandshakeStrategy.BODY_PARAM_PRESENT,
paramName: 'challenge',
},
async onHandshake(context) {
return {
status: 200,
body: {
smartsheetHookResponse: (context.payload.body as any)['challenge'],
},
};
},
async onEnable(context) {
const { sheet_id } = context.propsValue;
if (!sheet_id) throw new Error('Sheet ID is required to enable the webhook.');
const triggerIdentifier = context.webhookUrl.substring(context.webhookUrl.lastIndexOf('/') + 1);
const webhook = await findOrCreateWebhook(
context.auth.secret_text,
context.webhookUrl,
sheet_id as string,
triggerIdentifier,
);
await context.store.put<WebhookInformation>(TRIGGER_KEY, {
webhookId: webhook.id.toString(),
sharedSecret: webhook.sharedSecret,
webhookName: webhook.name,
});
},
async onDisable(context) {
const webhookInfo = await context.store.get<WebhookInformation>(TRIGGER_KEY);
if (webhookInfo && webhookInfo.webhookId) {
try {
await unsubscribeWebhook(context.auth.secret_text, webhookInfo.webhookId);
} catch (error: any) {
if (error.response?.status !== 404) {
console.error(`Error unsubscribing webhook ${webhookInfo.webhookId}: ${error.message}`);
}
}
await context.store.delete(TRIGGER_KEY);
}
},
async run(context) {
const payload = context.payload.body as any;
const headers = context.payload.headers as Record<string, string | undefined>;
const webhookInfo = await context.store.get<WebhookInformation>(TRIGGER_KEY);
if (!webhookInfo) {
return [];
}
if (headers && headers['smartsheet-hook-challenge']) {
return [];
}
const webhookSecret = webhookInfo?.sharedSecret;
const webhookSignatureHeader = context.payload.headers['smartsheet-hmac-sha256'];
const rawBody = context.payload.rawBody;
if (!verifyWebhookSignature(webhookSecret, webhookSignatureHeader, rawBody)) {
return [];
}
if (payload.newWebhookStatus) {
return [];
}
if (!payload.events || !Array.isArray(payload.events) || payload.events.length === 0) {
return [];
}
const newRowEvents = [];
for (const event of payload.events) {
if (event.objectType === 'row' && event.eventType === 'created') {
const eventOutput: any = { ...event, sheetId: payload.scopeObjectId?.toString() };
const objectSheetId = payload.scopeObjectId?.toString();
if (objectSheetId) {
try {
eventOutput.rowData = await getSheetRowDetails(
context.auth.secret_text,
objectSheetId,
event.id.toString(),
);
} catch (error: any) {
console.warn(
`Failed to fetch full details for new row ID ${event.id}: ${error.message}`,
);
eventOutput.fetchError = error.message;
}
} else {
eventOutput.fetchError = 'scopeObjectId missing, cannot fetch row details.';
}
newRowEvents.push(eventOutput);
}
}
return newRowEvents;
},
});

View File

@@ -0,0 +1,134 @@
import { createTrigger, TriggerStrategy } from '@activepieces/pieces-framework';
import { smartsheetAuth } from '../../index';
import {
smartsheetCommon,
findOrCreateWebhook,
WebhookInformation,
getSheetRowDetails,
verifyWebhookSignature,
unsubscribeWebhook,
} from '../common';
import { WebhookHandshakeStrategy } from '@activepieces/shared';
const TRIGGER_KEY = 'smartsheet_updated_row_trigger';
export const updatedRowTrigger = createTrigger({
auth: smartsheetAuth,
name: 'updated_row',
displayName: 'Row Updated',
description: 'Triggers when an existing row is updated.',
props: {
sheet_id: smartsheetCommon.sheet_id(),
},
type: TriggerStrategy.WEBHOOK,
sampleData: {
sheetId: '12345',
eventType: 'updated',
objectType: 'row',
id: 67890,
columnId: 333,
timestamp: '2023-10-28T12:05:00Z',
userId: 54321,
rowData: {
/* ... full row data ... */
},
},
handshakeConfiguration: {
strategy: WebhookHandshakeStrategy.BODY_PARAM_PRESENT,
paramName: 'challenge',
},
async onHandshake(context) {
return {
status: 200,
body: {
smartsheetHookResponse: (context.payload.body as any)['challenge'],
},
};
},
async onEnable(context) {
const { sheet_id } = context.propsValue;
if (!sheet_id) throw new Error('Sheet ID is required.');
const triggerIdentifier = context.webhookUrl.substring(context.webhookUrl.lastIndexOf('/') + 1);
const webhook = await findOrCreateWebhook(
context.auth.secret_text,
context.webhookUrl,
sheet_id as string,
triggerIdentifier,
);
await context.store.put<WebhookInformation>(TRIGGER_KEY, {
webhookId: webhook.id.toString(),
sharedSecret: webhook.sharedSecret,
webhookName: webhook.name,
});
},
async onDisable(context) {
const webhookInfo = await context.store.get<WebhookInformation>(TRIGGER_KEY);
if (webhookInfo && webhookInfo.webhookId) {
try {
await unsubscribeWebhook(context.auth.secret_text, webhookInfo.webhookId);
} catch (error: any) {
if (error.response?.status !== 404) {
console.error(`Error unsubscribing webhook ${webhookInfo.webhookId}: ${error.message}`);
}
}
await context.store.delete(TRIGGER_KEY);
}
},
async run(context): Promise<unknown[]> {
const payload = context.payload.body as any;
const headers = context.payload.headers as Record<string, string | undefined>;
const webhookInfo = await context.store.get<WebhookInformation>(TRIGGER_KEY);
if (!webhookInfo) {
return [];
}
if (headers && headers['smartsheet-hook-challenge']) {
return [];
}
const webhookSecret = webhookInfo?.sharedSecret;
const webhookSignatureHeader = context.payload.headers['smartsheet-hmac-sha256'];
const rawBody = context.payload.rawBody;
if (!verifyWebhookSignature(webhookSecret, webhookSignatureHeader, rawBody)) {
return [];
}
if (payload.newWebhookStatus) {
return [];
}
if (!payload.events || !Array.isArray(payload.events) || payload.events.length === 0) {
return [];
}
const updatedRowEvents = [];
for (const event of payload.events) {
if (event.objectType === 'row' && event.eventType === 'updated') {
const eventOutput: any = { ...event, sheetId: payload.scopeObjectId?.toString() };
const objectSheetId = payload.scopeObjectId?.toString();
if (objectSheetId) {
try {
eventOutput.rowData = await getSheetRowDetails(
context.auth.secret_text,
objectSheetId,
event.id.toString(),
);
} catch (error: any) {
eventOutput.fetchError = error.message;
}
} else {
eventOutput.fetchError = 'scopeObjectId missing';
}
updatedRowEvents.push(eventOutput);
}
}
return updatedRowEvents;
},
});

View File

@@ -0,0 +1,19 @@
{
"extends": "../../../../tsconfig.base.json",
"compilerOptions": {
"module": "commonjs",
"forceConsistentCasingInFileNames": true,
"strict": true,
"noImplicitOverride": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"noPropertyAccessFromIndexSignature": 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"]
}