Workflow là gì và điều cần thiết của workflow trong Appsheet


Workflow nó là gì?

Bài 03: Workflow và công thức trong Appsheet

Workflow là một quy trình hoặc chuỗi các bước thực hiện để hoàn thành một tác vụ hoặc dịch vụ cụ thể. Nó có thể bao gồm các hoạt động như ghi nhận thông tin, xử lý dữ liệu, gửi thông báo, hoặc kết nối với các hệ thống khác. Workflow có thể được sử dụng trong rất nhiều lĩnh vực khác nhau, chẳng hạn như kinh doanh, y tế, và công nghệ thông tin. Nó có thể được thiết kế theo các quy tắc cụ thể và được tự động hoặc thủ công thực hiện.

Các bước để tạo ra một workflow có thể khác nhau tùy thuộc vào nền tảng hoặc công cụ mà bạn sử dụng, tuy nhiên, tổng quát thì có thể giới thiệu các bước chung sau:

  1. Xác định mục đích của workflow: Trước khi bắt đầu thiết kế, bạn cần xác định rõ mục đích của workflow và các kết quả mong muốn cần đạt được.

  2. Tạo sơ đồ quy trình: Sử dụng các công cụ hoặc phần mềm để tạo sơ đồ quy trình, bao gồm các bước và các liên kết giữa chúng.

  3. Thiết lập các quy tắc và điều kiện: Định nghĩa các quy tắc và điều kiện để xác định khi nào workflow sẽ được kích hoạt và khi nào sẽ dừng lại.

  4. Thiết lập các hành động: Xác định các hành động sẽ được thực hiện trong quá trình thực hiện workflow, chẳng hạn như gửi thông báo, cập nhật dữ liệu hoặc kết nối với các hệ thống khác.

  5. Kiểm tra và điều chỉnh: Sau khi hoàn thành thiết kế, bạn cần kiểm tra lại workflow để đảm bảo rằng nó hoạt động đúng cách và thực hiện đúng các hành động mong muốn. Nếu cần, bạn có thể điều chỉnh workflow để cải thiện hoạt động hoặc thêm các tính năng mới.

  6. Phổ biến và huấn luyện: Nếu workflow được sử dụng trong một doanh nghiệp, bạn cần phổ biến và huấn luyện cho nhân viên hoặc người dùng sử dụng workflow để đảm bảo rằng họ có thể sử dụng nó một cách hiệu quả.

  7. Theo dõi và đánh giá hiệu quả: sau khi phổ biến và huấn luyện, bạn cần theo dõi và đánh giá hiệu quả của workflow để đảm bảo rằng nó đang hoạt động hiệu quả và đáp ứng được mục đích ban đầu.

Một số công cụ hỗ trợ tạo workflow bao gồm:

Visio của Microsoft

Visio

Diagrams

Diagram Software and Flowchart Maker


Một số quy trình trong thực tế






💡 Thường đối với các trường dữ liệu liên kết với nhau thường sẽ tạo ra 1 hoặc nhiều trường

Tính toán trên Appsheet

Trên Appsheet sẽ hỗ trợ hai loại công thức, công thức trên Appsheet và công thức trên Google sheet, hai loại công thức này đều có ưu điểm và nhược điểm riêng.


So sánh

➡️ Công thức trên Google sheet

➡️ Công thức trên Appsheet

Thông tin

Là công thức được thiết kế để sử dụng trong môi trường Google sheet và có thể sử dụng để tính toán các trường dữ liệu trong một bảng dữ liệu hoặc tạo ra các giá trị mới. 

Là công thức được thiết kế để sử dụng trong môi trường Appsheet và có thể sử dụng để tính toán các trường dữ liệu trong một bảng dữ liệu hoặc tạo ra các giá trị mới. Công thức này có thể sử dụng các hàm và các toán tử riêng của Appsheet và có thể tính toán nhanh hơn so với công thức trên Google sheet.

Ưu điểm

Viết hàm nhanh, quen thuộc với người dùng.

Không cần phải quan tâm tới việc cập nhật dữ liệu, dữ liệu sẽ tự động cập nhật.

