関数を使用すると、一連の処理をプログラムし、アプリケーションから呼び出されたときに実行できます。関数を使用して、プロセスを自動化したり、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 Service REST |
受信および送信のREST API呼び出しで使用 |
JavaScript |
|
Web Service SOAP |
受信および送信のSOAP API呼び出しで使用 |
JavaScript |
関数のソースコード、設定ファイル、外部依存関係を含むZIPファイルをアップロードすることで、クラウド関数を作成できます。これにより、完全な関数パッケージを1回のアップロードでデプロイできます。
メモ:
ZIPファイルは、有効で空ではない.zipファイルである必要があります。
対応している最大ファイルサイズは50MBです。
アップロードされたファイルは、デプロイ前に検証およびセキュリティスキャンされます。
ZIPパッケージは、言語固有のフォルダー構造に従う必要があります。
エディターを開いたら、次の手順を実行します。
選択した言語でロジックを記述します。
右側のパネルで必要なパラメーターを設定します。
関数の準備とパラメーターの設定が完了したら、[保存]をクリックして関数を保存します。
サンプル入力でテストするには、[保存して実行]をクリックします。
エラーがない場合、入力ダイアログが開きます。
関数を実行するたびに、関数にはいくつかの値が渡されます。これらの値は引数と呼ばれます。ダイアログで関数の実行に使用する引数を指定し、[実行]をクリックします。
関数が実行され、実行ステータスダイアログボックスに出力が表示されます。この出力には次の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'}
関数が実行され、コンソールにレスポンスが表示されます。
関数ごとにアップロードできるzipファイルは1つのみです。
zipファイルの最大許容サイズは10MBです。
関数をPythonで記述し、ワークフロー、業務ルール、スケジュール、オーケストレーションに関連付けたり、スタンドアロンのロジックとして使用したりできます。コードはバージョン3.9.16の Python 3環境で実行されます。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'
|
言語 |
依存関係の配置場所 |
|
Java |
lib/:JARファイル用、classes/:コンパイル済みクラス用 |
|
Node.js |
node_modules/ |
|
Python |
lib/ |
|
Golang |
ルートレベルのパッケージフォルダー |
|
PHP |
ルートレベルのパッケージフォルダー |
Java、Node.js、Pythonの関数では、config.jsonファイルをデプロイパッケージに含めることで、関数設定を定義し、複数のランナー定義に対応できます。
関数は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)で実行権限を定義します。