הגדרת משתנה דינמי

במאמר הזה נסביר איך ליצור משתנה דינמי.

אם אפשר, צריך להגדיר משתנה באופן סטטי בקובץ המניפסט כמשתנה קלט או כמשתנה פלט. עם זאת, יש מצבים שבהם נדרש משתנה שאפשר להגדיר רק כשהמשתמש מגדיר את התהליך, כי אופי הקלט משתנה. לדוגמה, אי אפשר לקבוע את מספר השאלות והתשובות (והתוכן שלהן) בטופס Google Forms עד שבוחרים טופס ספציפי במהלך הגדרת התהליך.

משתנים דינמיים מאפשרים לטפל במקרים האלה על ידי הגדרת קלט שמפיק קבוצה דינמית של פלטים בקובץ המניפסט ובקוד של השלב.

הגדרת משתנה הפלט בקובץ המניפסט

בקובץ המניפסט, פועלים לפי השלבים הבאים:

  • ב-inputs[], מציינים משתנה קלט שמקבל ערך קלט דינמי.

  • ב-outputs[], מציינים משתנה פלט שמחזיר קבוצה דינמית של משתני פלט. הפלט הזה הוא dataType של "workflowResourceDefinitionId": "dynamic_resource_id".

  • מגדירים משאב מותאם אישית לטיפול במשתנה הדינמי. צריך לציין את workflowResourceDefinitions עם "resourceType": "DYNAMIC" וגם "providerFunction": "onDynamicProviderFunction". הערך של id חייב להיות זהה לערך של workflowResourceDefinitionId שמוגדר ב-outputs[]. מידע נוסף על משאבים מותאמים אישית זמין במאמר הגדרת משאב מותאם אישית.

  • מגדירים את dynamicResourceDefinitionProvider לשם של פונקציה תואמת בקוד של השלב, בדוגמה הזו onDynamicDefinitionFunction(), שמגדירה ומחזירה כרטיס הגדרה שמקבל ערך קלט דינמי ומחזיר משאב מותאם אישית.

JSON

"flows": {
  "workflowElements" : [{
    "id": "getDynamicVariable",
    "state": "ACTIVE",
    "name": "Get Dynamic Variable",
    "description": "Get Dynamic Variable",
    "workflowAction": {
    "inputs": [
      {
          "id": "dynamic_resource_input",
          "description": "Dynamic Resource Input",
          "cardinality": "SINGLE",
          "dataType": {
            "basicType": "STRING"
          }
       }
      ],
      "outputs": [
        {
          "id": "dynamic_resource_output",
          "description": "Dynamic Data",
          "cardinality": "SINGLE",
          "dataType": {
            "resourceType": {
              "workflowResourceDefinitionId": "dynamic_resource_id"
            }
          }
        }
      ],
      "onConfigFunction": "onDynamicVariableConfigFunction",
      "onExecuteFunction": "onDynamicVariableExecuteFunction"
    }
  }],
  "workflowResourceDefinitions": [{
    "id": "dynamic_resource_id",
    "name": "Dynamic Resource",
    "providerFunction": "onDynamicProviderFunction",
    "resourceType" : "DYNAMIC"
  }],
  "dynamicResourceDefinitionProvider" : "onDynamicDefinitionFunction",
}

הגדרת משתנה הפלט בקוד

הקוד של השלב כולל את הפונקציות הבאות:

  • onDynamicVariableConfigFunction(), שיוצרת ומחזירה כרטיס הגדרה עם ווידג'ט קלט דינמי. השם של הפונקציה הזו צריך להיות זהה לערך של onConfigFunction() בקובץ המניפסט. השם של הווידג'ט של הקלט הדינמי חייב להיות זהה לערך id שמוגדר בקובץ המניפסט. ווידג'ט הקלט הדינמי הזה מאפשר למשתמשים להגדיר משתנה דינמי כשהם מגדירים את התהליך, כמו בחירת טופס Google.
  • onDynamicVariableExecuteFunction(), שמחזירה את נתוני המשתנה הדינמי כפלט כשהשלב מופעל. השם של הפונקציה הזו צריך להיות זהה לערך של onExecuteFunction() בקובץ המניפסט. הערך variableId של returnOutputVariablesAction צריך להיות זהה לערך id של משתנה הפלט שמוגדר בקובץ המניפסט. המשאב הדינמי נמצא באובייקט של אירוע הזרימה בכתובת e.workflow.resourceFieldsDefinitionRetrieval. הקלט לא יכול להפנות למשתנים כי כל הקלטים של משאב דינמי צריכים להיות זמינים בזמן ההגדרה.
  • onDynamicDefinitionFunction(), שמחלץ את נתוני המשתנה הדינמי מאובייקט אירוע הזרימה, במיוחד resourceFieldsDefinitionRetrieval, ומחזיר את resourceFieldsDefinitionRetrievedAction שמספק את הנתונים בפורמט JSON שניתן לשימוש כפלט לשלבים הבאים. הערך של resourceId צריך להיות זהה לערך של id של פריט במערך workflowResourceDefinitions[] שמוגדר בקובץ המניפסט.
  • onDynamicProviderFunction(), שמאחזר את המשתנה הדינמי מאובייקט אירוע הזרימה ב-e.workflow.resourceRetrieval.resourceReference.resourceId ומחזיר JSON כפלט לשלבים הבאים.

Apps Script

function onDynamicVariableConfigFunction() {
  var card = {
    "sections": [
      {
        "widgets": [
          {
            "textInput": {
              "name": "dynamic_resource_input",
              "label": "Dynamic Resource Input",
            }
          },
        ]
      }
    ]
  };
  return {
    "action": {
      "navigations": [{
        "push_card": card
      }]
    }
  };
}

function onDynamicVariableExecuteFunction(){
  var dynamic_resource_id = uuidv4();
  return {
    "hostAppAction": {
      "workflowAction": {
        "returnOutputVariablesAction": {
          "variableValues": [{
            "variableId": "dynamic_resource_output",
            "variableData": {
              "resourceReferences" : [ dynamic_resource_id ]
            }
          }]
        }
      }
    }
  };
}

function onDynamicDefinitionFunction(e) {
  var input_value = e.workflow.resourceFieldsDefinitionRetrieval.inputs.dynamic_resource_input.stringValues[0];
  // input_value == "dynamic_resource_input"

  return {
    "hostAppAction": {
      "workflowAction": {
        "resourceFieldsDefinitionRetrievedAction": {
          "dynamicResourceDefinitions": [{
            "resourceId": "dynamic_resource_id",
            "fields": [{
                "selector":  "question_1",
                "displayText": "Question 1"
            },{
                "selector":  "question_2",
                "displayText": "Question 2"
            },{
                "selector":  "question_3",
                "displayText": "Question 3"
            }]
          }]
        }
      }
    }
  };
}

function onDynamicProviderFunction(e) {
  var resourceId = e.workflow.resourceRetrieval.resourceReference.resourceId;
  // resourceId == uuidv4();

  var workflowResourceDefinitionId = e.workflow.resourceRetrieval.resourceReference.resourceType.workflowResourceDefinitionId;
  // workflowResourceDefinitionId == "dynamic_resource_id"

  return {
    "hostAppAction": {
      "workflowAction": {
        "resourceRetrievedAction": {
          "resourceJson": JSON.stringify({
            "question_1": "Answer 1",
            "question_2": "Answer 2",
            "question_3": "Answer 3",
          })
        }
      }
    }
  };
}