#コラボチャット: 投稿
任意テキストをコラボチャット(Collab-Chat: Questetraワークフロー基盤の社内チャット)に投稿します。チャンネルを指定して投稿します。組織チャンネルやプロセスチャンネルへの投稿はid(例 “g12” や “p123″)を指定し、ユーザ作成チャンネルへの投稿はチャンネル名(例 “general”)を指定します。
Configs for this Auto Step
- StrConfA1
- A1: 投稿テキスト(投稿文)をセットしてください#{EL}
- SelectConfA2
- A2: 添付ファイルが格納されているファイル群型データを選択してください (最大10)
- StrConfA3
- A3: リンクURLを(複数ある場合は各行に)セットしてください (最大10)#{EL}
- BoolConfB0
- B0: チャンネル自動作成 Off ⇔ On
- StrConfB1
- B1: 投稿チャンネルをセットしてください (例: “g12”, “general”) *#{EL}
- StrConfB2
- B2: クロス投稿したい場合、そのチャンネルを各行にセットして下さい#{EL}
- StrConfC1
- C1: クロスからメイン投稿へリンクさせたい場合、基盤URLをセット (例 “${var[applicationRoot]}”)#{EL}
- SelectConfC2
- C2: メイン投稿のメッセージURLを格納する文字列型データ項目を指定してください
Script (click to open)
// Script Example of Business Process Automation
// for 'engine type: 3' ("GraalJS standard mode")
// cf. 'engine type: 2' ("GraalJS Nashorn compatible mode") (renamed from "GraalJS" at 20230526)
//////// START "main()" ////////////////////////////////////////////////////////////////
main();
function main(){
//// == Config Retrieving / 工程コンフィグの参照 ==
const strText = configs.get ( "StrConfA1" ); // NotRequired
const filesPocketAttach = configs.getObject ( "SelectConfA2" ); // NotRequired
const strUrls = configs.get ( "StrConfA3" ); // NotRequired
const boolCreateChannel = configs.getObject ( "BoolConfB0" ); // TOGGLE
const strMainChannel = configs.get ( "StrConfB1" ); /// REQUIRED
const strCrossChannels = configs.get ( "StrConfB2" ); // NotRequired
let arrCrossChannels = strCrossChannels !== "" ?
strCrossChannels.split("\n") :
null;
const strApplicationRoot = configs.get ( "StrConfC1" ); // NotRequired
const strPocketC2 = configs.getObject ( "SelectConfC2" ); // NotRequired
//// == Data Retrieving / ワークフローデータの参照 ==
let filesAttach = null;
if( filesPocketAttach !== null ){
filesAttach = engine.findData( filesPocketAttach );
// java.util.ArrayList
// List<com.questetra.bpms.core.event.scripttask.QfileView>
}
if( strText === "" && filesAttach === null && strUrls === "" ){
throw new Error( "\n AutomatedTask ConfigError:" +
" No data in Config {A1} {A2} {A3} \n" );
}
//// == Calculating / 演算 ==
/// create Channels
if ( boolCreateChannel ){
try {
feedService.createPublicChannel ( strMainChannel );
engine.log( " AutomatedTask: Channel created - " + strMainChannel );
} catch(e) { // if error, channel already exists, etc
engine.log( " AutomatedTask: Channel Creation " + strMainChannel + " - " + e.getMessage() );
}
for ( let i = 0; i < arrCrossChannels.length; i++ ){
if( arrCrossChannels[i] !== "" ){
try {
feedService.createPublicChannel ( arrCrossChannels[i] );
engine.log( " AutomatedTask: Channel created - " + arrCrossChannels[i] );
} catch(e) { // if error, channel already exists, etc
engine.log( " AutomatedTask: Channel Creation " + arrCrossChannels[i] + " - " + e.getMessage() );
}
}
}
}
/// prepare CollabChat Message
let chatMsg = feedService.begin(); // FeedServiceWrapper
// com.questetra.bpms.core.event.scripttask.FeedServiceWrapper
let strFooter = "\n\n -- auto posted to #" + strMainChannel;
if ( arrCrossChannels !== null ){
strFooter += " & crossposted to";
for ( let i = 0; i < arrCrossChannels.length; i++ ){
if( arrCrossChannels[i] !== "" ){
strFooter += " #" + arrCrossChannels[i];
}
}
}
chatMsg = chatMsg.setMessage( strText + "\n" + strFooter );
if( filesAttach !== null ){
let numFilesSize = filesAttach.size() - 0;
for( let i = 0; i < numFilesSize; i++ ){
chatMsg = chatMsg.attachFile( filesAttach.get(i) );
engine.log(
" AutomatedTask AttachedFile:" +
" '" + filesAttach.get(i).getName() + "'" +
" (" + filesAttach.get(i).getLength() + " byte)" +
" '" + filesAttach.get(i).getContentType() + "'"
);
}
}
if( strUrls !== "" ){
const arrUrls = strUrls.split("\n");
for( let i = 0; i < arrUrls.length; i++ ){
if( arrUrls[i] !== "" ){
chatMsg = chatMsg.attachLink( arrUrls[i] );
engine.log(
" AutomatedTask AttachedLink:" +
" '" + arrUrls[i] + "'"
);
}
}
}
/// post to Main channel
engine.log( " AutomatedTask CollabChat Main: Post" );
const numPostedMsgMain = chatMsg.setChannel( strMainChannel )
.post() - 0; // Java Long to Javascript number
engine.log( " AutomatedTask CollabChat Message ID: " + numPostedMsgMain );
const strMainUrl = strApplicationRoot +
"Feed/Timeline/message?messageId=" +
numPostedMsgMain;
// https://example.questetra.net/Feed/Timeline/message?messageId=103349204
// https://example.questetra.net/Feed/Timeline/Topic/104877766/Message/103349204
/// cross-post to Channels
if ( arrCrossChannels !== null ){
if( strApplicationRoot !== "" ){
chatMsg = chatMsg.attachLink( strMainUrl );
}
for ( let i = 0; i < arrCrossChannels.length; i++ ){
if( arrCrossChannels[i] !== "" ){
try {
engine.log( " AutomatedTask CollabChat Cross: Post" );
const numPostedMsgCross = chatMsg.setChannel( arrCrossChannels[i] )
.post() - 0; // Java Long to Javascript number
engine.log( " AutomatedTask CollabChat Message ID: " + numPostedMsgCross );
} catch(e) { // if error, channel already exists, etc
engine.log( " AutomatedTask Warning Channel not found: " + arrCrossChannels[i] );
}
}
}
}
//// == Data Updating / ワークフローデータへの代入 ==
if ( strPocketC2 !== null ){
engine.setData( strPocketC2, strMainUrl );
}
} //////// END "main()" /////////////////////////////////////////////////////////////////
/*
Notes:
- When the process reaches the automated step, the text is automatically posted.
- Posted by the special icon "Questetra" who cannot be followed.
- Specify the channel (main posting destination) to post to. (Standard config)
- For organization channels, set it in the format of `g1` or `g123`.
- For process channels, set it in the format of `p1` or `p123`.
- For process channel itself, set as `p#{processInstanceId}`.
- Specify the channel to cross post to if necessary. (Expert config)
- The same text as the main post will be posted.
- No error will occur even if the channel does not exist. (Warning)
- The URL to the main post is also available.
- Useful to aggregate users' Comments on the main post.
APPENDIX-en:
- No need to set authentication or authorization (OAuth2) when modeling.
- There is no way to post from the standpoint of a specific user.
- There is no function to delete posts by special contributors (As of April 2025)
- Error will occur if attached more than 10 links or files.
Notes-ja:
- 案件が自動工程に到達した際に、「投稿文」が自動投稿されます。 (CollabChat Post)
- 特別な投稿者「Questetra」のアイコンで投稿されます。
- 投稿先チャンネル(メイン投稿先)を指定します。 (Standard 設定)
- 組織チャンネルの場合、`g1` や `g123` のような書式でセットしてください。
- プロセスチャンネルの場合、`p1` や `p123` のような書式でセットしてください。
- 自身のプロセスチャンネルの場合、`p#{processInstanceId}` とセットしてください。
- 必要に応じてクロス投稿先のチャンネルを指定します。 (Expert 設定)
- メイン投稿と同じ文章が投稿されます。
- チャンネルが存在しない場合でもエラー終了しません。(Warning)
- メイン投稿へのURLを添付することも可能です。
- ユーザの[コメント]をメイン投稿で集約させたい場合などに便利です。
APPENDIX-ja:
- モデリング時に認証情報や認可(OAuth2)を設定する必要はありません。
- 特定ユーザの立場で投稿する方法はありません。
- 特別な投稿者の投稿(ワークフローエンジンの立場からの投稿)を削除する機能はありません。(2025年4月現在)
- リンクやファイルの添付が10を超えるとエラーになります。
*/
Download
- collab-chat-post-2025.xml
- 2025-04-22 (C) Questetra, Inc. (MIT License)
- collab-chat-post-202511.xml
- automatically truncates posts to 8000 characters
- 2025-11-25 (C) Questetra, Inc. (MIT License)
自由改変可能な JavaScript (ECMAScript) コードです。いかなる保証もありません。
(アドオン自動工程のインストールは Professional editionでのみ可能です)
(アドオン自動工程のインストールは Professional editionでのみ可能です)
Notes
- 案件が自動工程に到達した際に、「投稿文」が自動投稿されます。 (CollabChat Post)
- 特別な投稿者「Questetra」のアイコンで投稿されます。
- 投稿先チャンネル(メイン投稿先)を指定します。 (Standard 設定)
- 組織チャンネルの場合、
g1やg123のような書式でセットしてください。 - プロセスチャンネルの場合、
p1やp123のような書式でセットしてください。 - 自身のプロセスチャンネルの場合、
p#{processInstanceId}とセットしてください。
- 組織チャンネルの場合、
- 必要に応じてクロス投稿先のチャンネルを指定します。 (Expert 設定)
- メイン投稿と同じ文章が投稿されます。
- チャンネルが存在しない場合でもエラー終了しません。(Warning)
- メイン投稿へのURLを添付することも可能です。
- ユーザの[コメント]をメイン投稿で集約させたい場合などに便利です。
Capture