Hỗ trợ nhiều công thức phức tạp.

Tốc độ tải của ứng dụng sẽ được giảm nhẹ.

Hỗ trợ nhiều công thức phức tạp.

Tốc độ load của app sẽ được nhẹ đi.


Nhược điểm

Phải đồng bộ lại mới thấy được dữ liệu.

Chỉ hỗ trợ dữ liệu lưu trên Google Sheet.

Dữ liệu sẽ load cần rất nhiều thời gian

Nhiều công thức rất phức tạp

Cần cài đặt nhiều về update giữa các bảng dữ liệu




💡 Tổng quát, sử dụng công thức trên Appsheet sẽ dễ dàng và nhanh hơn, nhưng công thức trên Google sheet có thể tính toán chính xác hơn. Tùy thuộc vào nhu cầu và mục đích cụ thể của bạn, bạn có thể chọn sử dụng công thức trên Appsheet hoặc công thức trên Google sheet.

Công thức trên Appsheet.

⚠️ Công thức phải viết chính xác cho 100% các điều kiện. Nếu một điều kiện sai thì công thức đó là công thức sai!


Trên Appsheet, có một số quy tắc chung cho viết các công thức:

  1. Sử dụng cú pháp của Appsheet: Các công thức trên Appsheet phải tuân thủ cú pháp của Appsheet, bao gồm các ký tự đặc biệt và các hàm của Appsheet.

  2. Sử dụng tên trường chính xác: Khi sử dụng các trường trong công thức, bạn phải sử dụng tên trường chính xác được cung cấp trong bảng dữ liệu.

  3. Sử dụng dấu ngoặc: Các tham số truyền vào cho các hàm phải được bao quanh bởi dấu ngoặc.

  4. Sử dụng dấu chấm phẩy để phân cách các câu lệnh: Mỗi câu lệnh trong công thức phải được phân cách bằng dấu chấm phẩy.

  5. Chú ý về chữ hoa, chữ thường: Tên trường và các hàm trong công thức phải được viết chính xác theo chữ hoa, chữ thường.

  6. Kiểm tra lỗi: Sau khi viết công thức, hãy kiểm tra lỗi để đảm bảo rằng công thức của bạn hoạt động đúng cách.

Vị trí sử dụng các hàm trong Appsheet

💡 Trong Appsheet có icon ⌛, khi có icon này chúng ta có thể viết các công thức tùy chỉnh các điều kiện hiển thị.



Trong Appsheet, có một số quy tắc cần tuân thủ khi sử dụng hàm (công thức) như sau:

  • Tên bảng không được đặt trong dấu []

  • Tên cột phải được đặt trong dấu []

  • Nếu sử dụng dạng văn bản, phải đặt trong dấu " hoặc ', không thể sử dụng cả hai cùng lúc.

  • Hàm trong Appsheet yêu cầu giá trị trả về, người dùng phải viết đúng các giá trị trả về.


Appsheet cũng giống như nhiều nên tảng phát triển app khác, nó luôn yêu cầu giá trị trả về chính xác. Cụ thể như sau:



💡 Khi viết công thức cần phải trả về đúng kiểu công thức mà Appsheet yêu cầu. Để biết loại công thức trả về, xem file dưới.


Các hàm trong Appsheet và cách sử dụng


THIS và THISROW

Trong Appsheet có một số hàm đặc biệt như sau:

  • [_THIS] Trả về KEY của dòng hiện tại
    Khi sử dụng hàm [_THIS] sẽ trả về KEY của dòng hiện tại. Ở ví dụ dưới, nếu như ở cột địa chỉ chúng ta sử dụng công thức [_THIS] cho cột địa chỉ, kết quả trả về sẽ là Id của dòng, vì ID lúc này là KEY. Và kết quả trả ra ở dòng 05 là KH2

  • [_THISROW].[ ___ ]
    Hàm [_THISROW].[ ___ ] trong AppSheet là một cách để tham chiếu đến các cột của dòng hiện tại trong một biểu thức. Nó hữu ích khi bạn muốn so sánh hoặc lấy giá trị từ một bảng hoặc lát khác có liên quan đến dòng hiện tại.

  • [_THISROW_BEFORE].[ ___ ]

    [_THISROW_BEFORE].[ ___ ] trong AppSheet là một cách để tham chiếu đến các giá trị cột trước khi một bản ghi được cập nhật. Nó hữu ích khi bạn muốn hiển thị hoặc so sánh các giá trị cột trước và sau khi cập nhật. 

