関数を使用すると、一連の操作をプログラムし、アプリケーションから呼び出されたときに実行できます。関数を使用して、プロセスを自動化したり、Zoho や他の外部アプリケーションと連携したりできます。
Qntrl の関数では、使い慣れた言語で独自のスクリプトを作成できます。これらはサーバーレス関数であり、クラウドプロバイダーがマシンリソースを動的に割り当てます。コードの実行時にサーバー管理を気にすることなく、Qntrl でコードを作成できます。
Qntrl では、関数の作成に複数のプログラミング言語を使用できます。
Zoho Deluge
JavaScript
Python
Python 3
Java
Node.js
対応言語は、選択したタブ種別によって異なります。
|
タブ種別 |
目的 |
対応言語 |
|
カード |
カード項目のロジックまたはビジネスルールを自動化 |
Zoho Deluge(のみ) |
|
スタンドアロン |
手動で起動する、または Circuits/スケジュールで使用するカスタムスクリプト |
Deluge、Java、Python、Python 3、Node.js、JavaScript |
|
Webサービス REST |
受信および送信の REST API 呼び出しで使用 |
JavaScript |
|
Webサービス SOAP |
受信および送信の SOAP API 呼び出しで使用 |
JavaScript |
エディターを開いたら、次の手順を実行します。
選択した言語を使用してロジックを記述します。
右側のパネルで必要なパラメーターを設定します。
関数の準備が完了し、パラメーターを設定したら、[保存]をクリックして関数を保存します。
サンプル入力でテストするには、[保存して実行]をクリックします。
エラーがない場合、入力ダイアログが開きます。
関数を実行するたびに、その関数にいくつかの値が渡されます。これらの値は引数と呼ばれます。ダイアログで関数の実行に使用する引数を指定し、[実行]をクリックします。
関数が実行され、実行ステータスダイアログボックスに出力が表示されます。この出力には次の2つのキーが含まれます。
Outputキーには、出力データである値が含まれます。
Logキーには、ユーザーがステートメントを使用して出力したログデータが含まれます。
[デプロイ]をクリックして公開し、使用できるようにします。
関数をCircuits内で使用できるようにするには、先にデプロイする必要があります。関数の一覧で、対象の関数にカーソルを合わせ、操作メニュー(...)をクリックします。
次の操作を利用できます。
[編集]:関数の名前と設定を変更します。
[プレビュー]:エディターを開かずに関数のコードを表示します。
[REST API]:OAuth認証情報で保護されたREST APIリンクにアクセスします。
[削除]:システムから関数を完全に削除します。
Deluge関数は、Qntrlのネイティブスクリプト言語です。外部パッケージは不要です。Qntrlで設定し、Circuits、ワークフロー、ビジネスルール、スケジュール、オーケストレーションに関連付けたり、単独の関数として使用したりできます。Zoho Delugeの詳細をご参照ください。
関数は、公開されているipinfo.io APIを呼び出し、IPアドレスに基づいてクライアントの位置情報の詳細を取得します。
APIは、IP、都市、地域、国、緯度・経度座標、組織/ISPなどの情報を返します。
関数はこれらの値を抽出して表示し、次のような用途でさらに使用できるようにします。
位置情報に基づくパーソナライズ(言語、通貨、オファー)。
不正検出(通常とは異なる地域からの不審なログイン)。
ユーザーアクセスのログ記録と監査。
リクエストが失敗した場合、デバッグ用にエラーメッセージがログに記録されます。
Delugeコードスニペットの例
void getUserGeoInfo() { api_url = 'https://ipinfo.io/json';response = invokeurl [ url : api_url type : GET ]; try { ip = response.get('ip'); city = response.get('city'); region = response.get('region'); country = response.get('country'); org = response.get('org'); loc = response.get('loc'); info 'IP: ' + ip; info 'Location: ' + city + ', ' + region + ', ' + country; info 'Coordinates: ' + loc; info 'ISP/Org: ' + org; } catch (e) { info 'Error getting IP info: ' + e.toString(); } }
早期アクセス
この機能はすべてのユーザーに対して有効になっているわけではありません。お試しになりたい場合は、メールでサポートチームに早期アクセスを依頼してください。
この関数は、指定したパスに新しいフォルダーを作成し、指定された内容のファイルをアップロードすることで、Qntrlでのファイル管理を自動化します。
function execute(data) { try { let jsonData = JSON.parse(data); if (!jsonData.folderName || !jsonData.filePath || !jsonData.fileContent) { console.error('Incomplete data provided.'); return JSON.stringify({ success: false, message: 'Incomplete data provided.' }); } let folderCreationResponse = OntrlFile.createFolder(jsonData.folderName, jsonData.filePath); folderCreationResponse .ifFailed(message => { console.error('Failed to create フォルダー:', message); return JSON.stringify({ success: false, message: 'Failed to create フォルダー.' }); }) .ifSuccess(() => { console.log('フォルダー created successfully.'); let file = new File([jsonData.fileContent], 'uploaded_file.txt', { type: 'text/plain' }); let uploadResult = OntrlFile.upload(file, { path: jsonData.filePath + '/' + jsonData.folderName, overwrite: true }); console.log('Upload Result:', uploadResult); return JSON.stringify({ success: true, message: 'フォルダー created and file uploadedsuccessfully.' });}); } catch (error) { console.error('Error during execution:', error); return JSON.stringify({ success: false, message: 'Error during execution.' }); } }
入力例
{ 'folderName': 'ProjectDocs', 'filePath': '/user/uploads', 'fileContent': 'Initial project requirements and specifications.' }
実行に成功すると、成功メッセージが表示され、ファイルが新しく作成したフォルダーにアップロードされます。実行に失敗した場合は、エラーメッセージが表示されます。
Node.js関数は、Qntrlで自動パッケージ化のサポートを利用して作成、設定できます。これらの関数は、ワークフロー、ビジネスルール、スケジュール、オーケストレーションに関連付けたり、単体の関数として使用したりできます。
この関数は、ユーザーが入力した値が適切なメール形式かどうかを検証します。以降の処理に進む前に、正しい構造のメールアドレスのみが受け付けられるようにします。これは、ワークフロー、フォーム、ユーザーオンボーディングでの入力検証に特に役立ちます。
仕組み:
タブ.exports = async function(context, basicIO) { const input = basicIO.getParameter('メール'); if(input === null) { basicIO.write(' provide a メール paramter'); return; } const メール = input.toString().trim(); const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; const isValid = emailRegex.test(メール); if (isValid) { basicIO.write('Valid メール: ' + メール); context.log.INFO('Validated メール: ' + メール); } else { basicIO.write('Invalid メール format.'); context.log.INFO('メール validation failed for input: ' + メール); } }
入力本文は、コードで使用される引数の値を含むJSONオブジェクトである必要があります。
実行すると、指定されたメール形式が検証され、メールを含む成功メッセージ、または形式が無効な場合はエラーメッセージが返されます。
Pythonで関数を作成し、ワークフロー、ビジネスルール、スケジュール、オーケストレーションに関連付けたり、スタンドアロンのロジックとして使用したりできます。コードはPython 2環境で実行されます。Python 2でサポートされている機能を使用する場合は、Python 2の構文に従ってください。
この関数は、ユーザーが入力したパスワードの強度を検証します。パスワードが、最小文字数、大文字と小文字、数字、特殊文字の使用といった標準的なセキュリティ要件を満たしていることを確認します。これは、ワークフローでパスワードポリシーを適用する場合やユーザーオンボーディング時に役立ちます。
仕組み。
インポート re def check_password_strength(password): # Define regular expression patterns for strong passwords has_uppercase = re.compile(r'[A-Z]') has_lowercase = re.compile(r'[a-z]') has_number = re.compile(r'[0-9]') has_special = re.compile(r'[!@#$%^&*()_+{}\[\]:';\'<>?,./]') # Check if password meets all requirements if (has_uppercase.search(password) and has_lowercase.search(password) and has_number.search(password) and has_special.search(password) and len(password) >= 8): return True return False def runner(context, basicI0): password = basicI0.getParameter('password') is_strong = check_password_strength(password) basicI0.write(str(is_strong))
パッケージ済みファイル。
設定キー
path:関数コードを含む.jsファイルのパスです。
action:コードが実行するアクションを含みます。これは、.jsファイル内のメインクラス名でもあります。
connector:関数が呼び出す接続名を含みます(該当する場合)。
入力本文は、以下に示すように、コードで使用される引数の値を含むJSONオブジェクトである必要があります。
入力例
{
'password': 'James@19189#'}
関数が実行され、コンソールにレスポンスが表示されます。
Java関数では強い型付けを使用でき、より構造化された自動化に適しています。
Javaで関数をコーディングし、ワークフロー、ビジネスルール、スケジュール、オーケストレーション、サーキットに関連付けたり、スタンドアロン関数として使用したりできます。
この関数は、外部APIから取得したリアルタイムの為替レートを使用して、通貨間で金額を換算します。ワークフロー内で迅速な財務計算を自動化でき、手動で換算する手間を省けます。たとえば、企業は取引中にINR建ての請求書を即座にUSD相当額に換算できます。
Javaコードスニペットの例
インポート com.zoho.cloud.function.Context; インポート com.zoho.cloud.function.basic.*; インポート java.io.BufferedReader; インポート java.io.InputStreamReader; インポート java.io.OutputStream; インポート java.net.HttpURLConnection; インポート java.net.URL; インポート org.json.JSONObject; public class Java_doc1 implements ZCFunction { public void runner(Context context, BasicIO basicIO) throws Exception { String from = (String) basicIO.getParameter('from'); String to = (String) basicIO.getParameter('to'); String amountStr = (String) basicIO.getParameter('amount'); if (from == null || to == null || amountStr == null) { basicIO.write('Missing parameters: 'from', 'to', or 'amount'.'); return; } double amount; try { amount = Double.parseDouble(amountStr); } catch (NumberFormatException e) { basicIO.write('Invalid amount. Please enter a valid number.'); return; } // Call exchange rate API String apiUrl = String.format('https://free.ratesdb.com/v1/rates?from=%s&to=%s', from, to); URL url = new URL(apiUrl); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod('GET'); conn.setRequestProperty('User-Agent', 'Java'); int responseCode = conn.getResponseCode(); if (responseCode != 200) { basicIO.write('Failed to fetch exchange rate. HTTP code: ' + responseCode); return; } BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String inputLine; StringBuffer responseData = new StringBuffer(); while ((inputLine = in.readLine()) != null) { responseData.append(inputLine); } in.close(); // Parse JSON response JSONObject json = new JSONObject(responseData.toString()); JSONObject rates = json.getJSONObject('data').getJSONObject('rates'); if (!rates.has(to)) { basicIO.write('Exchange rate not available for currency: ' + to); return; } double rate = rates.getDouble(to); double convertedAmount = amount * rate; String result = String.format('%.2f %s = %.2f %s', amount, from, convertedAmount, to); basicIO.write(result); } }
lib フォルダーには .jar ファイルのみアップロードできます。
アップロードできるファイルのサイズは 10MB までです。
関数の引数を本文で渡すには、以下のコードを使用します。
サンプル入力
{ 'from': 'INR','to': 'USD','amount': '100'}
関数が実行され、コンソールにレスポンスが表示されます。
1つの関数につきアップロードできる zip ファイルは1つのみです。
zip ファイルの最大サイズは 10MB です。
関数を Python で記述し、ワークフロー、ビジネスルール、スケジュール、オーケストレーションに関連付けるか、単独のロジックとして使用できます。コードは Python 3 環境のバージョン 3.9.16 で実行されます。Python 3 でサポートされている機能を使用する場合は、Python 3 の構文に従ってください。
この関数は、長さ、大文字/小文字、数字、特殊文字などの一般的なセキュリティ基準を満たしているかを確認し、指定されたパスワードの強度を評価します。
動作の仕組み。
ユーザーがパスワードを入力します。
関数は次の基準を確認します。
8文字以上
1文字以上の大文字
1文字以上の小文字
1文字以上の数字
1文字以上の特殊文字(!@#$%^&*(),.?':{}|<>)
評価結果に基づいて、次の内容を返します。
強いパスワード:すべての条件を満たしている場合。
中程度のパスワード:一部の条件を満たしていない場合。
エラーメッセージ:不足している内容を示します。
パスワードが弱い場合、関数はランダムに生成された安全なパスワードを提案します。
Python 3 コードスニペットのサンプル
インポート re インポート secrets インポート string def runner(context, basicIO): context.log.INFO('log') password = basicIO.getParameter('password'); basicIO.write(check_password_strength(password)); def check_password_strength(password: str) -> None: strength = 0 if len(password) >= 8: strength += 1 else: return 'Password should be at least 8 characters long.' if re.search(r'[A-Z]', password): strength += 1 else: return 'Password should include at least one uppercase letter.' if re.search(r'[a-z]', password): strength += 1 else: return 'Password should include at least one lowercase letter.' if re.search(r'\d', password): strength += 1 else: return 'Password should include at least one digit.' if re.search(r'[!@#$%^&*(),.?':{}|<>]', password): strength += 1 else: return 'Password should include at least one special character (!@#$%^&*(),.?\':{}|<>)' if strength == 5: return 'Strong password!' elif 3 <= strength < 5: return 'Moderate password. Try to include all types of characters.' else: basicIO.write('Weak password. Consider using a stronger one.') suggestion = generate_secure_password() basicIo.write(f'Suggested strong password: {suggestion}') def generate_secure_password(length: int = 12) -> str: characters = string.ascii_letters + string.digits + '!@#$%^&*()?' return ''.join(secrets.choice(characters) for _ in range(length)) if __name__ == '__main__': pwd = input('Enter a password to check its strength: ') check_password_strength(pwd)
パッケージ化されたファイル。
Qntrl は Python 関数を自動的にパッケージ化し、config.json とライブラリファイルを作成します。
左側のパネルで、config.json と libファイルを確認できます。
config.json は設定ファイルです
lib はサードパーティ製パッケージをアップロードできるライブラリです。ファイルをアップロードするには、フォルダーを右クリックします。
次のキーの値を指定します。
path:関数コードを含む .js ファイルのパスです。
action:コードが実行するアクションが含まれます。これは、.js ファイル内のメインクラス名でもあります。
connector:関数が呼び出す接続名がある場合、その名前が含まれます。
関数の引数を本文で渡すには、以下のコードを使用します。
サンプル入力
'password': 'sweri025377A'
関数はCircuitsおよびSchedulesで使用できます。
対応している任意の言語で記述できます。
使用するにはデプロイが必要です。
[クライアントから呼び出し可能]:有効にすると、ブラウザー、ウィジェット、その他のバックエンド関数からこの関数を呼び出せます。無効にすると、バックエンド関数からのみ呼び出せます。
エディターでキーと値のパラメーターを手動で定義します。
これらの値は実行時に渡されます。
各関数は、使用する言語に応じた特定のフォルダー構成でパッケージ化する必要があります。
選択した言語に応じて、デプロイパッケージは次の構成にする必要があります。
Java
FunctionName(ルートフォルダー)
|
|---- FunctionName.java // ランナーファイル
|---- lib // 依存関係の.jarファイル用フォルダー
|---- <依存関係の.jarファイル>
|---- classes // パッケージ構成内のコンパイル済みクラスファイル
|---- <パッケージ構成に従った依存関係のコンパイル済み.classファイル>
ルートフォルダー直下(パッケージ内ではない場所)に配置された.javaファイルもコンパイルされます。
カスタムIDEを使用してJava関数をビルドするには、次のzc-server-sdk-core.jarファイルをダウンロードして、プロジェクト設定に含めます。
Node.js
FunctionName(ルートフォルダー)
|
|---- FunctionName.js // ランナーファイル
|---- node_modules // 依存関係フォルダー
|-- <依存関係のjsファイルとフォルダー>
|
|---- FunctionName.py // ランナーファイル
|---- <依存関係の.pyファイル> // 追加のタブまたはスクリプト
関数にサードパーティ製ライブラリーを含めるには、対応言語について以下で説明する拡張デプロイ構成に従います。
Java(依存関係あり)
FunctionName(ルートフォルダー)
|
| - - - - FunctionName.java // メインランナーファイル
| - - - - config.json // 関数の設定
| - - - - lib // サードパーティ製JAR
| - - - - <依存関係の.jarファイル>
| - - - - classes
| - - - - <パッケージ構成に従った依存関係のコンパイル済み.classファイル>
FunctionName.java:関数のエントリーポイントです。複数のランナーファイルを定義し、config.jsonで設定できます。
config.json:関数のメタデータと実行設定が含まれます。
lib/:すべてのサードパーティ製.jarファイルをこちらに配置します。
classes/:Javaのパッケージ構成に従って、コンパイル済み.classファイルを追加します。
NodeJS(依存関係あり)
FunctionName(ルートフォルダー)
|
| - - - - FunctionName.js // メインランナーファイル
| - - - - config.json // 関数設定
| - - - - node_modules // インストール済みの依存関係
| - - - - <サードパーティータブ>
ファイルの説明。
FunctionName.js:ロジックを実行する主なスクリプトです。ユーザーは複数のランナーを追加でき、config.jsonで設定できます。
config.json:ランナーと実行パラメーターの定義に使用します。
node_modules/:必要なすべてのサードパーティーの依存関係を格納するディレクトリーです。
Python/Python 3(依存関係あり)
FunctionName(ルートフォルダー)
|
| - - - - FunctionName.py // メインランナーファイル
| - - - - config.json // 関数設定
| - - - - lib // サードパーティーライブラリー
| - - - - <サードパーティータブ>
ファイルの説明。
FunctionName.py:ロジックを実行する主なスクリプトです。ユーザーは複数のランナーを追加でき、config.jsonで設定できます。
config.json:ランナー設定と依存関係を定義します。
lib/:関数で使用される追加のPythonタブが含まれます。
Webサービス用に作成された関数はJavaScriptのみをサポートし、次で使用されます。
受信/送信REST API
受信/送信SOAP API
スクリプトの作成にはCodex SDKを使用し、スキーマの参照にはCodexのドキュメントを参照してください。
主な設定。
タブの種類はWeb Service RESTまたはWeb Service SOAPに設定する必要があります。
スコープ(admin/user)は実行権限を定義します。