Appendix
- モデリング時に認証情報や認可(OAuth2)を設定する必要はありません。
- 特定ユーザの立場で投稿する方法はありません。
- 特別な投稿者の投稿(ワークフローエンジンの立場からの投稿)を削除する機能はありません。(2025年4月現在)
- 投稿テキストの長さが8000を超えるとエラーになります。
- リンクやファイルの添付数が10を超えるとエラーになります。
- “各行に複数URL” の正規表現例は
^(https:\/\/\S+\r?\n)*https:\/\/\S+$となります。 - 他のチャンネルへのクロス投稿例(チャンネルID未入力でもエラーにならない設定)
#{#q_channelId == null ? '' : #q_channelId}
- プロセスID等が自動投稿されるようにしておくと、権限者がプロセスデータを参照しやすくなります。
<#{processModelInfoName}> #p#{processInstanceId} ##{#q_channelId == null ? '' : #q_channelId} #{#q_user == null ? '' : 'by @[' + #q_user?.name + ']'}
Best Practice (商談報告プロセスの場合)
- 社内議論の場として
商談助言チャンネルと製品要望チャンネルを作成する。- [ユーザ作成チャンネル](パブリック)として作成する。(内部統制〔統制活動〕の相互牽制)
- (機密情報が含まれる業務の場合は[プライベート]チャンネルにする)〔内部監査人を加える〕
- 自動工程『#コラボチャット: 投稿』の “投稿文” を設定する。
- データ項目『見込案件概要と確度』の変数(eg:
#{#q_opportunities})をセットする。 - データ項目『顧客から聞いた要望』の変数(eg:
#{#q_customer_needs})をセットする。 - “プロセスチャンネルへのリンク” の変数(eg:
#p#{processInstanceId})もセットする。- ワークフローアプリ特権[データ閲覧権限]を持つユーザは[プロセス詳細]に遷移しやすくなる。
- データ項目『見込案件概要と確度』の変数(eg:
- 自動工程『#コラボチャット: 投稿』の “投稿先チャンネル” を設定する。
- 『メイン投稿先』に
#商談助言をセットする。 - 『クロス投稿先』に
#製品要望をセットする。- 『顧客から聞いた要望』が無い場合にクロス投稿しない設定
#{#q_customer_needs == null ? '' : '#製品要望'}
- 『クロス投稿先』に顧客チャンネル
#{#q_customer_id}をセットする。(顧客ケースマネジメント)
- 『メイン投稿先』に