Ví dụ chúng ta có cột SOLUONG

  • [_THISROW_AFTER].[ ___ ]

    [_THISROW_AFTER].[ ___ ] trong AppSheet là một cách để tham chiếu đến các giá trị cột sau khi một bản ghi được cập nhật. Nó hữu ích khi bạn muốn hiển thị hoặc so sánh các giá trị cột trước và sau khi cập nhật1.

    Ví dụ: [_THISROW_AFTER].[Priority] sẽ hiển thị giá trị mới của cột Priority trong một mẫu1.

    Ví dụ khác: AND ( ("Active" = [_THISROW_AFTER]. [Status]), ( [_THISROW_AFTER]. [Status] <> [_THISROW_BEFORE]. [Status]) ) sẽ kiểm tra xem cột Status có được thay đổi từ một giá trị khác sang Active hay không2.

SELECT VÀ FILTER

SELECT

Hàm SELECT cho phép bạn lấy một danh sách các giá trị từ một cột của một bảng hoặc lát dựa trên một điều kiện lọc. Cú pháp của hàm SELECT như sau:

SELECT (from-dataset-column, select-row?, [distinct-only?])

Trong đó:

  • from-dataset-column là tên bảng hoặc lát và tên cột mà bạn muốn lấy giá trị, ví dụ Orders [Order ID].

  • select-row? là một biểu thức Yes/No để xác định xem dòng nào sẽ được chọn hay không, ví dụ ( [Customer] = "John").

  • distinct-only? là một biểu thức Yes/No để xác định xem bạn có muốn loại bỏ các giá trị trùng lặp hay không. Nếu không có tham số này, mặc định là FALSE.

Ví dụ: Bạn có một bảng Orders với các cột Order ID, Customer, Date, Amount. Bạn muốn lấy danh sách các mã đơn hàng của khách hàng John. Bạn có thể sử dụng hàm SELECT như sau:

SELECT (Orders [Order ID], ( [Customer] = "John"))

Kết quả sẽ là một danh sách các giá trị Order ID của các dòng có giá trị Customer là John. Nếu bạn muốn lấy danh sách không có giá trị trùng lặp, bạn có thể thêm tham số TRUE vào cuối hàm:

SELECT (Orders [Order ID], ( [Customer] = "John"), TRUE)

⇒ SELECT sẽ trả về danh sách dạng list ví dụ lis1, list2 ….

FILTER

Hàm FILTER cho phép bạn lấy một danh sách các Refs từ một bảng hoặc lát dựa trên một điều kiện lọc. Refs là các giá trị của cột khóa của bảng hoặc lát. Cú pháp của hàm FILTER như sau:

FILTER (table-name, filter-expression)

Trong đó:

  • table-name là tên bảng hoặc lát mà bạn muốn lọc dữ liệu, ví dụ "Orders".

  • filter-expression là một biểu thức Yes/No để xác định xem dòng nào sẽ được chọn hay không, ví dụ ( [Amount] > 100).

Ví dụ: Bạn có một bảng Orders với các cột Order ID, Customer, Date, Amount. Bạn muốn lấy danh sách các Refs của các đơn hàng có giá trị Amount lớn hơn 100. Bạn có thể sử dụng hàm FILTER như sau:

FILTER ("Orders", ( [Amount] > 100))

Kết quả sẽ là một danh sách các giá trị Order ID của các dòng có giá trị Amount lớn hơn 100.

⇒ FILTER sẽ trả về dạng bảng, tức là toàn bộ cột trong bảng đó

So sánh SELECT và FILTER

Bảng dữ liệu DONHANG mẫu

id

ten_sp

