একটি ইনপুট ভেরিয়েবল যাচাই করুন

এই নির্দেশিকাটি ব্যাখ্যা করে কিভাবে একটি ইনপুট ভেরিয়েবল যাচাই করতে হয়।

একটি ইনপুট ভেরিয়েবল সংজ্ঞায়িত করার সময়, সর্বোত্তম অনুশীলন হিসাবে, যাচাই করুন যে ব্যবহারকারী একটি উপযুক্ত মান প্রবেশ করান। উদাহরণস্বরূপ, যদি আপনি ব্যবহারকারীকে একটি সংখ্যা ইনপুট করতে বলেন, তাহলে যাচাই করা হবে যে তারা a এর পরিবর্তে 1 প্রবেশ করায় আপনার পদক্ষেপটি ত্রুটি ছাড়াই চলছে।

একটি ইনপুট ভেরিয়েবল যাচাই করার দুটি উপায় আছে:

  • ক্লায়েন্ট-সাইড ভ্যালিডেশন : ক্লায়েন্ট-সাইড ভ্যালিডেশনের মাধ্যমে, আপনি ব্যবহারকারীর ইনপুট সরাসরি তাদের ডিভাইসে যাচাই করতে পারবেন। ব্যবহারকারী তাৎক্ষণিক প্রতিক্রিয়া পাবেন এবং ধাপটি কনফিগার করার সময় তাদের ইনপুটে যেকোনো ত্রুটি সংশোধন করতে পারবেন।
  • সার্ভার-সাইড ভ্যালিডেশন : সার্ভার-সাইড ভ্যালিডেশন আপনাকে ভ্যালিডেশনের সময় সার্ভারে লজিক চালাতে দেয়, যা ক্লায়েন্টের কাছে নেই এমন তথ্য অনুসন্ধান করার সময় কার্যকর, যেমন অন্যান্য সিস্টেম বা ডাটাবেসের ডেটা।

ক্লায়েন্ট-সাইড যাচাইকরণ

ক্লায়েন্ট-সাইড যাচাইকরণ বাস্তবায়নের দুটি উপায় রয়েছে:

  • মৌলিক যাচাইকরণের জন্য, যেমন একটি উইজেটে নির্দিষ্ট সংখ্যক অক্ষরের চেয়ে কম অক্ষর আছে কিনা বা @ চিহ্ন আছে কিনা তা যাচাই করার জন্য, Google Workspace অ্যাড-অনের কার্ড পরিষেবার Validation ক্লাসটি ব্যবহার করুন।
  • শক্তিশালী বৈধতার জন্য, যেমন অন্যান্য উইজেট মানের সাথে উইজেট মান তুলনা করার জন্য, আপনি CardService ব্যবহার করে নিম্নলিখিত সমর্থিত কার্ড উইজেটগুলিতে Common Expression Language (CEL) বৈধতা যোগ করতে পারেন।

Validation ক্লাসটি চালু করুন

নিচের উদাহরণটি যাচাই করে যে একটি TextInput উইজেটে ১০ বা তার কম অক্ষর রয়েছে:

অ্যাপস স্ক্রিপ্ট

const validation = CardService.newValidation().setCharacterLimit('10').setInputType(
    CardService.InputType.TEXT);

অতিরিক্ত বৈধতা বিকল্পের জন্য CEL বৈধতা ব্যবহার করুন।

CEL বৈধতা

কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (CEL) ভ্যালিডেশন সার্ভার-সাইড ভ্যালিডেশনের বিলম্ব ছাড়াই তাৎক্ষণিক ইনপুট চেক অফার করে, ইনপুট ভ্যালু চেক অফলোড করে যা অন্যান্য পরিষেবা থেকে ক্লায়েন্ট সাইডে ডেটা লুকআপের উপর নির্ভরশীল নয়।

