Bu kılavuzda, giriş değişkeninin nasıl doğrulanacağı açıklanmaktadır.
Bir giriş değişkeni tanımlarken en iyi uygulama olarak kullanıcının uygun bir değer girdiğini doğrulayın. Örneğin, kullanıcıdan bir rakam girmesini istiyorsanız a yerine 1 girdiğini doğrulayarak adımınızın hatasız çalıştığını doğrulayabilirsiniz.
Giriş değişkenlerini doğrulamanın iki yolu vardır:
- İstemci tarafı doğrulama: İstemci tarafı doğrulama ile kullanıcının girişini doğrudan cihazında doğrulayabilirsiniz. Kullanıcı anında geri bildirim alır ve adımı yapılandırırken girişindeki hataları düzeltebilir.
- Sunucu tarafı doğrulama: Sunucu tarafı doğrulama, doğrulama sırasında sunucuda mantık çalıştırmanıza olanak tanır. Bu, istemcinin sahip olmadığı bilgileri (ör. diğer sistemlerdeki veya veritabanlarındaki veriler) aramanız gerektiğinde kullanışlıdır.
İstemci tarafı doğrulama
İstemci tarafı doğrulama iki şekilde uygulanabilir:
- Bir widget'ın belirli bir karakter sayısından daha az karakter içerdiğini veya
@sembolünü içerdiğini doğrulama gibi temel doğrulama için Google Workspace eklentisinin Kart hizmetininValidationsınıfını çağırın. - Widget değerlerini diğer widget değerleriyle karşılaştırma gibi güçlü doğrulama için
CardServicekullanarak aşağıdaki desteklenen kart widget'larına Common Expression Language (CEL) doğrulaması ekleyebilirsiniz.
Validation sınıfını çağırma
Aşağıdaki örnek, bir TextInput widget'ının 10 veya daha az karakter içerdiğini doğrular:
Apps Komut Dosyası
const validation = CardService.newValidation().setCharacterLimit('10').setInputType(
CardService.InputType.TEXT);
Ek doğrulama seçenekleri için CEL doğrulamasını kullanın.
CEL Doğrulaması
Common Expression Language (CEL) doğrulama, diğer hizmetlerden veri aramaya bağlı olmayan giriş değeri kontrollerini istemci tarafına yükleyerek sunucu tarafı doğrulamanın gecikmesi olmadan anında giriş kontrolleri sunar.
Doğrulama sonucuna bağlı olarak widget'ı gösterme veya gizleme gibi kart davranışları oluşturmak için de CEL'i kullanabilirsiniz. Bu tür davranışlar, kullanıcının girişlerini düzeltmesine yardımcı olan bir hata mesajını göstermek veya gizlemek için kullanışlıdır.
Tam bir CEL doğrulama oluşturmak için aşağıdaki bileşenler gerekir:
Karttaki
ExpressionData: Tanımlanan koşullardan biri karşılandığında belirtilen doğrulama mantığını ve widget tetikleme mantığını içerir.Id: Geçerli karttakiExpressionDataiçin benzersiz bir tanımlayıcı.Expression: Doğrulama mantığını tanımlayan CEL dizesi (ör."value1 == value2").Conditions: Önceden tanımlanmış doğrulama sonuçlarının (BAŞARILI veya BAŞARISIZ) bir seçimini içeren koşullar listesi. Koşullar, ortak biractionRuleIdileTriggersüzerinden widget tarafındakiEventActionile ilişkilendirilir.- Kart düzeyinde
EventAction: Kartta CEL doğrulamalarını etkinleştirir ve etkinlik sonrası tetikleyiciler aracılığıylaExpressionDataalanını sonuç widget'larıyla ilişkilendirir.actionRuleId: BuEventActioniçin benzersiz kimlik.ExpressionDataAction: Bu işlemin CEL değerlendirmesini başlattığını belirtmek içinSTART_EXPRESSION_EVALUATIONolarak ayarlayın.Trigger:ConditionsöğesiniactionRuleIdtemelinde Widget tarafındakiEventActionsöğesine bağlar.
Widget düzeyinde
EventAction: Başarı veya başarısızlık koşulu karşılandığında sonuç widget'ının davranışını kontrol eder. Örneğin, bir sonuç widget'ı, yalnızca doğrulama başarısız olduğunda görünür hale gelen bir hata mesajı içeren birTextParagrapholabilir.actionRuleId: Kart tarafındakiTriggerileactionRuleIdeşleşir.CommonWidgetAction: Widget görünürlüğünü güncelleme gibi değerlendirme içermeyen işlemleri tanımlar.UpdateVisibilityAction: Bir widget'ın görünürlük durumunu (VISIBLE veya HIDDEN) güncelleyen bir işlem.
Aşağıdaki örnekte, iki metin girişinin eşit olup olmadığını kontrol etmek için CEL doğrulamasının nasıl uygulanacağı gösterilmektedir. Eşit değillerse hata mesajı gösterilir.
-
Şekil 1: failConditionkarşılandığında (girişler eşit olmadığında) hata mesajı widget'ıVISIBLEolarak ayarlanır ve görünür. -
Şekil 2: successConditionkarşılandığında (girişler eşit olduğunda) hata mesajı widget'ıHIDDENolarak ayarlanır ve görünmez.
Örnek uygulama kodu ve JSON manifest dosyası:
Apps Komut Dosyası
function onConfig() {
// Create a Card
let card = CardService.newCardBuilder();
const textInput_1 = CardService.newTextInput()
.setTitle("Input number 1")
.setFieldName("value1"); // FieldName's value must match a corresponding ID defined in the inputs[] array in the manifest file.
const textInput_2 = CardService.newTextInput()
.setTitle("Input number 2")
.setFieldName("value2"); // FieldName's value must match a corresponding ID defined in the inputs[] array in the manifest file.
let sections = CardService.newCardSection()
.setHeader("Two number equals")
.addWidget(textInput_1)
.addWidget(textInput_2);
// CEL Validation
// Define Conditions
const condition_success = CardService.newCondition()
.setActionRuleId("CEL_TEXTINPUT_SUCCESS_RULE_ID")
.setExpressionDataCondition(
CardService.newExpressionDataCondition()
.setConditionType(
CardService.ExpressionDataConditionType.EXPRESSION_EVALUATION_SUCCESS));
const condition_fail = CardService.newCondition()
.setActionRuleId("CEL_TEXTINPUT_FAILURE_RULE_ID")
.setExpressionDataCondition(
CardService.newExpressionDataCondition()
.setConditionType(
CardService.ExpressionDataConditionType.EXPRESSION_EVALUATION_FAILURE));
// Define Card-side EventAction
const expressionDataAction = CardService.newExpressionDataAction()
.setActionType(
CardService.ExpressionDataActionType.START_EXPRESSION_EVALUATION);
// Define Triggers for each Condition respectively
const trigger_success = CardService.newTrigger()
.setActionRuleId("CEL_TEXTINPUT_SUCCESS_RULE_ID");
const trigger_failure = CardService.newTrigger()
.setActionRuleId("CEL_TEXTINPUT_FAILURE_RULE_ID");
const eventAction = CardService.newEventAction()
.setActionRuleId("CEL_TEXTINPUT_EVALUATION_RULE_ID")
.setExpressionDataAction(expressionDataAction)
.addPostEventTrigger(trigger_success)
.addPostEventTrigger(trigger_failure);
// Define ExpressionData for the current Card
const expressionData = CardService.newExpressionData()
.setId("expData_id")
.setExpression("value1 == value2") // CEL expression
.addCondition(condition_success)
.addCondition(condition_fail)
.addEventAction(eventAction);
card = card.addExpressionData(expressionData);
// Create Widget-side EventActions and a widget to display error message
const widgetEventActionFail = CardService.newEventAction()
.setActionRuleId("CEL_TEXTINPUT_FAILURE_RULE_ID")
.setCommonWidgetAction(
CardService.newCommonWidgetAction()
.setUpdateVisibilityAction(
CardService.newUpdateVisibilityAction()
.setVisibility(
CardService.Visibility.VISIBLE)));
const widgetEventActionSuccess = CardService.newEventAction()
.setActionRuleId("CEL_TEXTINPUT_SUCCESS_RULE_ID")
.setCommonWidgetAction(
CardService.newCommonWidgetAction()
.setUpdateVisibilityAction(
CardService.newUpdateVisibilityAction()
.setVisibility(
CardService.Visibility.HIDDEN)));
const errorWidget = CardService.newTextParagraph()
.setText("The first and second value must match.")
.setVisibility(CardService.Visibility.HIDDEN) // Initially hidden
.addEventAction(widgetEventActionFail)
.addEventAction(widgetEventActionSuccess);
sections = sections.addWidget(errorWidget);
card = card.addSection(sections);
// Build and return the Card
return card.build();
}
JSON manifest dosyası
{
"timeZone": "America/Los_Angeles",
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"addOns": {
"common": {
"name": "CEL validation example",
"logoUrl": "https://www.gstatic.com/images/branding/productlogos/calculator_search/v1/web-24dp/logo_calculator_search_color_1x_web_24dp.png",
"useLocaleFromApp": true
},
"flows": {
"workflowElements": [
{
"id": "actionElement",
"state": "ACTIVE",
"name": "CEL Demo",
"description": "Demonstrates CEL Validation",
"workflowAction": {
"inputs": [
{
"id": "value1",
"description": "The first number",
"cardinality": "SINGLE",
"dataType": {
"basicType": "INTEGER"
}
},
{
"id": "value2",
"description": "The second number",
"cardinality": "SINGLE",
"dataType": {
"basicType": "INTEGER"
}
}
],
"onConfigFunction": "onConfig",
"onExecuteFunction": "onExecute"
}
}
]
}
}
}
Desteklenen CEL doğrulama widget'ları ve işlemleri
CEL doğrulamasını destekleyen kart widget'ları
Aşağıdaki widget'lar CEL doğrulamasını destekler:
TextInputSelectionInputDateTimePicker
Desteklenen CEL doğrulama işlemleri
- Aritmetik işlemler
+: İkiint64,uint64veyadoublesayısı ekler.-: İkiint64,uint64veyadoublesayısını çıkarır.*: İkiint64,uint64veyadoublesayısını çarpar./: İkiint64,uint64veyadoublesayısını böler (tam sayı bölme).%: İkiint64veyauint64sayının modülünü hesaplar.-:int64veyauint64sayısını olumsuzlar.
- Mantıksal işlemler:
&&: İki Boole değeri üzerinde mantıksalANDişlemi gerçekleştirir.||: İki Boole değeri üzerinde mantıksalORişlemi gerçekleştirir.!: Boole değeri üzerinde mantıksalNOTişlemi gerçekleştirir.
- Karşılaştırma İşlemleri:
==: İki değerin eşit olup olmadığını kontrol eder. Sayılar ve listeler desteklenir.!=: İki değerin eşit olup olmadığını kontrol eder. Sayılar ve listeler desteklenir.<: İlkint64,uint64veyadoublesayısının ikinciden küçük olup olmadığını kontrol eder.<=: İlkint64,uint64veyadoublesayısının ikinciden küçük ya da ona eşit olup olmadığını kontrol eder.>: İlkint64,uint64veyadoublesayısının ikinciden büyük olup olmadığını kontrol eder.>=: İlkint64,uint64veyadoublesayısının ikinciden büyük ya da ona eşit olup olmadığını kontrol eder.
- Listeleme İşlemleri:
in: Bir değerin listede olup olmadığını kontrol eder. Sayıları, dizeleri ve iç içe geçmiş listeleri destekler.size: Bir listedeki öğe sayısını döndürür. Sayıları ve iç içe geçmiş listeleri destekler.
Desteklenmeyen CEL doğrulama senaryoları
- İkili işlemler için yanlış bağımsız değişken boyutları: İkili işlemler (örneğin,
add_int64, eşittir) tam olarak iki bağımsız değişken gerektirir. Farklı sayıda bağımsız değişken sağlamak hataya neden olur. - Tekli İşlemler İçin Yanlış Bağımsız Değişken Boyutları: Tekli işlemler (ör.
negate_int64) için tam olarak bir bağımsız değişken gerekir. Farklı sayıda bağımsız değişken sağlamak hataya neden olur. - Sayısal İşlemlerde Desteklenmeyen Türler: Sayısal ikili ve tekli işlemler yalnızca sayı bağımsız değişkenlerini kabul eder. Diğer türlerin (örneğin, boolean) sağlanması hataya neden olur.
Sunucu tarafı doğrulama
Sunucu tarafı doğrulama ile adımınızın kodunda onSaveFunction() belirterek sunucu tarafı mantığı çalıştırabilirsiniz. Kullanıcı, adımın yapılandırma kartından uzaklaştığında onSaveFunction() çalışır ve kullanıcının girişini doğrulamanıza olanak tanır.
Kullanıcının girişi geçerliyse saveWorkflowAction değerini döndürün.
Kullanıcının girişi geçersizse kullanıcıya hatanın nasıl çözüleceğini açıklayan bir hata mesajı gösteren bir yapılandırma kartı döndürün.
Sunucu tarafı doğrulama eşzamansız olduğundan kullanıcı, akışını yayınlayana kadar giriş hatası hakkında bilgi sahibi olmayabilir.
Manifest dosyasındaki her doğrulanmış girişin id değeri, kodda bir kart widget'ının name değeriyle eşleşmelidir.
Aşağıdaki örnekte, kullanıcı metin girişinin "@" işaretini içerdiği doğrulanır:
Manifest dosyası
Manifest dosyası alıntısında, "onSave" adlı bir onSaveFunction() belirtiliyor:
JSON
{
"timeZone": "America/Los_Angeles",
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"addOns": {
"common": {
"name": "Server-side validation example",
"logoUrl": "https://www.gstatic.com/images/branding/productlogos/calculator_search/v1/web-24dp/logo_calculator_search_color_1x_web_24dp.png",
"useLocaleFromApp": true
},
"flows": {
"workflowElements": [
{
"id": "actionElement",
"state": "ACTIVE",
"name": "Calculate",
"description": "Asks the user for an email address",
"workflowAction": {
"inputs": [
{
"id": "email",
"description": "email address",
"cardinality": "SINGLE",
"required": true,
"dataType": {
"basicType": "STRING"
}
}
],
"onConfigFunction": "onConfigCalculate",
"onExecuteFunction": "onExecuteCalculate",
"onSaveFunction": "onSave"
}
}
]
}
}
}
Uygulama kodu
Adımın kodu, onSave() adlı bir işlev içeriyor. Kullanıcı tarafından girilen bir dizenin @ içerip içermediğini doğrular. İçeriyorsa akış adımını kaydeder. Aksi takdirde, hatanın nasıl düzeltileceğini açıklayan bir hata mesajı içeren yapılandırma kartı döndürülür.
Apps Komut Dosyası
/**
* Validates user input asynchronously when the user
* navigates away from a step's configuration card.
*/
function onSave(event) {
// "email" matches the input ID specified in the manifest file.
var email = event.workflow.actionInvocation.inputs["email"];
// Validate that the email address contains an "@" sign:
if(email.includes("@")) {
// If successfully validated, save and proceed.
return {
"hostAppAction" : {
"workflowAction" : {
"saveWorkflowAction" : {}
}
}
};
// If the input is invalid, return a card with an error message
} else {
var card = {
"sections": [
{
"header": "Collect Email",
"widgets": [
{
"textInput": {
"name": "email",
"label": "email address",
"hostAppDataSource" : {
"workflowDataSource" : {
"includeVariables" : true
}
}
}
},
{
"textParagraph": {
"text": "<b>Error:</b> Email addresses must include the '@' sign.",
"maxLines": 1
}
}
]
}
]
};
return pushCard(card);
}
}
İlgili konular
- Giriş değişkeni tanımlama
- Etkinlikleri ve hataları günlüğe kaydetme
- Flows etkinlik nesnesi
- Common Expression Language (CEL)