CliqチャンネルまたはダイレクトメッセージでConnect投稿を共有

CliqチャンネルまたはダイレクトメッセージでConnect投稿を共有

お知らせ:当社は、お客様により充実したサポート情報を迅速に提供するため、本ページのコンテンツは機械翻訳を用いて日本語に翻訳しています。正確かつ最新のサポート情報をご覧いただくには、本内容の英語版を参照してください。

Connectの投稿リンクを、チャンネルまたは個別ユーザーへのダイレクトメッセージで共有するカスタムメニューを例に説明します。
 
使用するハンドラー
  1. メニュークリックハンドラー
  2. フォーム変更ハンドラー
  3. フォーム送信ハンドラー
 
[Cliqで共有]カスタムメニューのワークフローの内訳
  • ユーザーが投稿メニューから[Cliqで共有]オプションを選択します。
  • メニュークリックハンドラーが実行されます。
  • Zoho ConnectとCliq間の接続は、'zohocliqoauth'接続を使用して確立されます。
  • フォームが構築され、ユーザーに表示されます。
  • ユーザーが[共有先]項目に入力(チャンネル/ユーザー)すると、フォーム変更ハンドラーが実行され、フォーム内の項目が更新されます。
  • ユーザーが必要な詳細をすべて入力し、[共有]ボタンをクリックすると、フォーム送信ハンドラーが実行されます。
  • フォームの詳細が検証されてCliq APIに送信され、その後、選択したチャンネルまたはユーザーのチャット欄でリンクが共有されます。 
メニュークリックハンドラーでは、フォームオブジェクトを次の項目で構築します。
 
項目名
項目の種類
説明
[共有先]
Select
ユーザーはURLの共有先を選択する必要があります。チャンネルまたは別のユーザーへのダイレクトメッセージのいずれかを選択します。
 
この項目の'trigger on change'属性の値は'true'に設定する必要があります。この項目でのユーザー入力に基づいて、次の項目(チャンネル名/ユーザー名)が表示されます。
[ユーザー]
multiSelect
URLを共有する相手を選択します。
 
[チャンネル]
multiSelect
ユーザーはURLを共有するCliqチャンネルを選択する必要があります。
[メッセージ]
textArea
共有するメッセージの内容です。
 
項目オブジェクトの実装手順。
 
1. [共有先]
 
ユーザーは投稿リンクの共有先を選択する必要があります。選択肢は、チャンネルまたは個人のDMです。ユーザーの入力に基づいて、[ユーザー]項目または[チャンネル]項目が次に表示されます。そのため、この項目の`triggerOnChange`属性はtrueに設定されます。
fields.add({'type':'select','label':'Share in','name':'sharein',
'hint':'Select where you'd like to share this post',
'mandatory':'true','triggerOnChange':'true',
'options':{{'label':'Direct Message','id':'private'},
{'label':'Channel','id':'channel'}},'value':'private'});
 
2. [ユーザー]
 
ユーザーが投稿をダイレクトメッセージとして共有することを選択した場合、この項目にはユーザー名の一覧を表示する必要があります。ユーザーリストはConnectですでに利用可能なため、'dataSource'属性を使用して同じリストを利用します。
 
fields.add({'type':'multiSelect','label':'Users',
'name':'users','mandatory':'true',
'triggerOnChange':'false','dataSource':'user'});
3. [チャンネル]
 
ユーザーがリンクをチャンネルで共有することを選択した場合、この項目にはユーザーが参加しているチャンネルの一覧を表示する必要があります。この情報はCliqから取得されます。そのために、`zohocliqoauth`接続を使用してZoho Cliqで認証し、チャンネルの詳細を取得します。この例では、コードの実行時間を20秒未満に抑えるため、最初の400件のチャンネルの詳細を取得します。Cliq APIがチャンネル名による検索と詳細取得に対応している場合は、項目検索ハンドラーを使用すると、より効率的です。
channels = Map();
allChannel = list();
countList = {'1','2','3','4','5'};
//for each count in countList
{
parameterMap = Map();
if(channels.containKey('next_token'))
{
parameterMap.put('next_token',channels.get('next_token'));
}
channels = invokeurl
[
type :GET
parameters:parameterMap
connection:'zohocliqoauth'
];
channels = channels.toMap();
channelsList = channels.get('channels').toList();
for each channel in channelsList
{
option = Map();
option.put('id',channel.get('channel_id'));
option.put('value',channel.get('unique_name'));
option.put('label',channel.get('name'));
allChannel.add(option);
}
if(channels.containKey('has_more') == false || channels.get('has_more') == false)
{
break;
}
}
 