আপনি কার্ড আচরণ তৈরি করতে CEL ব্যবহার করতে পারেন, যেমন যাচাইকরণের ফলাফলের উপর নির্ভর করে একটি উইজেট প্রদর্শন বা লুকানো। এই ধরণের আচরণ একটি ত্রুটি বার্তা দেখানো বা লুকানোর জন্য কার্যকর যা ব্যবহারকারীদের তাদের ইনপুট সংশোধন করতে সহায়তা করে।

একটি সম্পূর্ণ CEL যাচাইকরণ তৈরিতে নিম্নলিখিত উপাদানগুলি জড়িত:

  • কার্ডে ExpressionData : নির্দিষ্ট বৈধতা লজিক এবং নির্ধারিত শর্তগুলির মধ্যে একটি পূরণ হলে উইজেট ট্রিগারিং লজিক ধারণ করে।

    • Id : বর্তমান কার্ডের মধ্যে ExpressionData জন্য একটি অনন্য শনাক্তকারী।
    • Expression : CEL স্ট্রিং যা বৈধতা লজিক সংজ্ঞায়িত করে (যেমন, "value1 == value2" )।
    • Conditions : শর্তাবলীর একটি তালিকা যাতে পূর্বনির্ধারিত যাচাইকরণ ফলাফলের একটি নির্বাচন থাকে (সাফল্য বা ব্যর্থতা)। শর্তাবলী একটি শেয়ার্ড actionRuleId সহ Triggers মাধ্যমে উইজেট-সাইড EventAction এর সাথে সংযুক্ত।
    • কার্ড-স্তরের EventAction : কার্ডে CEL যাচাইকরণ সক্রিয় করে এবং ইভেন্ট-পরবর্তী ট্রিগারের মাধ্যমে ফলাফল উইজেটের সাথে ExpressionData ফিল্ডকে সংযুক্ত করে।
      • actionRuleId : এই EventAction এর জন্য অনন্য আইডি।
      • ExpressionDataAction : এই ক্রিয়াটি CEL মূল্যায়ন শুরু করে তা নির্দেশ করার জন্য START_EXPRESSION_EVALUATION এ সেট করুন।
      • Trigger : actionRuleId উপর ভিত্তি করে Conditions উইজেট-সাইড EventActions এর সাথে সংযুক্ত করে।
  • উইজেট-স্তরের EventAction : সাফল্য বা ব্যর্থতার শর্ত পূরণ হলে ফলাফল উইজেটের আচরণ নিয়ন্ত্রণ করে। উদাহরণস্বরূপ, একটি ফলাফল উইজেট একটি TextParagraph হতে পারে যাতে একটি ত্রুটি বার্তা থাকে যা কেবল তখনই দৃশ্যমান হয় যখন বৈধতা ব্যর্থ হয়।

    • actionRuleId : কার্ড-সাইড Trigger actionRuleId সাথে মেলে।
    • CommonWidgetAction : এমন ক্রিয়াগুলিকে সংজ্ঞায়িত করে যা মূল্যায়নের সাথে জড়িত নয়, যেমন উইজেটের দৃশ্যমানতা আপডেট করা।
      • UpdateVisibilityAction : এমন একটি ক্রিয়া যা একটি উইজেটের দৃশ্যমানতার অবস্থা (দৃশ্যমান বা লুকানো) আপডেট করে।

দুটি টেক্সট ইনপুট সমান কিনা তা পরীক্ষা করার জন্য CEL ভ্যালিডেশন কীভাবে বাস্তবায়ন করতে হয় তা নিম্নলিখিত উদাহরণে দেখানো হয়েছে। যদি তারা সমান না হয় তবে একটি ত্রুটি বার্তা দেখানো হয়।

  • যখন failCondition পূরণ হয় (ইনপুট সমান নয়), ত্রুটি বার্তা উইজেটটি VISIBLE তে সেট করা হয় এবং প্রদর্শিত হয়।
    চিত্র ১: যখন failCondition পূরণ হয় (ইনপুট সমান নয়), ত্রুটি বার্তা উইজেটটি VISIBLE তে সেট করা হয় এবং প্রদর্শিত হয়।
  • যখন successCondition পূরণ করা হয় (ইনপুট সমান), ত্রুটি বার্তা উইজেটটি HIDDEN এ সেট করা হয় এবং প্রদর্শিত হয় না।
    চিত্র ২: যখন successCondition পূরণ করা হয় (ইনপুট সমান), ত্রুটি বার্তা উইজেটটি HIDDEN এ সেট করা হয় এবং প্রদর্শিত হয় না।

