Custom Action là gì và cách tạo Custom Action trong Power Automate Desktop – Phần 1

  1. Home
  2. »
  3. Chưa phân loại
  4. »
  5. Custom Action là gì và cách tạo Custom Action trong Power Automate Desktop – Phần 1

Danh mục bài viết:

Khi làm việc với Power Automate Desktop (PAD), chúng ta thường bị “mắc kẹt” hoặc phải tốn nhiều thời gian tìm các cách xử lý thay thế khi không có native actions hỗ trợ sẵn. Thông thường, vấn đề nằm ở cách bạn thao tác với các biến (variables) có trong flow.

Ví dụ: cách add/remove a column trong một data table đã tồn tại, cách tìm một item trong list khi item đó có thể xuất hiện nhiều lần và trả về index của nó, hoặc cách remove duplicate rows trong một data table…

Cách dễ nhất để xử lý các vấn đề này là sử dụng scripting actions. Tuy nhiên, điều này lại phát sinh thêm vấn đề:

  • Nếu đoạn code đó được dùng ở nhiều nơi và bạn muốn sửa → phải sửa ở tất cả vị trí.
  • Hoặc code của bạn chỉ chạy đúng một kịch bản, nhưng bạn hoàn toàn có thể chỉnh sửa để tái sử dụng cho kịch bản khác.

Bắt đầu từ PAD version 2.34, Microsoft đã hỗ trợ Custom Actions cho desktop flow. Tính năng này giúp tăng khả năng tái sử dụng, rút ngắn flow, và hỗ trợ đồng đồng nghiệp của chúng ta – những người làm low code – dễ dàng dùng lại các action.

Trong phần 1, tôi sẽ hướng dẫn nhanh cách tạo Custom Action.

1. Tải template để làm Custom Actions

Để bắt đầu, bạn có thể mở Package Manager Console và tải template được Microsoft cung cấp bằng câu lệnh:

 

dotnet new install Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.Templates

Sau khi cài template

Ở đây tôi dùng Sample Module Template

2. Tạo Project

Tên Project bắt buộc phải tuân theo quy tắc sau nếu không sẽ bị lỗi “Module cache not found”:

?*.Modules.?*

Modules.?*

Tên Project phải đúng format bắt buộc

Bạn có thể tick chọn Use a .resx for setting metadata for Action và chọn thêm Test Project.

3. Coding

Trong ví dụ này, tôi sẽ tạo một Custom Action để add a column vào một data table đã tồn tại.

Đây là code mẫu:

using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK;

using Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.Attributes;

using System;

using System.Data;

 

namespace Modules.DataTable

{

    [Action(Id = “AddColumnToDataTable”, FriendlyName = “Add column”, Order = 10, Description = “Add new column to data table”)]

    [Throws(“ColumnExisted”, FriendlyName = “Column Existed”)] // TODO: change error name (or delete if not needed)

    public class AddColumn : ActionBase

    {

        #region Properties

 

        [InputArgument(Description = “Data table for add new column”, FriendlyName = “Data table”, Order = 1)]

        public System.Data.DataTable dtDataTable { get; set; }

 

        [InputArgument(Description = “New column to add into data table”, FriendlyName = “New column name”, Order = 2)]

        public string strNewColumnName { get; set; }

 

        [InputArgument(Description = “Default value to add into new column”, FriendlyName = “Default value”, Order = 3, Required = false)]

        public string strDefaultValue { get; set; }

 

 

        [OutputArgument(Order = 1, Description = “New Data table with new column added”)]

        public System.Data.DataTable dtNewDataTable { get; set; }

 

        #endregion

 

        #region Methods Overrides

 

        public override void Execute(ActionContext context)

        {

            try

            {

                //Add new column into Data table with strNewColumnName

                dtDataTable.Columns.Add(strNewColumnName);

                dtNewDataTable = dtDataTable.Copy();

                //If strDefaultValue is not null, set default value for new column

                if (!string.IsNullOrEmpty(strDefaultValue))

                {

                    foreach (DataRow row in dtNewDataTable.Rows)

                    {

                        row[strNewColumnName] = strDefaultValue;

                    }

                }

            }

            catch (Exception e)

            {

                if (e is ActionException) throw;

 

                throw new ActionException(“ColumnExisted”, e.Message, e.InnerException);

            }

 

            // TODO: set values to Output Arguments here

        }

 

        #endregion

    }

}

4. Sign Custom Action

Đầu tiên, bạn phải tạo PowerShell script dùng để sign code file.

Các vị trí tham số cần chỉnh sửa