この例では、`sharein`項目の初期値がprivateのため、ユーザー体験を向上させる目的でchannels項目はフォームに表示されません。ただし、ユーザーが[Share in]項目で[Channels]を選択すると、channel項目がフォームに表示されます。
fields.add({'type':'multiSelect','label':'Channels','name':'channel',
'mandatory':'true','triggerOnChange':'false','options':allChannel,'hide':'true'});
 
4. メッセージ
 
次のコードスニペットは、URLとともに共有する必要があるユーザーのメッセージを取得するためのものです。
message = 'Look this [connect post](' + entity.get('url') + ')';
fields.add({'type':'textArea','label':'Message',
'name':'message','hint':'Enter your message',
'mandatory':'true','triggerOnChange':'false','value':message,'maxLimit':1000});
 
上記のすべてのスニペットを含めた、メニュークリックハンドラーの完成版コードは次のとおりです。
fields = {};
fields.add({'type':'select','label':'Via','name':'sharein',
'hint':'Select where you'd like to share this post',
'mandatory':'true','triggerOnChange':'true',
'options':{{'label':'Direct Message','id':'private'},
{'label':'Channel','id':'channel'}},'value':'private'});
channels = Map();
allChannel = list();
countList = {'1','2','3','4','5'};
//for each count in countList
{
parameterMap = Map();
if(channels.containKey('next_token'))
{
parameterMap.put('next_token',channels.get('next_token'));
}
channels = invokeurl
[
type :GET
parameters:parameterMap
connection:'zohocliqoauth'
];
channels = channels.toMap();
channelsList = channels.get('channels').toList();
for each channel in channelsList
{
option = Map();
option.put('id',channel.get('channel_id'));
option.put('value',channel.get('unique_name'));
option.put('label',channel.get('name'));
allChannel.add(option);
}
if(channels.containKey('has_more') == false || channels.get('has_more') == false)
{
break;
}
}
fields.add({'type':'multiSelect','label':'Channels',
'name':'channel','mandatory':'true','triggerOnChange':'false',
'options':allChannel,'hide':'true'});
fields.add({'type':'multiSelect','label':'Users','name':'users',
'mandatory':'true','triggerOnChange':'false','dataSource':'user'});
message = 'Look this [connect post](' + entity.get('url') + ')';
fields.add({'type':'textArea','label':'Message','name':'message',
'hint':'Enter your message','mandatory':'true',
'triggerOnChange':'false','value':message,'maxLimit':1000});
form = Map();
form.put('title','Share in Cliq');
form.put('hint','Share a Connect post in Cliq');
form.put('buttonLabel',{'done':'Share'});
form.put('fields',fields);
returnMap = Map();
returnMap.put('form',form);
return returnMap;
 
カスタムメニューで実行される操作にCTAを合わせるため、`buttonLabel`属性を使用して、`done`アクションボタンの名前を[Share]に変更します。
フォーム変更ハンドラー
ユーザーが[Share in]項目でオプションを選択すると、この項目の「triggerOnChange」属性の値がtrueに設定されているため、フォーム変更ハンドラーがトリガーされます。ユーザーの入力に基づいて、フォーム変更ハンドラーは関連する項目(チャンネル/user名)を表示します。これは、`channel`項目と「users」項目の表示設定を切り替えることで行われます。
 
 
targetEle = target.get('name');
formValues = form.get('values');
fieldList = form.get('fields').toList();
returnMap = Map();
if(targetEle == 'sharein')
{
cliqMedium = formValues.get('sharein').toMap().get('id');
fields = list();
if(cliqMedium == 'private')
{
fields.add({'name':'channel','hide':true});
fields.add({'name':'users','hide':false});
}
else
{
fields.add({'name':'users','hide':true});
fields.add({'name':'channel','hide':false});
}
returnMap.put('fields',fields);
}
return returnMap;
 
 
フォーム送信ハンドラー
 
フォームが送信されると(つまり、[共有]ボタンがクリックされると)、フォーム送信ハンドラーが実行されます。フォーム内のすべての項目が必須であるため、ユーザーがこれらの項目を入力するまでフォーム送信ハンドラーは実行されません。
 