এখানে অ্যাপ্লিকেশন কোড এবং JSON ম্যানিফেস্ট ফাইলের উদাহরণ দেওয়া হল:

অ্যাপস স্ক্রিপ্ট

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 ম্যানিফেস্ট ফাইল

{
  "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"
          }
        }
      ]
    }
  }
}

সমর্থিত CEL বৈধতা উইজেট এবং ক্রিয়াকলাপ

CEL যাচাইকরণ সমর্থন করে এমন কার্ড উইজেট

নিম্নলিখিত উইজেটগুলি CEL যাচাইকরণ সমর্থন করে:

  • TextInput
  • SelectionInput
  • DateTimePicker

সমর্থিত CEL বৈধতা কার্যক্রম

  • পাটিগণিতের ক্রিয়াকলাপ
    • + : দুটি int64 , uint64 , অথবা double সংখ্যা যোগ করে।
    • - : দুটি int64 , uint64 , অথবা double সংখ্যা বিয়োগ করে।
    • * : দুটি int64 , uint64 , অথবা double সংখ্যাকে গুণ করে।
    • / : দুটি int64 , uint64 , অথবা double সংখ্যা (পূর্ণসংখ্যা ভাগ) ভাগ করে।
    • % : দুটি int64 বা uint64 সংখ্যার মডুলো গণনা করে।
    • - : একটি int64 বা uint64 নম্বরকে অস্বীকার করে।
  • লজিক্যাল অপারেশন:
    • && : দুটি বুলিয়ান মানের উপর একটি লজিক্যাল AND অপারেশন সম্পাদন করে।
    • || : দুটি বুলিয়ান মানের উপর একটি লজিক্যাল OR অপারেশন সম্পাদন করে।
    • ! : একটি বুলিয়ান মানের উপর একটি লজিক্যাল NOT অপারেশন সম্পাদন করে।
  • তুলনামূলক কার্যক্রম:
    • == : দুটি মান সমান কিনা তা পরীক্ষা করে। সংখ্যা এবং তালিকা সমর্থন করে।
    • != : দুটি মান সমান কিনা তা পরীক্ষা করে। সংখ্যা এবং তালিকা সমর্থন করে।
    • < : প্রথম int64 , uint64 , অথবা double সংখ্যাটি দ্বিতীয়টির চেয়ে ছোট কিনা তা পরীক্ষা করে।
    • <= : প্রথম int64 , uint64 , অথবা double সংখ্যাটি দ্বিতীয়টির চেয়ে কম বা সমান কিনা তা পরীক্ষা করে।
    • > : প্রথম int64 , uint64 , অথবা double সংখ্যাটি দ্বিতীয়টির চেয়ে বড় কিনা তা পরীক্ষা করে।
    • >= : প্রথম int64 , uint64 , অথবা double সংখ্যাটি দ্বিতীয়টির চেয়ে বড় বা সমান কিনা তা পরীক্ষা করে।
  • তালিকা কার্যক্রম:
    • in : একটি তালিকাতে একটি মান উপস্থিত আছে কিনা তা পরীক্ষা করে। সংখ্যা, স্ট্রিং এবং নেস্টেড তালিকা সমর্থন করে।
    • size : একটি তালিকার আইটেমের সংখ্যা প্রদান করে। সংখ্যা এবং নেস্টেড তালিকা সমর্থন করে।