so_luong

id1

san pham 01

500

id2

san pham 02

500

id3

san pham 03

300


SO SÁNH


SELECT 

FILTER


Select sẽ trả về một list giá trị

Filter sẽ trả về một bảng

Ví dụ

Select(DONGHANG[ID],true)

FILTER(DONGHANG[ID],true)

Kết quả trả về

id1,id2,id3


id

ten_sp

so_luong

id1

san pham 01

500

id2

san pham 02

500

id3

san pham 03

300


Như vậy FILTER sẽ trả về giá trị toàn bộ bảng (tất cả các cột) còn Select chỉ trả về giá trị của một cột duy nhất

CÁC CÔNG THỨC Ở TRÊN APPSHEET

Trên Appsheet hỗ trợ hơn 120 công thức, tuy vậy thực tế sử dụng chúng ta chỉ sử dụng khoảng 40 công thức.

Dưới đây là công thức


Mã đơn hàng

Ngày đặt hàng

Khách hàng

Tổng tiền

Trạng thái đơn hàng

DH001

05/05/2023

Nguyễn Văn A

1,000,000

Đã xử lý

DH002

06/05/2023

Trần Thị B

500,000

Chưa xử lý

DH003

07/05/2023

Lê Văn C

2,500,000

Đã giao hàng


Conditional

IF()

Hàm này dùng để kiểm tra một điều kiện và trả về giá trị tương ứng. Ví dụ, bạn muốn kiểm tra nếu đơn hàng đã được xử lý, gán giá trị "Đã xử lý" và ngược lại gán giá trị "Chưa xử lý":

IF([Trạng thái đơn hàng] = "Đã xử lý", "Đã xử lý", "Chưa xử lý")


IFS()

Hàm này giúp kiểm tra nhiều điều kiện và trả về kết quả tương ứng với điều kiện đúng đầu tiên. Ví dụ, bạn muốn phân loại đơn hàng theo tổng tiền:

IFS(

  [Tổng tiền] < 1000000, "Mức 1",

  [Tổng tiền] >= 1000000 AND [Tổng tiền] < 2000000, "Mức 2",

  [Tổng tiền] >= 2000000, "Mức 3"

)

SWITCH()

Hàm này dùng để so sánh giá trị với các giá trị mong đợi và trả về kết quả tương ứng. Ví dụ, bạn muốn đánh giá mức độ ưu tiên của đơn hàng dựa trên trạng thái:

SWITCH(

  [Trạng thái đơn hàng],

  "Chưa xử lý", 1,

  "Đã xử lý", 2,

  "Đã giao hàng", 3,

  0

)

Date and time

DATE()

Hàm này chuyển đổi DateTime hoặc Time thành định dạng ngày. Ví dụ, bạn muốn lấy ngày từ [Ngày đặt hàng]:

DATE([Ngày đặt hàng])


DATETIME()

Hàm này chuyển đổi ngày hoặc thời gian thành định dạng DateTime. Ví dụ, bạn muốn chuyển đổi [Ngày đặt hàng] thành DateTime:

DATETIME([Ngày đặt hàng])

NOW()

Hàm này trả về ngày và giờ hiện tại. Ví dụ, bạn muốn tính thời gian chờ từ ngày đặt hàng đến thời điểm hiện tại:

NOW() - [Ngày đặt hàng]

Informational

INPUT():

Hàm này cho phép người dùng nhập giá trị động hoặc được gán bởi một hành động. Ví dụ, bạn muốn tạo một trường nhập liệu để người dùng có thể nhập mã đơn hàng và tìm kiếm thông tin về đơn hàng đó:

INPUT("Mã đơn hàng", "")

Trong ví dụ này, "Mã đơn hàng" là tên đầu vào, và "" là giá trị mặc định. Bạn có thể thay đổi giá trị mặc định tùy theo nhu cầu của bạn.


context()

Hàm này chuyển đổi ngày hoặc thời gian thành định dạng DateTime. Ví dụ, bạn muốn chuyển đổi [Ngày đặt hàng] thành DateTime:

DATETIME([Ngày đặt hàng])

