--- title: "Event Functionの設定" url: https://docs.catalyst.zoho.com/ja/tutorials/invoice-notifier/java/configure-function/ description: "Event FunctionsとCatalyst Signalsを使用して、Zoho BooksからZoho Cliqへの請求書更新を自動化するイベント駆動アーキテクチャを構築します。" last_updated: 2026-03-05T06:13:24Z service: All Services type: tutorial related_links: - name: "Event Functions" url: /ja/serverless/help/functions/event-functions/ - name: "Functionsディレクトリ構造" url: /ja/cli/v1/project-directory-structure/functions-directory --- # Event Functionの設定 ここでは、Zoho Cliqチャンネルに自動的にメッセージを送信するEvent Function `Cliq_Notifier`を設定します。このメッセージには、支払いが正常に完了した新規顧客の請求書詳細が含まれます。このFunctionは、Catalyst Signalsによってトリガーされた際に実行されます。 [Functionsディレクトリ](https://docs.catalyst.zoho.com/ja/cli/v1/project-directory-structure/functions-directory)、`functions/Cliq_Notifier`には以下が含まれています: - `CliqNotifier.java`メインFunctionファイル - `catalyst-config.json`設定ファイル - `lib`フォルダ内のJavaライブラリファイル - `.classpath`および`.project`依存関係ファイル `CliqNotifier.java`ファイルにコードを追加します。 > **Note:** このセクションのコードを確認し、内容を十分に理解してください。 以下のコードをそのままコピーし、`functions/Cliq_Notifier`ディレクトリにある`CliqNotifier.java`に貼り付けて、ファイルを保存してください。 **CliqNotifier.java** ```java import java.util.logging.Level; import java.util.logging.Logger; import java.util.Arrays; import java.io.IOException; import org.json.JSONObject; import org.json.JSONArray; import org.json.JSONException; import com.catalyst.Context; import com.catalyst.event.EVENT_STATUS; import com.catalyst.event.EventRequest; import com.catalyst.event.CatalystEventHandler; import com.zc.auth.connectors.ZCConnection; import okhttp3.OkHttpClient; import okhttp3.MediaType; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; public class CliqNotifier implements CatalystEventHandler { private static final Logger LOGGER = Logger.getLogger(CliqNotifier.class.getName()); private static final String ZBOOKSDOMAIN = "{{YOUR_ZBOOKS_DOMAIN}}"; //リージョンに基づいたZoho Booksドメインを入力してください private static final String ZBOOKSORG = "{{YOUR_ZBOOKS_ORGANIZATION_ID}}"; //Zoho BooksのOrganization IDを入力してください private static final String ZCLIQDOMAIN = "{{YOUR_ZCLIQ_DOMAIN}}"; //リージョンに基づいたZoho Cliqドメインを入力してください private static final String ZCLIQ_CHANNEL_UNIQUE_NAME = "{{YOUR_CHANNEL_UNIQUE_NAME}}"; //更新を投稿するチャンネルのユニーク名を入力してください private static final String ZCLIQ_BOT_UNIQUE_NAME = "{{YOUR_BOT_UNIQUE_NAME}}"; //メッセージを投稿するボットのユニーク名を入力してください private static final String ZACCOUNTSDOMAIN = "{{YOUR_ZACCOUNTS_DOMAIN}}"; //リージョンに基づいたZoho Accountsドメインを入力してください @Override public EVENT_STATUS handleEvent(EventRequest event, Context context) throws Exception { try { JSONArray data = extractInvoiceData(event); JSONArray rows = transformInvoiceData(data); JSONObject requestBody = prepareCliqRequest(rows); String accessToken = getAccessToken(); sendToCliq(requestBody, accessToken); LOGGER.log(Level.INFO, "Message pushed to channel successfully"); return EVENT_STATUS.SUCCESS; } catch (Exception e) { LOGGER.log(Level.SEVERE, "An unexpected error occurred: ", e); return EVENT_STATUS.FAILURE; } } private JSONArray extractInvoiceData(EventRequest event) throws JSONException { JSONObject payload = (JSONObject) event.getRawData(); JSONArray data = payload.getJSONArray("data"); JSONArray rows = new JSONArray(); for (int i = 0; i < data.length(); i++) { JSONArray invoices = data.getJSONArray(i); for (int j = 0; j < invoices.length(); j++) { rows.put(invoices.getJSONObject(j)); } } return rows; } private JSONArray transformInvoiceData(JSONArray rows) throws JSONException { for (int i = 0; i < rows.length(); i++) { JSONObject row = rows.getJSONObject(i); String invoiceId = row.optString("Invoice Id"); row.put("Link", "https://" + ZBOOKSDOMAIN + "/app/" + ZBOOKSORG + "#/invoices/" + invoiceId); row.remove("Invoice Id"); } return rows; } private JSONObject prepareCliqRequest(JSONArray rows) throws JSONException { JSONArray headers = new JSONArray(Arrays.asList( "Customer", "Invoice Number", "Amount", "Paid On", "Link" )); JSONObject tableData = new JSONObject() .put("headers", headers) .put("rows", rows); JSONObject slide = new JSONObject() .put("type", "table") .put("data", tableData); return new JSONObject() .put("text", "Here are the invoices marked as Paid in the last hour:") .put("slides", new JSONArray().put(slide)); } @SuppressWarnings("unchecked") private String getAccessToken() throws Exception { org.json.simple.JSONObject authConfig = new org.json.simple.JSONObject(); org.json.simple.JSONObject connectorConfig = new org.json.simple.JSONObject(); authConfig.put("client_id", "{{YOUR_CLIENT_ID}}"); //Client IDを入力してください authConfig.put("client_secret", "{{YOUR_CLIENT_SECRET}}"); //Client Secretを入力してください authConfig.put("auth_url", "https://" + ZACCOUNTSDOMAIN + "/oauth/v2/auth"); authConfig.put("refresh_url", "https://" + ZACCOUNTSDOMAIN + "/oauth/v2/token"); authConfig.put("refresh_token", "{{YOUR_REFRESH_TOKEN}}"); //Refresh Tokenを入力してください connectorConfig.put("CliqConnector", authConfig); return ZCConnection.getInstance(connectorConfig).getConnector("CliqConnector").getAccessToken(); } private void sendToCliq(JSONObject payload, String accessToken) throws IOException { String cliqUrl = "https://" + ZCLIQDOMAIN + "/api/v2/channelsbyname/" + ZCLIQ_CHANNEL_UNIQUE_NAME + "/message?bot_unique_name=" + ZCLIQ_BOT_UNIQUE_NAME; Request request = new Request.Builder() .url(cliqUrl) .addHeader("Authorization", "Zoho-oauthtoken " + accessToken) .addHeader("Content-Type", "application/json") .post(RequestBody.create(MediaType.parse("application/json"), payload.toString())) .build(); try (Response response = new OkHttpClient().newCall(request).execute()) { if (!response.isSuccessful()) { throw new IOException("Unexpected response from Cliq API: " + response.body().string()); } } } } ``` > **Note:** コードをFunctionファイルにコピー&ペーストした後、インラインコメントに示されている通り、以下のプレースホルダーを実際の値に更新してください: - **Zoho Booksドメイン(27行目)**:リージョンに基づいた[**Zoho Books**](https://www.zoho.com/in/books/) Organizationのドメインを入力してください。例:books.zoho.com、books.zoho.eu、books.zoho.in - **Zoho Books Organization ID(28行目)**:Zoho Booksアカウントの一意のOrganization IDを入力してください。 - **Zoho Cliqドメイン(30行目)**:リージョンに基づいた[Zoho Cliq](https://www.zoho.com/cliq/) Organizationのドメインを指定してください。例:cliq.zoho.com、cliq.zoho.eu - **Zoho Cliqチャンネルのユニーク名(31行目)**:支払い済み請求書の更新を投稿する[Zoho Cliqチャンネル](https://help.zoho.com/portal/ja/kb/zoho-cliq/user-guides/channels)のユニーク名を入力してください。 - **Zoho Cliqボットのユニーク名(32行目)**:上記チャンネルに追加された[Zoho Cliqボット](https://www.zoho.com/cliq/help/platform/bots.html)のユニーク名を入力してください。 - **Zoho Accountsドメイン(34行目)**:Catalyst、Zoho Books、Zoho Cliqへのログインに使用する[Zoho Accounts](https://www.accounts.zoho.com/)ドメインを指定してください。例:accounts.zoho.com、accounts.zoho.in - **Client ID(109行目)**:[ステップ4](https://docs.catalyst.zoho.com/ja/tutorials/invoice-notifier/nodejs/register-client/)のクライアント登録時に取得したClient IDを貼り付けてください。 - **Client Secret(110行目)**:[ステップ4](https://docs.catalyst.zoho.com/ja/tutorials/invoice-notifier/java/register-client/)で生成された対応するClient Secretを貼り付けてください。 - **Refresh Token(113行目)**:[ステップ5](https://docs.catalyst.zoho.com/ja/tutorials/invoice-notifier/java/refresh-token/)でAPIクライアントツールを使用して生成したRefresh Tokenを入力してください。 Event Functionの設定が完了しました。