অসমর্থিত CEL যাচাইকরণ পরিস্থিতি

  • বাইনারি অপারেশনের জন্য ভুল আর্গুমেন্ট সাইজ : বাইনারি অপারেশনের জন্য (উদাহরণস্বরূপ, add_int64 , equals) ঠিক দুটি আর্গুমেন্ট প্রয়োজন। ভিন্ন সংখ্যক আর্গুমেন্ট প্রদান করলে একটি ত্রুটি দেখা দেবে।
  • ইউনারি অপারেশনের জন্য ভুল আর্গুমেন্ট সাইজ : ইউনারি অপারেশনের (উদাহরণস্বরূপ, negate_int64 ) জন্য ঠিক একটি আর্গুমেন্ট প্রয়োজন। ভিন্ন সংখ্যক আর্গুমেন্ট প্রদান করলে একটি ত্রুটি দেখা দেবে।
  • সংখ্যাসূচক ক্রিয়াকলাপে অসমর্থিত প্রকার : সংখ্যাসূচক বাইনারি এবং ইউনারি ক্রিয়াকলাপ শুধুমাত্র সংখ্যা আর্গুমেন্ট গ্রহণ করে। অন্যান্য প্রকার (যেমন, বুলিয়ান) প্রদান করলে একটি ত্রুটি দেখা দেবে।

সার্ভার-সাইড যাচাইকরণ

সার্ভার-সাইড ভ্যালিডেশনের মাধ্যমে, আপনি আপনার স্টেপের কোডে onSaveFunction() নির্দিষ্ট করে সার্ভার-সাইড লজিক চালাতে পারেন। যখন ব্যবহারকারী স্টেপের কনফিগারেশন কার্ড থেকে দূরে সরে যায়, তখন onSaveFunction() চলে এবং আপনাকে ব্যবহারকারীর ইনপুট যাচাই করতে দেয়।

যদি ব্যবহারকারীর ইনপুট বৈধ হয়, তাহলে saveWorkflowAction ফেরত দিন।

যদি ব্যবহারকারীর ইনপুট অবৈধ হয়, তাহলে একটি কনফিগারেশন কার্ড ফেরত দিন যা ব্যবহারকারীকে একটি ত্রুটি বার্তা প্রদর্শন করে যা ত্রুটিটি কীভাবে সমাধান করতে হয় তা ব্যাখ্যা করে।

যেহেতু সার্ভার-সাইড ভ্যালিডেশন অ্যাসিঙ্ক্রোনাস, ব্যবহারকারী তাদের ফ্লো প্রকাশ না করা পর্যন্ত ইনপুট ত্রুটি সম্পর্কে জানতে নাও পারেন।

ম্যানিফেস্ট ফাইলে প্রতিটি যাচাইকৃত ইনপুটের id অবশ্যই কোডে থাকা একটি কার্ড উইজেটের name সাথে মিলবে।

নিম্নলিখিত উদাহরণটি যাচাই করে যে একটি ব্যবহারকারীর টেক্সট ইনপুটে "@" চিহ্ন রয়েছে:

ম্যানিফেস্ট ফাইল

ম্যানিফেস্ট ফাইলের অংশটি "onSave" নামের একটি onSaveFunction() নির্দিষ্ট করে:

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"
          }
        }
      ]
    }
  }
}

অ্যাপ্লিকেশন কোড

ধাপের কোডে onSave() নামক একটি ফাংশন রয়েছে। এটি যাচাই করে যে ব্যবহারকারী-ইনপুট করা স্ট্রিংটিতে @ রয়েছে। যদি এটি থাকে, তবে এটি ফ্লো ধাপটি সংরক্ষণ করে। যদি এটি না থাকে, তবে এটি একটি কনফিগারেশন কার্ড ফেরত পাঠায় যেখানে ত্রুটিটি কীভাবে ঠিক করতে হবে তা ব্যাখ্যা করে একটি ত্রুটি বার্তা রয়েছে।

অ্যাপস স্ক্রিপ্ট

/**
 * 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);
  }
}