USEREMAIL():

Kết quả trả về: Địa chỉ email của người dùng hiện tại. 

Ví dụ: "nguyenvana@example.com"

Link

LINKTOAPP()

Kết quả trả về: Liên kết sâu đến ứng dụng có ID tương ứng. 

Ví dụ: "App:123456"

LINKTOROW()



LINKTOFORM()

Kết quả trả về: Liên kết sâu đến mẫu (form) trong ứng dụng với giá trị cột được điền sẵn. 

Ví dụ: 

LINKTOROW()

Kết quả trả về: Liên kết sâu đến hàng trong ứng dụng với chế độ xem chỉ định. Ví dụ: " App:

LINKTOVIEW()

Đi tới một view khác

LINKURL()


List

SELECT()

Hàm này trả về một danh sách các giá trị từ cột trong bảng dữ liệu dựa trên điều kiện cho trước. Ví dụ, bạn muốn lấy danh sách tên khách hàng có đơn hàng chưa xử lý:

SELECT(Đơn hàng[Khách hàng], [Trạng thái đơn hàng] = "Chưa xử lý")

ANY()

Hàm này trả về một mục ngẫu nhiên từ danh sách. Ví dụ, bạn muốn lấy một khách hàng ngẫu nhiên từ danh sách khách hàng:

ANY(Khách hàng[Tên khách hàng])

COUNT()

Hàm này trả về số lượng mục trong danh sách. Ví dụ, bạn muốn đếm số lượng đơn hàng chưa xử lý:

COUNT(SELECT(Đơn hàng[Khách hàng], [Trạng thái đơn hàng] = "Chưa xử lý"))

IN()

Hàm này kiểm tra xem một giá trị có nằm trong danh sách hay không. Ví dụ, bạn muốn kiểm tra xem khách hàng "Nguyễn Văn A" có trong danh sách khách hàng hay không:

IN("Nguyễn Văn A", Khách hàng[Tên khách hàng])

INDEX()

Hàm này trả về một mục cụ thể trong danh sách dựa trên chỉ số. Ví dụ, bạn muốn lấy tên khách hàng thứ hai trong danh sách:

INDEX(Khách hàng[Tên khách hàng], 2)

MAX()

Hàm này trả về giá trị lớn nhất trong danh sách. Ví dụ, bạn muốn tìm đơn hàng có tổng tiền lớn nhất:

MAX(Đơn hàng[Tổng tiền])

MIN()

Hàm này trả về giá trị nhỏ nhất trong danh sách. Ví dụ, bạn muốn tìm đơn hàng có tổng tiền nhỏ nhất:

MIN(Đơn hàng[Tổng tiền])

SPLIT()

Hàm SPLIT():

Hàm này tách văn bản thành danh sách dựa trên ký tự phân tách. Ví dụ, bạn muốn tách chuỗi "A, B, C" thành danh sách:

SPLIT("A, B, C", ",")

UNIQUE()

Hàm này trả về danh sách các giá trị không trùng lặp từ danh sách ban đầu. Ví dụ, bạn muốn lấy danh sách các khách hàng không trùng lặp từ bảng đơn.

Ví dụ UNIQUE(1,2,1) => Trả về 1,2

Logical

AND()

Hàm này kiểm tra xem tất cả các điều kiện có đúng hay không. Nếu tất cả các điều kiện đều đúng, hàm trả về TRUE, ngược lại trả về FALSE. Ví dụ, bạn muốn kiểm tra xem một đơn hàng có tổng tiền lớn hơn 1,000,000 VND và trạng thái "Đã giao hàng":

AND([Tổng tiền] > 1000000, [Trạng thái đơn hàng] = "Đã giao hàng")

NOT()

Hàm này kiểm tra xem một điều kiện có sai hay không. Nếu điều kiện sai, hàm trả về TRUE, ngược lại trả về FALSE. Ví dụ, bạn muốn kiểm tra xem một đơn hàng có trạng thái khác "Chưa xử lý":

NOT([Trạng thái đơn hàng] = "Chưa xử lý")

OR()

