Skip to content

Conversation

michelle0927
Copy link
Collaborator

@michelle0927 michelle0927 commented Aug 21, 2025

Resolves #18053

Summary by CodeRabbit

  • New Features

    • New Google Slides table actions: create table, insert/delete rows & columns, and insert text into table cells.
    • Replace All Text action to update presentation text with optional slide filtering and case sensitivity.
    • Table picker: select specific tables on a slide from a list.
  • Chores

    • Multiple Google Slides actions and component version bumps (package updated to 0.3.0).

Copy link

vercel bot commented Aug 21, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
Project Deployment Preview Comments Updated (UTC)
pipedream-docs Ignored Ignored Aug 21, 2025 8:01pm
pipedream-docs-redirect-do-not-edit Ignored Ignored Aug 21, 2025 8:01pm

Copy link
Contributor

coderabbitai bot commented Aug 21, 2025

Walkthrough

Adds multiple Google Slides table-related actions and a Replace All Text action, implements tableId prop and new app methods that wrap batchUpdate, and bumps several action versions plus the component package version. No other functional changes.

Changes

Cohort / File(s) Summary
New Table Actions
components/google_slides/actions/create-table/create-table.mjs, .../insert-table-rows/insert-table-rows.mjs, .../insert-table-columns/insert-table-columns.mjs, .../delete-table-row/delete-table-row.mjs, .../delete-table-column/delete-table-column.mjs, .../insert-text-into-table/insert-text-into-table.mjs
Add actions to create tables, insert/delete rows and columns, and insert text into table cells. Each action wires presentation/slide/table props, calls corresponding new app methods, exports a $summary, and returns API response data.
Replace All Text Action
components/google_slides/actions/replace-all-text/replace-all-text.mjs
Adds action to run ReplaceAllTextRequest via new app method, supports optional slide filtering and case matching; exports $summary and returns API response data.
App Enhancements
components/google_slides/google_slides.app.mjs
Adds tableId propDefinition (lists tables on a slide) and new methods: replaceAllText, createTable, insertTableRows, insertTableColumns, deleteTableRow, deleteTableColumn — each wraps a single Slides API request in batchUpdate.
Version Bumps (metadata only)
components/google_slides/actions/create-image/create-image.mjs, .../create-page-element/create-page-element.mjs, .../create-presentation/create-presentation.mjs, .../create-slide/create-slide.mjs, .../delete-page-element/delete-page-element.mjs, .../delete-slide/delete-slide.mjs, .../find-presentation/find-presentation.mjs, .../insert-text/insert-text.mjs, .../merge-data/merge-data.mjs, .../refresh-chart/refresh-chart.mjs
Increment version fields only; no logic or prop changes.
Package Metadata
components/google_slides/package.json
Bumps package version from 0.2.0 to 0.3.0.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor U as User
  participant A as Action (e.g., Create Table)
  participant G as google_slides.app
  participant S as Google Slides API

  U->>A: Provide props (presentationId, slideId, tableId, ...)
  A->>G: call method (e.g., createTable(presentationId, data))
  G->>S: batchUpdate({ requests: [CreateTableRequest / Insert/Delete ...] })
  S-->>G: response
  G-->>A: response.data
  A-->>U: $summary + data
Loading
sequenceDiagram
  autonumber
  actor U as User
  participant A as Replace All Text Action
  participant G as google_slides.app
  participant S as Google Slides API

  U->>A: text, replaceText, slideIds?, matchCase?
  A->>G: replaceAllText(presentationId, payload)
  G->>S: batchUpdate({ requests: [ReplaceAllTextRequest] })
  S-->>G: response
  G-->>A: response.data
  A-->>U: $summary + data
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Assessment against linked issues

