Workato：Connector SDKでユーティリティコネクタを開発してWorkatoを便利に活用する


# はじめに

WorkatoにはConnector SDKというカスタムコネクタを開発する機能があります。この機能を利用することで、カスタムコネクタを開発し、レシピでそのコネクタを使用することが出来ます。

カスタムコネクタは、主にWorkatoが標準で提供していないアプリケーション向けの連携コネクタを開発する際に使用されますが、連携コネクタだけでなくユーティリティコネクタの開発にも活用ができます。

# ユーティリティコネクタのユースケース

ユーティリティコネクタの開発を検討している方や開発に興味のある方は、Workatoをより活用したい、Workato開発を効率的に行いたい（開発を楽にしたい）という方であろうと思います。例えば、次のようなものがユースケースとして挙げられます。

- 関数（formula）で提供される機能をコネクタ化してレシピ開発の敷居を下げる
- 複雑なformulaの処理をコネクタ化して使いやすくする
- よく使う処理をコネクタ化して使いやすくする（例えば文字列処理や日付・時刻処理など）
- Rubyコネクタ等のローコード系コネクタで開発したユーティリティ機能をコネクタ化して汎用する
- 複数ステップに亘る複雑なデータ処理をコネクタ化して１ステップに収め、かつ処理を汎用化する等

# ユーティリティコネクタ開発

以下では、ユーティリティコネクタの開発のポイントと、サンプルコードを紹介します。

## 開発のポイント

Connector SDKでカスタムコネクタを開発する際は、通常は `Connection` と `test` を定義します。しかし、ユーティリティコネクタはアプリケーションとの連携を行わず単独で動作するコネクタであるため、`Connection`と`test`の定義は不要ですので、当該箇所については以下のようにコードを記述します。

```ruby
  connection: {},
  
  test: lambda do |_connection|
    ""
  end,
```

## サンプルコード

以下に紹介するカスタムコネクタのサンプルコードでは、文字列の置換処理をコネクタとして提供します。

文字列置換は `gsub` 関数を利用することで対応は可能ですが、レシピ開発に取り組む方が関数に不慣れな場合は、関数の利用がハードルとなります。しかし、文字列置換処理をコネクタとして提供することで、視覚的に文字列置換が行えるようになるため、関数に不慣れな方がWorkatoの活用を進めるうえでは有効な対応となります。

また、このコネクタでは、単純な文字列置換だけでなく、複数回の文字列置換や正規表現による文字列置換、前後空白の除去も提供します。基本的な処理だけでなく応用的な処理にも対応することで活用の幅が拡がり、Workatoの利活用促進にもつながります。


```ruby
{
  title: "Value replacer",
  
  connection: {},
  
  test: lambda do |_connection|
    ""
  end,

  object_definitions: {
    input_value_field: {
      fields: lambda do
        [
          {name: "value", label: "Value", type: "string", optional: false},
          {name: "replace_conditions", label: "Replace conditions", type: "array", of: "object", optional: false, sticky: true, list_mode: "static", properties: [
            {name: "replace_from", label: "Replace from", type: "string", optional: false, sticky: true},
            {name: "replace_to", label: "Replace to", type: "string", optional: false, sticky: true},
            {name: "enable_regexp", label: "Use RegExp", type: "boolean", control_type: "checkbox", optional: false, default: false},
            {name: "enable_lstrip", label: "Remove leading whitespace", type: "boolean", control_type: "checkbox", optional: false, sticky: true, default: false},
            {name: "enable_rstrip", label: "Remove trailing whitespace", type: "boolean", control_type: "checkbox", optional: false, sticky: true, default: false}  
          ]}
        ]
      end
    }
  },

  custom_action: false,

  custom_action_help: {},

  actions: {
    replace_value: {
      title: "Replace value",
      subtitle: "",
      description: "",
      help: "",
      input_fields: lambda do |object_definitions|
        object_definitions['input_value_field']
      end,
      execute: lambda do |_connection, input, _input_schema, _output_schema|
        result = call(:replace_value, { 
          value: input[:value],
          replace_conditions: input[:replace_conditions]
        })
        {value: result}
      end,
      output_fields: lambda do |object_definitions|
        [
          {name: "value", label: "Value", type: "string"}
        ]
      end
    }
  },

  
  
  triggers: {},

  pick_lists: {},

  methods: {
    replace_value: lambda do |input|
      replace_conditions = input[:replace_conditions]
      res = input[:value]

      if ! res.blank? && ! replace_conditions.blank?
        replace_conditions.each{|condition|
          replace_from = condition['replace_from'].blank? ? '' : condition['replace_from']
          replace_to = condition['replace_to'].blank? ? '' : condition['replace_to']
          enable_regexp = condition['enable_regexp']
          enable_lstrip = condition['enable_lstrip']
          enable_rstrip = condition['enable_rstrip']

          if ! replace_from.blank?
            
            if enable_regexp === 'true'
              res = res.gsub(/#{replace_from}/, "#{replace_to}")
            end
      
            if enable_regexp === 'false'
              res = res.gsub("#{replace_from}", "#{replace_to}")
            end

          end
          if enable_lstrip === 'true'
            res = res.lstrip
          end
    
          if enable_rstrip === 'true'
            res = res.rstrip
          end
        }
      end

      res
    end,      

  }
}
```

# 最後に

ユーティリティコネクタ開発は、簡単なRubyのスキルは必要ではありますが、アプリケーションの連携を考えることなく開発できるため、すぐに取り組むことができます。

Connector SDK（カスタムコネクタ開発）に興味あるけどなかなか取り組むきっかけがない、アプリケーション連携のためのコネクタ開発は敷居が高いと感じている方は、まずはユーティリティコネクタの開発から始められることをお薦めします。