以下のコードスニペットでは、Cliqのチャンネルでリンクを共有し、処理を完了できなかった場合にエラーメッセージを表示します。
 
message = form.get('values').get('message');
channels = form.get('values').get('channel').toList();
info channels;
errorMsg = '';
joiner = '';
for each channel in channels
{
  response = zoho.cliq.postToChannel(channel.get('value'),
message,'zohocliqoauth');
  info response;
  if(response == null || response.containKey('status') == false ||
response.get('status') != 'success')
  {
  errorMsg = errorMsg + joiner + channel.get('label');
  joiner = ', ';
  info channel.get('value') + ' :::: ' + response;
  }
}
 
 
以下のコードスニペットでは、個別のユーザーにダイレクトメッセージとしてリンクを共有します。
 
個別のユーザーにメッセージを送信する前に、Cliqでは自分自身のアカウントにメッセージを共有できないため、ユーザーがそれを実行しようとしていないか検証します。
 
users = form.get('values').get('users').toList();
info users;
for each cliqUser in users
{
if(cliqUser.get('id') == user.get('id'))
{
fieldError = Map();
fieldError.put('users','You cannot share a post with yourself.');
returnMap.put('fieldError',fieldError);
return returnMap;
}
}
 
検証後、選択したユーザーにメッセージが送信されます。
 
for each cliqUser in users
{
response = zoho.cliq.postToUser(cliqUser.get('value'),message,'zohocliqoauth');
info response;
if(response == null || response.containKey('status') == false ||
response.get('status') != 'success')
{
errorMsg = errorMsg + joiner + cliqUser.get('label');
if(response.containKey('message'))
{
info cliqUser.get('value') + ' :::: ' + response.get('message');
}
}
}
 
リンクの共有に失敗した場合は、エラーメッセージが表示されます。この例では、チャンネルとダイレクトメッセージで異なるエラーメッセージを使用しています。
if(errorMsg != null && errorMsg.length() > 0)
{
msg = '';
if(cliqMedium == 'channel')
{
msg = 'Sorry, we're unable to share the post in the following channel(s): '
+ errorMsg;
}
else
{
msg = 'Sorry, we're unable to share the post with the following user(s): '
+ errorMsg;
}
returnMap.put('result','success');
returnMap.put('message',msg);
}
else
{
returnMap.put('result','success');
returnMap.put('message','Message shared successfully');
}
 
フォーム送信ハンドラーの完成したコードは次のとおりです。
 
returnMap = Map();
formValues = form.get('values');
cliqMedium = formValues.get('sharein').toMap().get('id');
info cliqMedium;
message = formValues.get('message');
errorMsg = '';
joiner = '';
if(cliqMedium == 'channel')
{
channels = formValues.get('channel').toList();
info channels;
for each channel in channels
{
response = zoho.cliq.postToChannel(channel.get('value'),message,'zohocliqoauth');
info response;
if(response == null || response.containKey('status') == false ||
response.get('status') != 'success')
{
errorMsg = errorMsg + joiner + channel.get('label');
joiner = ', ';
info channel.get('value') + ' :::: ' + response;
}
}
}
else
{
users = formValues.get('users').toList();
info users;
for each cliqUser in users
{
if(cliqUser.get('id') == user.get('id'))
{
fieldError = Map();
fieldError.put('users','You cannot share a post with yourself.');
returnMap.put('fieldError',fieldError);
return returnMap;
}
}
for each cliqUser in users
{
response = zoho.cliq.postToUser(cliqUser.get('value'),message,'zohocliqoauth');
info response;
if(response == null || response.containKey('status') == false ||
response.get('status') != 'success')
{
errorMsg = errorMsg + joiner + cliqUser.get('label');
if(response.containKey('message'))
{
info cliqUser.get('value') + ' :::: ' + response.get('message');
}
}
}
}
if(errorMsg != null && errorMsg.length() > 0)
{
msg = '';
if(cliqMedium == 'channel')
{
msg = 'Sorry, we're unable to share the post in the following channel(s):
' + errorMsg;
}
else
{
msg = 'Sorry, we're unable to share the post with the following user(s):
' + errorMsg;
}
returnMap.put('result','success');
returnMap.put('message',msg);
}
else
{
returnMap.put('result','success');
returnMap.put('message','Message Shared Successfully');
}
return returnMap;