Objective Addressed Explanation
Table operations: Create Table, Insert Rows, Insert Columns, Delete Row, Delete Column (#18053)
Text operations: Insert Text, Replace All Text (#18053)

Poem

I hop through slides with whiskered grace,
New tables born, then rows fall into place.
Columns insert, some vanish in a blink,
Text swapped neat — quicker than you'd think.
I thump, I cheer: "BatchUpdate — off we go!" 🥕

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch issue-18053

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@michelle0927 michelle0927 marked this pull request as ready for review August 21, 2025 19:41
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
components/google_slides/actions/create-slide/create-slide.mjs (1)

35-47: Creating slide with empty slideLayoutReference can 400 if layoutId not provided

layoutId is optional in the app propDefinition, but the request always includes slideLayoutReference with possibly no layoutId. Some APIs reject an empty slideLayoutReference object. Build the payload conditionally.

Apply this diff:

   async run({ $ }) {
     try {
-      const response = await this.googleSlides.createSlide(this.presentationId, {
-        insertionIndex: this.insertionIndex,
-        slideLayoutReference: {
-          layoutId: this.layoutId,
-        },
-      });
+      const payload = {
+        ...(this.insertionIndex !== undefined && { insertionIndex: this.insertionIndex }),
+      };
+      if (this.layoutId) {
+        payload.slideLayoutReference = { layoutId: this.layoutId };
+      }
+      const response = await this.googleSlides.createSlide(this.presentationId, payload);
       $.export("$summary", `Successfully created slide with ID: ${response.data.replies[0].createSlide.objectId}`);
       return response.data;
     } catch (error) {
       throw new ConfigurationError(`Failed to create slide: ${error.message}. Make sure you have permission to edit the presentation.`);
     }
   },
🧹 Nitpick comments (17)
components/google_slides/actions/delete-page-element/delete-page-element.mjs (1)

26-35: Prop naming clarity: consider aliasing shapeIdpageElementId

This action deletes any page element, but the propDefinition references shapeId. Consider adding a pageElementId propDefinition alias in the app (backed by the same list) to reduce confusion for users selecting images, tables, etc., not just shapes.

components/google_slides/actions/create-image/create-image.mjs (1)

94-95: Guard against missing replies in API response summary

If the Slides API ever returns an empty replies array (or a non-standard reply), the summary dereference can throw. Consider a defensive check.

Apply this diff:

-    $.export("$summary", `Successfully created image with ID: ${response.data.replies[0].createImage.objectId}`);
-    return response.data;
+    const createReply = response.data?.replies?.[0]?.createImage;
+    $.export("$summary",
+      createReply?.objectId
+        ? `Successfully created image with ID: ${createReply.objectId}`
+        : "Successfully created image."
+    );
+    return response.data;
components/google_slides/actions/merge-data/merge-data.mjs (1)

96-104: Avoid empty batchUpdate when no merge inputs provided

If both placeholdersAndTexts and placeholdersAndImageUrls are empty, requests will be empty. You can short-circuit to skip the API call and still provide a useful summary.

Apply this diff:

-    const { data: response } = await batchUpdate({
-      presentationId: presentation.id,
-      resource: {
-        requests: [
-          ...getTextRequests(placeholdersAndTexts),
-          ...getImageRequests(placeholdersAndImageUrls),
-        ],
-      },
-    });
+    const requests = [
+      ...getTextRequests(placeholdersAndTexts),
+      ...getImageRequests(placeholdersAndImageUrls),
+    ];
+
+    if (!requests.length) {
+      $.export("$summary", `Copied presentation with ID: ${presentation.id} (no merge requests provided)`);
+      return { presentationId: presentation.id, replies: [] };
+    }
+
+    const { data: response } = await batchUpdate({
+      presentationId: presentation.id,
+      resource: { requests },
+    });
components/google_slides/actions/insert-text/insert-text.mjs (1)

49-56: Avoid sending undefined insertionIndex; small hardening

If insertionIndex isn’t set, we currently pass it as undefined. While JSON.stringify drops undefined, being explicit avoids surprises and keeps the payload minimal.

Apply this diff to only include insertionIndex when it’s provided:

-    const response = await this.googleSlides.insertText(this.presentationId, {
-      objectId: this.shapeId,
-      text: this.text,
-      insertionIndex: this.insertionIndex,
-    });
+    const payload = {
+      objectId: this.shapeId,
+      text: this.text,
+    };
+    if (this.insertionIndex !== undefined) {
+      payload.insertionIndex = this.insertionIndex;
+    }
+    const response = await this.googleSlides.insertText(this.presentationId, payload);
components/google_slides/actions/refresh-chart/refresh-chart.mjs (1)

31-39: Minor readability: use flatMap and for...of is fine, but you can go fully declarative

Not required, but this trims a couple lines.

-    const elements = presentation.slides.map((slide) => slide.pageElements).flat();
-    const chartIds = elements.filter((element) => {
-      return element.sheetsChart && element.sheetsChart.spreadsheetId;
-    }).map((element) => element.objectId);
-    const promises = [];
-    for (let chartId of chartIds) {
-      promises.push(this.app.refreshChart(this.presentationId, chartId));
-    }
-    await Promise.all(promises);
+    const chartIds = presentation.slides
+      .flatMap((slide) => slide.pageElements || [])
+      .filter((el) => el?.sheetsChart?.spreadsheetId)
+      .map((el) => el.objectId);
+    await Promise.all(
+      chartIds.map((chartId) => this.app.refreshChart(this.presentationId, chartId)),
+    );
components/google_slides/google_slides.app.mjs (1)

65-79: Table picker UX: include objectId in label and guard against missing pageElements

Improves disambiguation when multiple tables have the same size and avoids a potential undefined access.

-      async options({
-        presentationId, slideId,
-      }) {
-        const { pageElements } = await this.getSlide(presentationId, slideId);
-        let tables = pageElements.filter((element) => element?.table);
-        return tables.map((element) => ({
-          label: `${element.table.rows} x ${element.table.columns} Table`,
-          value: element.objectId,
-        }));
-      },
+      async options({ presentationId, slideId }) {
+        const { pageElements = [] } = await this.getSlide(presentationId, slideId);
+        const tables = pageElements.filter((el) => el?.table);
+        return tables.map((el) => ({
+          label: `${el.table.rows} x ${el.table.columns} Table (${el.objectId})`,
+          value: el.objectId,
+        }));
+      },
components/google_slides/actions/replace-all-text/replace-all-text.mjs (2)

17-26: Clarify the intent of the “Text” prop.

To reduce ambiguity in the UI, consider renaming “Text” → “Find Text”.

Apply this diff:

-    text: {
-      type: "string",
-      label: "Text",
-      description: "The text to replace",
-    },
+    text: {
+      type: "string",
+      label: "Find Text",
+      description: "The text to search for and replace",
+    },

47-58: Return a more informative summary and normalize optional fields.

Improve UX by:

  • Defaulting matchCase to false (avoid sending undefined),
  • Omitting pageObjectIds when no slideIds selected,
  • Emitting the number of replacements from the batchUpdate reply if available.

Apply this diff:

   async run({ $ }) {
-    const response = await this.googleSlides.replaceAllText(this.presentationId, {
-      replaceText: this.replaceText,
-      pageObjectIds: this.slideIds,
-      containsText: {
-        text: this.text,
-        matchCase: this.matchCase,
-      },
-    });
-    $.export("$summary", "Successfully replaced text in the presentation");
-    return response.data;
+    const response = await this.googleSlides.replaceAllText(this.presentationId, {
+      replaceText: this.replaceText,
+      pageObjectIds: Array.isArray(this.slideIds) && this.slideIds.length ? this.slideIds : undefined,
+      containsText: {
+        text: this.text,
+        matchCase: !!this.matchCase,
+      },
+    });
+    const replies = response?.data?.replies || [];
+    const count = replies.find?.((r) => r?.replaceAllText)?.replaceAllText?.occurrencesChanged;
+    const scope = Array.isArray(this.slideIds) && this.slideIds.length ? ` across ${this.slideIds.length} slide(s)` : "";
+    $.export("$summary",
+      typeof count === "number"
+        ? `Replaced ${count} occurrence${count === 1 ? "" : "s"}${scope}`
+        : "Successfully replaced text in the presentation",
+    );
+    return response.data;
   },
components/google_slides/actions/insert-text-into-table/insert-text-into-table.mjs (1)

53-58: Optional: clarify insertionIndex semantics.

Consider documenting that omitting insertionIndex appends to the end of the cell’s text; setting 0 inserts at the start.

Apply this diff:

     insertionIndex: {
       type: "integer",
       label: "Insertion Index",
-      description: "The index where the text will be inserted",
+      description: "The 0-based index where the text will be inserted. Omit to append at end; set to 0 to insert at start.",
       optional: true,
     },
components/google_slides/actions/delete-table-row/delete-table-row.mjs (2)

4-6: Align name/key with singular operation or add multi-delete support.

This action currently deletes a single row, but the key/name are plural. Either:

  • rename to singular (recommended to match Issue #18053), or
  • add a number prop to delete multiple rows.

Option A (singular naming) — apply this diff:

-  key: "google_slides-delete-table-rows",
-  name: "Delete Table Rows",
+  key: "google_slides-delete-table-row",
+  name: "Delete Table Row",

36-40: Support deleting multiple contiguous rows (if plural naming retained).

If you keep the plural surface, expose the number field supported by DeleteTableRowsRequest.

Apply this diff:

     rowIndex: {
       type: "integer",
       label: "Row Index",
-      description: "The index of the row to delete",
+      description: "The 0-based index of the first row to delete",
     },
+    number: {
+      type: "integer",
+      label: "Number of Rows",
+      description: "How many consecutive rows to delete starting at `rowIndex`",
+      optional: true,
+      default: 1,
+    },
   },
   async run({ $ }) {
     const response = await this.googleSlides.deleteTableRow(this.presentationId, {
       tableObjectId: this.tableId,
       cellLocation: {
         rowIndex: this.rowIndex,
       },
+      number: this.number ?? 1,
     });
-    $.export("$summary", "Successfully deleted table row");
+    $.export("$summary", `Successfully deleted ${this.number ?? 1} row(s) starting at index ${this.rowIndex}`);
     return response.data;
   },

Also applies to: 42-50

components/google_slides/actions/delete-table-column/delete-table-column.mjs (2)

36-40: Constrain columnIndex to non-negative values.

Input validation at the prop level prevents easy-to-make mistakes and avoids 4xxs from the API.

     columnIndex: {
       type: "integer",
       label: "Column Index",
-      description: "The index of the column to delete",
+      description: "The index of the column to delete",
+      min: 0,
     },

49-49: Make the summary more informative.

Including the index helps when scanning run logs.

-    $.export("$summary", "Successfully deleted table column");
+    $.export("$summary", `Successfully deleted table column at index ${this.columnIndex}`);
components/google_slides/actions/insert-table-rows/insert-table-rows.mjs (1)

65-65: Pluralize the summary based on count.

Improves run logs clarity.

-    $.export("$summary", "Successfully inserted table row");
+    const count = this.number ?? 1;
+    $.export("$summary", `Successfully inserted ${count} table ${count === 1 ? "row" : "rows"}`);
components/google_slides/actions/create-table/create-table.mjs (2)

36-45: Validate height/width are positive.

Adds basic guardrails and clearer error messages before making the API call.

   height: {
     type: "integer",
     label: "Height",
     description: "The height of the shape in points (1/72 of an inch)",
+    min: 1,
   },
   width: {
     type: "integer",
     label: "Width",
     description: "The width of the shape in points (1/72 of an inch)",
+    min: 1,
   },

85-85: Enrich the success summary with table size.

Useful when scanning many runs.

-    $.export("$summary", "Successfully created table in the slide");
+    $.export("$summary", `Successfully created a ${this.rows}×${this.columns} table in the slide`);
components/google_slides/actions/insert-table-columns/insert-table-columns.mjs (1)

65-65: Pluralize the success summary.

Improves clarity in logs.

-    $.export("$summary", "Successfully inserted table column");
+    const count = this.number ?? 1;
+    $.export("$summary", `Successfully inserted ${count} table ${count === 1 ? "column" : "columns"}`);
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 8427b38 and a2f4449.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (19)
  • components/google_slides/actions/create-image/create-image.mjs (1 hunks)
  • components/google_slides/actions/create-page-element/create-page-element.mjs (1 hunks)
  • components/google_slides/actions/create-presentation/create-presentation.mjs (1 hunks)
  • components/google_slides/actions/create-slide/create-slide.mjs (1 hunks)
  • components/google_slides/actions/create-table/create-table.mjs (1 hunks)
  • components/google_slides/actions/delete-page-element/delete-page-element.mjs (1 hunks)
  • components/google_slides/actions/delete-slide/delete-slide.mjs (1 hunks)
  • components/google_slides/actions/delete-table-column/delete-table-column.mjs (1 hunks)
  • components/google_slides/actions/delete-table-row/delete-table-row.mjs (1 hunks)
  • components/google_slides/actions/find-presentation/find-presentation.mjs (1 hunks)
  • components/google_slides/actions/insert-table-columns/insert-table-columns.mjs (1 hunks)
  • components/google_slides/actions/insert-table-rows/insert-table-rows.mjs (1 hunks)
  • components/google_slides/actions/insert-text-into-table/insert-text-into-table.mjs (1 hunks)
  • components/google_slides/actions/insert-text/insert-text.mjs (1 hunks)
  • components/google_slides/actions/merge-data/merge-data.mjs (1 hunks)
  • components/google_slides/actions/refresh-chart/refresh-chart.mjs (1 hunks)
  • components/google_slides/actions/replace-all-text/replace-all-text.mjs (1 hunks)
  • components/google_slides/google_slides.app.mjs (2 hunks)
  • components/google_slides/package.json (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (4)
components/google_slides/actions/replace-all-text/replace-all-text.mjs (3)
components/google_slides/actions/delete-table-column/delete-table-column.mjs (1)
  • response (43-48)
components/google_slides/actions/insert-table-rows/insert-table-rows.mjs (1)
  • response (57-64)
components/google_slides/actions/insert-text-into-table/insert-text-into-table.mjs (1)
  • response (61-69)
components/google_slides/actions/insert-text-into-table/insert-text-into-table.mjs (3)
components/google_slides/actions/delete-table-column/delete-table-column.mjs (1)
  • response (43-48)
components/google_slides/actions/insert-table-rows/insert-table-rows.mjs (1)
  • response (57-64)
components/google_slides/actions/replace-all-text/replace-all-text.mjs (1)
  • response (48-55)
components/google_slides/actions/insert-table-rows/insert-table-rows.mjs (2)
components/google_slides/actions/delete-table-column/delete-table-column.mjs (1)
  • response (43-48)
components/google_slides/actions/insert-text-into-table/insert-text-into-table.mjs (1)
  • response (61-69)
components/google_slides/actions/delete-table-column/delete-table-column.mjs (2)
components/google_slides/actions/insert-table-rows/insert-table-rows.mjs (1)
  • response (57-64)
components/google_slides/actions/insert-text-into-table/insert-text-into-table.mjs (1)
  • response (61-69)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Verify TypeScript components
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Lint Code Base
🔇 Additional comments (14)
components/google_slides/actions/find-presentation/find-presentation.mjs (1)

7-7: Version bump only — LGTM

The metadata change to version "0.0.5" is consistent with the broader package bump. No functional concerns here.

components/google_slides/actions/delete-page-element/delete-page-element.mjs (1)

7-7: Version bump only — LGTM

The action version update to "0.0.2" looks good. No behavioral changes introduced.

components/google_slides/package.json (1)

3-3: Package version bump — LGTM

Bumping the package to 0.3.0 aligns with the addition of new actions and app methods. No further package metadata issues spotted.

components/google_slides/actions/create-image/create-image.mjs (1)

7-7: Version bump only — LGTM

The metadata update to "0.0.2" is fine. No logic changes detected.

components/google_slides/actions/merge-data/merge-data.mjs (1)

7-7: Version bump only — LGTM

The action version update to "0.0.4" looks good.

components/google_slides/actions/insert-text/insert-text.mjs (1)

7-7: Version bump only — OK to ship

No behavior change; safe metadata update.

components/google_slides/actions/create-slide/create-slide.mjs (1)

8-8: Version bump only — OK to ship

No functional change in this file besides the version.

components/google_slides/actions/refresh-chart/refresh-chart.mjs (1)

7-7: Version bump only — OK to ship

No runtime change; action behavior remains identical.

components/google_slides/actions/create-page-element/create-page-element.mjs (1)

8-8: Version bump only — OK to ship

No behavior change in this action.

components/google_slides/google_slides.app.mjs (1)

142-201: Please verify action implementations against the new batchUpdate wrappers

I wasn’t able to find any calls in components/google_slides/actions that use the new wrapper parameters. To avoid runtime errors, double-check that:

  • The replace–all–text action invokes
    googleSlides.replaceAllText(presentationId, { containsText, replaceText, … })
    so both containsText and replaceText are passed.
  • All table operations call the correct wrappers with tableObjectId (instead of tableId):
    • googleSlides.insertTableRows(presentationId, { tableObjectId, … })
    • googleSlides.insertTableColumns(presentationId, { tableObjectId, … })
    • googleSlides.deleteTableRow(presentationId, { tableObjectId, … })
    • googleSlides.deleteTableColumn(presentationId, { tableObjectId, … })
  • The tableId propDefinition in each action is wired up with both presentationId and slideId, for example:
    propDefinition: [
      googleSlides,
      "tableId",
      (c) => ({ presentationId: c.presentationId, slideId: c.slideId }),
    ],

Please update the action implementations accordingly or confirm that these mappings already exist and are correctly spelled out.

components/google_slides/actions/create-presentation/create-presentation.mjs (1)

7-7: Version bump looks good.

No functional changes in this file; metadata update is consistent with the broader package bump.

components/google_slides/actions/delete-slide/delete-slide.mjs (1)

7-7: Version bump acknowledged.

No behavioral changes introduced here; safe to ship.

components/google_slides/actions/replace-all-text/replace-all-text.mjs (1)

27-39: Verify multi-select behavior for slideIds

We couldn’t find any other instances in the repo where a propDefinition based on slideId is used with type: "string[]". This action is the sole precedent:

  • File: components/google_slides/actions/replace-all-text/replace-all-text.mjs
    • Lines 27–39 define
      slideIds: {
        propDefinition: [
          googleSlides,
          "slideId",
          (c) => ({ presentationId: c.presentationId }),
        ],
        type: "string[]",
        label: "Slide IDs",
        description: "Limits the matches to page elements only on the given pages",
        optional: true,
      },

Because there’s no prior example to confirm that overriding a single-select propDefinition to an array type renders a working multi-select UI and emits an array, please manually verify in the Pipedream UI/engine that:

  • The field renders as a multi-select dropdown populated with slide IDs.
  • Selected values are passed through as an array (string[]) to the action runtime.
components/google_slides/actions/delete-table-column/delete-table-column.mjs (1)

42-48: deleteTableColumn wrapper verified

I’ve confirmed that:

  • The deleteTableColumn method is implemented in components/google_slides/google_slides.app.mjs (around lines 192–197), and calls batchUpdate(presentationId, requests) with each request shaped as:
    {
      deleteTableColumn: {
        ...data,
      },
    }
  • The action’s props include tableId via a propDefinition in delete-table-column.mjs, ensuring the required tableObjectId is passed through correctly.

No changes are required here.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
components/google_slides/actions/delete-table-column/delete-table-column.mjs (3)

6-6: Nit: use an article in the description.

Small copy improvement for readability.

Apply this diff:

-  description: "Delete column from a table. [See the documentation](https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/request#DeleteTableColumnRequest)",
+  description: "Delete a column from a table. [See the documentation](https://developers.google.com/workspace/slides/api/reference/rest/v1/presentations/request#DeleteTableColumnRequest)",

36-40: Clarify 0-based index and validate lower bound.

Column indices are 0-based per the Slides samples; adding min: 0 guards obvious input errors and the description can state this explicitly. (developers.google.com)

Apply this diff:

     columnIndex: {
       type: "integer",
       label: "Column Index",
-      description: "The index of the column to delete",
+      description: "The 0-based index of the column to delete",
+      min: 0,
     },

49-49: Make the $summary more informative for run logs.

Including the IDs and index helps users auditing runs.

Apply this diff:

-    $.export("$summary", "Successfully deleted table column");
+    $.export("$summary", `Deleted column ${this.columnIndex} from table ${this.tableId} in presentation ${this.presentationId}`);
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between a2f4449 and f6d5d61.

📒 Files selected for processing (5)
  • components/google_slides/actions/delete-table-column/delete-table-column.mjs (1 hunks)
  • components/google_slides/actions/delete-table-row/delete-table-row.mjs (1 hunks)
  • components/google_slides/actions/insert-table-columns/insert-table-columns.mjs (1 hunks)
  • components/google_slides/actions/insert-table-rows/insert-table-rows.mjs (1 hunks)
  • components/google_slides/actions/insert-text-into-table/insert-text-into-table.mjs (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
  • components/google_slides/actions/insert-text-into-table/insert-text-into-table.mjs
  • components/google_slides/actions/insert-table-rows/insert-table-rows.mjs
  • components/google_slides/actions/insert-table-columns/insert-table-columns.mjs
  • components/google_slides/actions/delete-table-row/delete-table-row.mjs
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Publish TypeScript components
  • GitHub Check: Lint Code Base
  • GitHub Check: Verify TypeScript components
🔇 Additional comments (3)
components/google_slides/actions/delete-table-column/delete-table-column.mjs (3)

4-6: Consistent singular naming — good alignment with folder/method and docs anchor.

Key/name now match the singular action and the docs anchor points to DeleteTableColumnRequest. Looks clean.


42-51: Request shape matches Slides API.

Passing tableObjectId with cellLocation: { columnIndex } is exactly what DeleteTableColumnRequest expects; rowIndex is not required for column deletion. Looks correct. (developers.google.com)


42-51: Verified: deleteTableColumn wrapper is correctly wired to batchUpdate.

  • In components/google_slides/google_slides.app.mjs (lines 192–198), there’s a deleteTableColumn(presentationId, data) method that builds
    const requests = [{ deleteTableColumn: { ...data } }];
    return this.batchUpdate(presentationId, requests);
  • The shared batchUpdate(presentationId, requests) (lines 95–98) in the same file calls
    slides.presentations.batchUpdate({
      presentationId,
      requestBody: { requests },
    });
  • This matches the intended { deleteTableColumn: data } payload shape. No further changes required.

Copy link
Collaborator

@jcortes jcortes left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @michelle0927 lgtm! Ready for QA!

@vunguyenhung vunguyenhung merged commit 8b49d21 into master Aug 22, 2025
10 checks passed
@vunguyenhung vunguyenhung deleted the issue-18053 branch August 22, 2025 03:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[ACTION] Google Slides - add Actions such as Create Table, Insert Row
3 participants