Hàm này kiểm tra xem ít nhất một trong các điều kiện có đúng hay không. Nếu ít nhất một điều kiện đúng, hàm trả về TRUE, ngược lại trả về FALSE. Ví dụ, bạn muốn kiểm tra xem một đơn hàng có tổng tiền lớn hơn 1,000,000 VND hoặc trạng thái "Đã giao hàng":

OR([Tổng tiền] > 1000000, [Trạng thái đơn hàng] = "Đã giao hàng")

Math

ROUND()

Làm tròn một số đến số chữ số thập phân nhất định.

ROUND(3.14159, 2) sẽ trả về 3.14

CEILING()

Làm tròn một số lên đến số nguyên gần nhất lớn hơn hoặc bằng số đó.

CEILING(3.14159) sẽ trả về 4

Table

FILTER()

Lọc các hàng trong tập dữ liệu dựa trên điều kiện đã cho.

FILTER("Đơn hàng", [Trạng thái đơn hàng] = "Chưa xử lý")

LOOKUP()

Tìm kiếm giá trị trong tập dữ liệu dựa trên giá trị của cột đã cho và trả về giá trị từ cột khác.

LOOKUP("DH001", "Đơn hàng", "Mã đơn hàng", "Khách hàng")

MAXROW()

Tìm hàng có giá trị lớn nhất trong cột đã cho và tuân theo điều kiện đã cho (nếu có).

MAXROW("Đơn hàng", "Tổng tiền", [Trạng thái đơn hàng] = "Đã xử lý")

MINROW()

Tìm hàng có giá trị nhỏ nhất trong cột đã cho và tuân theo điều kiện đã cho (nếu có).

MINROW("Đơn hàng", "Tổng tiền", [Trạng thái đơn hàng] = "Đã xử lý")

ORDERBY()

Sắp xếp danh sách các hàng trong tập dữ liệu theo một hoặc nhiều cột.

ORDERBY("Đơn hàng", [Ngày đặt hàng], TRUE, [Tổng tiền])

Text

EXTRACT()

Trích xuất các giá trị từ văn bản.

EXTRACT("số", "Đơn hàng số DH001")

FIND()

Tìm vị trí của chuỗi con trong văn bản.

FIND("Văn", "Nguyễn Văn A")

LEN()

Tính số lượng ký tự trong giá trị văn bản.

LEN("Nguyễn Văn A")

LOWER()

Chuyển đổi văn bản thành chữ thường.

LOWER("NGUYỄN VĂN A")

SUBSTITUTE()

Thay thế một chuỗi ký tự cũ bằng chuỗi ký tự mới trong văn bản.

SUBSTITUTE("Nguyễn Văn A", "A", "B")

TEXT()

Định dạng giá trị dưới dạng văn bản hoặc định dạng thời gian dưới dạng văn bản.

TEXT(123) hoặc TEXT(TODAY(), "DD/MM/YYYY")

TRIM()

Loại bỏ khoảng trắng dư thừa ở đầu và cuối của chuỗi văn bản.

TRIM(" Nguyễn Văn A ")

UPPER()

Chuyển đổi văn bản thành chữ hoa.

UPPER("nguyễn văn a")

Yes/No

CONTAINS()

Kiểm tra xem văn bản có chứa chuỗi ký tự cần tìm hay không.

CONTAINS("Nguyễn Văn A", "Văn")

ISBLANK()

Kiểm tra xem giá trị có vắng mặt hay không.

ISBLANK([Tên_khách_hàng])

ISNOTBLANK()

Kiểm tra xem giá trị có tồn tại hay không.

ISNOTBLANK([Địa_chỉ])

Nếu bạn muốn tìm một khóa học về Appsheet có thể tham khảo khóa học sau trên Unica.
Hòa Data

Chào các bạn, tôi là Hòa - chuyên gia phân tích dữ liệu, nhà phát triển ứng dụng AppSheet. Tôi rất mong được cùng hợp tác và phát triển với các doanh nghiệp để mang đến những giải pháp tối ưu nhất.

Đăng nhận xét

Mới hơn Cũ hơn