PowerShell script:
$certPFXFileName=”D:\RPA\Custom Action1\PADCustomActionCert.pfx”;

$certCERFileName=”D:\RPA\Custom Action1\PADCustomActionCert.cer”;

$certStoreLocation=”Cert:\LocalMachine\AuthRoot”;

$certname = “PADCustomActionSelfSignCert”

##Create certificate

$cert = New-SelfSignedCertificate -CertStoreLocation Cert:\CurrentUser\My -Type CodeSigningCert  -Subject “CN=$certname” -KeyExportPolicy Exportable -KeySpec Signature -KeyLength 2048 -KeyAlgorithm RSA -HashAlgorithm SHA256

$mypwd = ConvertTo-SecureString -String “MyCustomActionPassword” -Force -AsPlainText

##Export certificate

$certPFXFile = Export-PfxCertificate -Cert $cert -FilePath $certPFXFileName -Password $mypwd

$certCERFile = Export-Certificate -Cert $cert -FilePath $certCERFileName -Type CERT -Verbose -Force

5. Build và Sign file DLL

Mở Command Prompt trong Visual Studio và thay đổi các parameter sau:

Signtool sign /f “D:\RPA\Custom Action1\PADCustomActionCert.pfx” /p MyCustomActionPassword /fd SHA256 “D:\RPA\Custom Action1\Modules.DataTable\bin\Debug\net472\Modules.DataTable.dll”

Các parameter cần chỉnh sửa theo đường dẫn và password của bạn.

Fix lỗi “Signtool not recognize”:

set PATH=”C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\signtool.exe”;%PATH%

6. Tạo file .CAB

Tạo file .ps1 với nội dung sau để tạo file .CAB:

“param(

 

    [ValidateScript({Test-Path $_ -PathType Container})]

                [string]

                $sourceDir,

 

                [ValidateScript({Test-Path $_ -PathType Container})]

    [string]

    $cabOutputDir,

 

    [string]

    $cabFilename

)

 

$ddf = “”.OPTION EXPLICIT

.Set CabinetName1=$cabFilename

.Set DiskDirectory1=$cabOutputDir

.Set CompressionType=LZX

.Set Cabinet=on

.Set Compress=on

.Set CabinetFileCountThreshold=0

.Set FolderFileCountThreshold=0

.Set FolderSizeThreshold=0

.Set MaxCabinetSize=0

.Set MaxDiskFileCount=0

.Set MaxDiskSize=0

“”

$ddfpath = ($env:TEMP + “”\customModule.ddf””)

$sourceDirLength = $sourceDir.Length;

$ddf += (Get-ChildItem $sourceDir -Filter “”*.dll”” | Where-Object { (!$_.PSIsContainer) -and ($_.Name -ne “”Microsoft.PowerPlatform.PowerAutomate.Desktop.Actions.SDK.dll””) } | Select-Object -ExpandProperty FullName | ForEach-Object { ‘””‘ + $_ + ‘”” “”‘ + ($_.Substring($sourceDirLength)) + ‘””‘ }) -join “”`r`n””

$ddf | Out-File -Encoding UTF8 $ddfpath

makecab.exe /F $ddfpath

Remove-Item $ddfpath”

 

Ở đây tôi lưu file này với tên BuildCAB.ps1.

Sau đó mở PowerShell trong Visual Studio và thay đổi các parameter tương ứng.

 

.\BuildCAB.ps1 “D:\RPA\Custom Action1\Modules.DataTable\bin\Debug\net472” “D:\RPA\Custom Action1\Modules.DataTable\bin\Debug\net472” Modules.DataTable.cab

Các tham số cần chỉnh

7. Sign file .CAB

Mở lại Command Prompt ở bước 5 và thay đổi parameter để sign file .CAB.

Signtool sign /f “D:\RPA\Custom Action1\PADCustomActionCert.pfx” /p MyCustomActionPassword /fd SHA256 “D:\RPA\Custom Action1\Modules.DataTable\bin\Debug\net472\Modules.DataTable.cab”

Các tham số cần chỉnh

8. Upload Custom Action lên Power Automate

  • Truy cập Power Automate → Custom actions
  • Upload file .CAB
  • Thêm Custom Action vào flow thông qua Asset Library

Cảm ơn bạn đã đọc. Hy vọng hướng dẫn này giúp bạn thao tác dễ dàng hơn trong việc tạo Custom Action.
Trong phần tiếp theo, tôi sẽ chia sẻ các lỗi thường gặp và cách khắc phục.

0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận
Bài viết công nghệ:
0
Rất thích suy nghĩ của bạn, hãy bình luận.x