こんにちは!
今回は社内でよく聞くTrailheadのつまずきポイントとして、「絶対合ってるはずなのに、Challengeが通らない」ことがよくあります。
それを避けるためのポイントを2つご紹介します。
1. 開発環境はモジュール単位で作り直す
Trailheadではハンズオンのための開発環境(Playground)を無償で提供してくれていますが、既に別のChallengeで使った環境を使うと、「絶対合ってるはずなのに、Challengeが通らない」と悩んでしまうことがあります。
新しいモジュールを始めるときは、その都度Playgroundを作ると、それが避けられるようです。
PraygroundはChallengeの枠内に設置されている「Trailhead Playgroundを作成」より作成します。
2.開発環境の言語は英語で
Trailheadは多言語に対応しており、日本語で読める記事もあるので大変ありがたいです。
表示言語の切り替えは画面左下の部分より行えます。
ただし、Challengeのハンズオンを行うときの開発組織の言語設定は、断然、英語をおすすめします。
「絶対合ってるはずなのに、Challengeが通らない」と悩んでいるとき、言語設定を英語にすることで解消されることが結構あります。
以下の順にクリックすると開発組織の言語設定画面が表示されます。
Classicの場合
ユーザ名 > 私の設定 > 個人用 > 言語とタイムゾーン
Lightningの場合
アストロくんのアイコン > 設定 > 私の個人情報 > 言語とタイムゾーン
このような手順で言語設定をしてみてください。
さいごに..
Trailheadは無料で、どなたでも始められます。( https://trailhead.salesforce.com/ja )
Salesforceに少しでもご興味を持った方、一緒にチャレンジしてみませんか?
こんにちは。タキ@NSD走遊会ウメキタ監督代行です。
今回、NPO法人JASIPA会員のオレンジアーチ本山社長からお誘いがあり「NIPPON IT チャリティ駅伝」に参加してきましたのでレポートします。
開催概要は以下の通りです。
開催日:2017年12月10日(日)
主 催:NIPPON IT チャリティ駅伝実行委員会
実行委員長
チャック・ウィルソン(チャックウィルソンエンタープライズ株式会社)
会 場:お台場シンボルプロムナード|シンボルプロムナード夢の広場
天 候:晴れ
参加者:約3000人(5人/チーム×600チーム)+観客数千人
種 目:駅伝15km(5区間)
区間距離:1区~5区 各3km
出走メンバーは、JASIPA理事枠の5人とJASIPA会員枠として当社、日本システムデザインのNSD走遊会メンバー5人が参加しました。
開会式が始まりました!司会はウイングアーク1stの森脇さんが務めてます!実行委員長のチャックウィルソンの登場です。恒例のチャック体操をみんなで行っています!
いよいよスタートです!スターターは元プロ野球選手石毛さんです。開催スポンサーでもあるオレンジアーチ本山社長が早速登場です。スパイダーマンのお面をかぶっています。JASIPA理事チームの宮武理事と当社チームの工藤さんもこの中にいます^^;
第2走者メンバーが待機エリアでスタンバってます!
NSD走遊会第1走者工藤さんが帰ってきました!期待以上のタイムです!お疲れ様!
NSD走遊会第2走者の礒部さんが帰ってきました!
さらに期待を上回る好タイムでのフィニッシュです!お疲れ様!
NSD走遊会第3走者の大野さんのこの余裕の笑みはなんでしょうか!?
走りも余裕です!タイムはどうなっているのか!?とりあえずお疲れ様!
NSD走遊会第4走者の木下さんの出番です!
颯爽とスタートしていきました。あっ、帰ってきました。最終走者の遠竹さんにタスキのバトンタッチです。
相当激走した感じです。お疲れ様!
NSD走遊会第5走者の遠竹さん、爽やかな走りです。
ゴ~~~~~ル!この笑み、素敵です!
いよいよ結果発表です。
まずは、トップ5です。
トップのタイムは53分32秒、平均タイム10分台/人です!
NSD走遊会メンバーの順位は170位/616チーム(棄権11チーム含む)、タイムは、1時間12分37秒、平均タイム14分台/人です!
初参加にしては頑張ったのではと思います。
完走証です^^
みんなお疲れ様でした!
こんにちは!
今回はSalesforceの数式について最近使った小ネタを紹介します。
帳票などを作成するときに、 Salesforceで「1,890千円」「1,200円68銭」といった「カンマ区切り」「千円」「円銭」を表現しなくてはいけない時に参考にしてみてください。
数式を軽く振り返る
その前に今回使う関数について軽くおさらいをしておきましょう。
関数 | 概要 | 例 |
CEILING(number) | 数値をもっとも近い整数に丸めます → 切り上げ | ・CEILING( 100.555 ) = 101 ・CEILING( 100.444 ) = 101 |
FLOOR(number) | 数値を切り捨てて、0 にもっとも近い整数に丸めます → 切り捨て | ・FLOOR( 100.555 ) = 100 ・FLOOR( 100.444 ) = 100 |
ROUND(number,num_digits) | 数値を指定した桁数に丸めます → 四捨五入 | ・ROUND( 100.555, 0 ) = 101 ・ROUND( 100.444, 0 ) = 100 |
MOD(number,divisor) | 数値を因数で除算した余りを返します → 除算は正の値だけ行われます | ・MOD( 10, 3 ) = 1 ・MOD( 100.555, 5 ) = 0.555 |
LEN(text) | テキスト文字列の文字数の文字を返します | ・LEN( TEXT(100.555) ) = 7 |
数値項目(15,3)を「カンマ区切り」かつ「千円」単位で表示する
千円で表示するために一度、1/1000にしてから四捨五入します。
状況によって切り上げ、切り捨てに変更してください。
※数値が格納されているオブジェクトの項目は「Price__c」です。
IF(
ROUND(Price__c / 1000,0) < 1,
ROUND(Price__c) + "円",
MID(
TEXT(Price__c / 1000),
1,
IF(
MOD(
LEN(TEXT(ROUND(Price__c / 1000,0))),3)=0,
3,
LEN(TEXT(ROUND(Price__c / 1000,0)))-(ROUND((LEN(TEXT(ROUND(Price__c / 1000,0)))-1)/3,0)*3)
)
) &
IF(
LEN(TEXT(ROUND(Price__c / 1000,0)))>3,
"," &
MID(
TEXT(ROUND(Price__c / 1000,0)),
IF(
MOD(LEN(TEXT(ROUND(Price__c / 1000,0))),3)=0,
4,
LEN(TEXT(ROUND(Price__c / 1000,0)))-(ROUND((LEN(TEXT(ROUND(Price__c / 1000,0)))-1)/3,0)*3-1)
),
3
),
""
) &
IF(
LEN(TEXT(ROUND(Price__c / 1000,0)))>6,
"," &
MID(
TEXT(ROUND(Price__c / 1000,0)),
IF(
MOD(LEN(TEXT(ROUND(Price__c / 1000,0))),3)=0,
7,
LEN(TEXT(ROUND(Price__c / 1000,0)))-(ROUND((LEN(TEXT(ROUND(Price__c / 1000,0)))-1)/3,0)*3-4)
),
3
),
""
) &
IF(
LEN(TEXT(ROUND(Price__c / 1000,0)))>9,
"," &
MID(
TEXT(ROUND(Price__c / 1000,0)),
IF(
MOD(LEN(TEXT(ROUND(Price__c / 1000,0))),3)=0,
10,
LEN(TEXT(ROUND(Price__c / 1000,0)))-(ROUND((LEN(TEXT(ROUND(Price__c / 1000,0)))-1)/3,0)*3-7)
),
3
),
""
) & "千円"
)
数値項目(15,3)を「カンマ区切り」かつ整数部分を「円」単位、小数点以下を「銭」単位で表示する
銭まで表示する場合小数点第3位で四捨五入を行うため、円表記部分には小数点以下を切り捨てた値を使用します。
※こちらも、数値が格納されているオブジェクトの項目は「Price__c」です。
IF(
ROUND(Price__c,0) < 1,
"0",
MID(
TEXT(FLOOR(Price__c)),
1,
IF(
MOD(
LEN(TEXT(ROUND(Price__c,0))),3)=0,
3,
LEN(TEXT(ROUND(Price__c,0)))-(ROUND((LEN(TEXT(ROUND(Price__c,0)))-1)/3,0)*3)
)
) &
IF(
LEN(TEXT(ROUND(Price__c,0)))>3,
," &
MID(
TEXT(FLOOR(Price__c)),
IF(
MOD(LEN(TEXT(ROUND(Price__c,0))),3)=0,
4,
LEN(TEXT(ROUND(Price__c,0)))-(ROUND((LEN(TEXT(ROUND(Price__c,0)))-1)/3,0)*3-1)
),
3
),
""
) &
IF(
LEN(TEXT(ROUND(Price__c,0)))>6,
"," &
MID(
TEXT(FLOOR(Price__c)),
IF(
MOD(LEN(TEXT(ROUND(Price__c,0))),3)=0,
7,
LEN(TEXT(ROUND(Price__c,0)))-(ROUND((LEN(TEXT(ROUND(Price__c,0)))-1)/3,0)*3-4)
),
3
),
""
) &
IF(
LEN(TEXT(ROUND(Price__c,0)))>9,
"," &
MID(
TEXT(FLOOR(Price__c)),
IF(
MOD(LEN(TEXT(ROUND(Price__c,0))),3)=0,
10,
LEN(TEXT(ROUND(Price__c,0)))-(ROUND((LEN(TEXT(ROUND(Price__c,0)))-1)/3,0)*3-7)
),
3
),
""
)
)
& "円" &
IF(
FIND('.', TEXT(Price__c)) = 0,"00",RPAD(MID(TEXT(Price__c), FIND('.', TEXT(Price__c))+1, 2), 2, "0")
)
& "銭"
今回の数式を使う際には、小数点第3位に関して切り上げ切り捨てをする必要がある場合は100倍したり、テキストとして評価したりして、うまく工夫してみてください。
文字数の制限さえクリアすれば、数式って色々できるもんなんですよね。
では、また次回。
こんにちは!
過去とあるプロジェクトでLightning Experienceを使用する機会がありました。
恥ずかしながらデザインがきれい!という認識しかなく、少し触った程度だったのでこの機会に色々と調べてみました。
調べた結果Lightning Experienceが超いい!ということがわかりましたので、簡単な説明をさせていただきます!
そもそも、Lightning Experienceとは?
Lightning Experienceとは、下記の3つで成り立っています。
Lightning Design System | 設計パターン、コンポーネント、エンタープライズ UX の ベストプラクティスを利用して一貫性のある最新アプリを 容易に作成できます。 |
Lightning App Builder | オブジェクト、フィールド、レポート、パートナー コンポーネント、ページレイアウトなど、すべての コンポーネントをドラッグアンドドロップで操作して 完全なモバイルアプリケーションを作成できます。 |
Lightning コンポーネント | オープンな多層型フレームワークで、ドラッグアンド ドロップで操作できるツールを使用して、モバイルおよび デスクトップデバイス対応の動的アプリケーションを 開発できます。 |
では、Salesforce Classicと何が変わったのか?
セールスとサービス主体の考え方に基づき、ビジネスプロセスのサポートを改善するため、 |
従来のデスクトップ環境とは異なり、生産性向上のためにスムーズに作業ができるようになっているということです!
確かに、見た目も環境もわかりやすくなっていますし、なによりモバイルで見ていた機能がPCのデスクトップでも愛用できるのです!
※Lightning Experienceの有効化の方法は、リンク先に記載されています。 (組織で Lightning Experience を有効化する方法)
※Lightning Experience を有効にする前に、いくつかの補助機能を有効にしておくことが便利です。 (Lightning Experience の推奨機能)
※ブラウザによってサポート制限があるため、注意しましょう。 (Lightning Experience でサポートされるブラウザ)
もし検討している方がいらっしゃれば、注意点があります。
Lightning Experienceはすべての機能が使用できるわけではないですよ!
下記に細かな内容が記載されているため、確認しましょう。
(Lightning Experience と Salesforce Classic の比較)
(Lightning Experience と Salesforce Classic 間の機能の違い)
すべての機能が使用できないとしても、安心してください!
Lightning Experienceに切り替えてしっまったとしても、Salesforce Classicを自由に切り替えて使用することは可能になります!
そのため、片方でできなかったことが両方使うことでそれぞれで補うことが可能となります!!!!
(Lightning Experience 導入後も Salesforce Classic は使用可能)
また、ユーザによってLightning Experienceの有効化の制限をかけることもできます。
設定方法: ユーザに割り当てられたプロファイルに「Lightning Experience ユーザ」権限を有効化することで使用することが可能になります。
Lightning Experienceについての簡単なご紹介でした。
円滑に作業をすすめるために使ってみませんか? この記事が少しは役に立てていれば幸いです。
こんにちは。タキ@麻雀愛好家です。
前回の第22回からはや3ヶ月、今年の夏は冷夏でしたが、まだ11月だというのに既に冬の様相です。
そんな中、勤労感謝の日の11月23日(木)に第23回NSD麻雀大会を行いましたので、結果をご報告致します。
開催概要
日 時:2017年11月23日(木)11時30分集合、12時スタート
場 所:ゴースタアネックス神田店 8F(JR線・神田駅・北口出口徒歩1分)
天 候:曇り時々晴れ(施設内なので関係ないが)
参加者:36名(社内9名、取引先等25名)
参加費:5,000円(打ち上げ参加費用等込み)
スケジュール:
11:30 集合、ルール等説明、名刺交換会
12:00 競技開始
17:00 競技終了
17:30 発表
19:30 解散
ルール概要:
■30分/回戦×8回戦(東南風戦、西・北入あり
※8回戦のみ55分の拡大版
■食いタンあり、後付けありの「アリアリ」ルール
(鳴き平和はなし、海底のみあり)
■海底(ハイテイツモ)と河底(ハイテイロン)アリ
■ドラは★2枚★、「裏ドラ」「槓ドラ」「槓裏ドラ」あり
■赤牌もドラ扱い
■全局割れ目アリ!
■ドボンなし(箱割れは借りてください、リーチは出来ません)
■チョンボは満貫払い
■点数は25,000点持ち、30,000点返し
■ウマあり、ワンスリー(1位:30pt、2位:10pt、3位:-10pt、4位:-30pt)
■二翻縛りなし、やきとり・花牌なし。
■最終局(8回戦)はポイント2倍!
今回は念願の「雀荘貸切」での開催となりました!
今までは他のお客様もいて少し騒ぐと店員に怒られてましたが、今回は貸切のため騒ぎ放題でも大丈夫でした^^;
順位発表
発表会は、テング酒場神田店です。
乾杯の発声は、前回BBのヒラツカさんです。発表までしばしご歓談を!
まずは、特別賞(当月賞・当日賞・3位最多賞・ラッキー7賞)の発表です。
1~8回戦毎のベスグロな方達です。
4位~36位の発表です。
なお、4位~36位の賞は、入賞(4位、5位)、飛び賞(10位、15位、20位、25位、30位)とBB(35位:次回幹事)、BM(36位)です。
3位は「スエヨシ」さんです!おめでとうございます!
準優勝は「ゴンセイ」さんです!おめでとうございます!
第23回NSD麻雀大会、優勝は「フジタ」さんです!
おめでとうございました!
次回開催予定
以下からエントリーをお願いします。
こんにちは!
今回は、Excel VBA を使ってカスタム表示ラベルの一覧を出力してみたいと思います。
※最近関わったプロジェクトでカスタム表示ラベル(多言語)を1000個以上使っており、こんなツールがあればなぁと思っていました。
早速調べてみましたが、カスタム表示ラベルを直接取得する API は見当たらず、仕方なくメタデータから引っこ抜く事にしました。
処理の流れは以下の様になります。
1. ログイン 2. メタデータ(カスタム表示ラベル)取得 3. メタデータの展開 4. カスタム表示ラベル取得情報の読み込み 5. カスタム表示ラベル情報を出力
0.はじめに
VBA の参照設定について
今回のマクロは Excel2016 で作成し、処理の中で以下のライブラリを使用しました。Windows標準のライブラリなのでどのバージョンでも動作すると思います。 VBAエディタメニュー > ツール > 参照設定
・Microsoft Scripting Runtime ・Microsoft XML vX.0 ・Microsoft Shell Controls And Automation
API の呼び出しについて
処理に入る前に、処理の中で何度か API を呼び出しますので、API 呼び出し用の部品を作っておきます。 呼び出しは HTTP通信で行います。ヘッダ情報は以下の通り。
soapaction: "" Content-Type: text/xml;charset=UTF-8
これを踏まえて、API 呼び出し用の部品を作っておきます。
' **** ' * HTTP 通信処理 ' * ' * amUrl: URL ' * amSendXml: 送信する XML 文字列 ' * aoResponseXml: 受け取った XML (OUTPUT) ' * return: True: 成功/False: 失敗 ' **** Private Function pbRequestHttp( _ ByVal amUrl As String, _ ByVal amSendXml As String, _ ByRef aoResponseXml As MSXML2.DOMDocument _ ) As Boolean Dim doHttp As New MSXML2.XMLHTTP pbRequestHttp = False doHttp.Open "post", amUrl, False doHttp.setRequestHeader "Content-Type", "text/xml;charset=UTF-8" doHttp.setRequestHeader "SOAPAction", """""" doHttp.send amSendXml If doHttp.Status <> 200 Then Exit Function Set aoResponseXml = doHttp.responseXML pbRequestHttp = True End Function
1.ログイン
まず、Salesforce にログインし、セッション情報を取得する必要があります。 パラメータには以下の XML を設定します。
<?xml version="1.0" encoding="utf-8"?> <env:Envelope > <env:Body> <n1:login > <n1:username>#username#</n1:username> <n1:password>#password#</n1:password> </n1:login> </env:Body> </env:Envelope>
ログインに成功すると、以下のようなレスポンスが返ってきます。
<soapenv:Envelope > <soapenv:Body> <loginResponse> <result> <metadataServerUrl>https://**********</metadataServerUrl> <passwordExpired>false</passwordExpired> <sandbox>false</sandbox> <serverUrl>https://**********</serverUrl> <sessionId>**********</sessionId> <userId>**********</userId> <userInfo>...</userInfo> </result> </loginResponse> </soapenv:Body> </soapenv:Envelope>
レスポンスから sessionId, metadataServerUrl を取得し、次の処理を行います。 VBA ソースは以下の通り。
Dim dmXml As String Dim doXml As MSXML2.DOMDocument ' **** ログイン処理 **** ' ログイン用 XML 作成 dmXml = Constants.XML_LOGIN dmXml = Replace(dmXml, "#username#", "**********") dmXml = Replace(dmXml, "#password#", "**********") ' ログイン URL ' ※ SandBox の場合は、https://test.salesforce.com/services/Soap/u/41.0 Dim dmLoginUrl As String dmLoginUrl = "https://login.salesforce.com/services/Soap/u/41.0" ' ログイン If Not pbRequestHttp(dmLoginUrl, dmXml, doXml) Then Exit Sub ' セッションID、MetadataApi 用 URL を取得 Dim dmSessionId As String Dim dmMetadataServerUrl As String dmSessionId = doXml.getElementsByTagName("sessionId").Item(0).Text dmMetadataServerUrl = doXml.getElementsByTagName("metadataServerUrl").Item(0).Text
2.メタデータ(カスタム表示ラベル)取得
次にカスタム表示ラベルを含むメタデータを取得します。メタデータ API の retrieve() をコールします。 パラメータには以下の XML を設定します。
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope > <soap:Header> <SessionHeader > <sessionId>#sessionId#</sessionId> </SessionHeader> </soap:Header> <soap:Body> <retrieve > <retrieveRequest> <apiVersion>41.0</apiVersion> <singlePackage>true</singlePackage> <unpackaged> <version>41.0</version> <types> <name>CustomLabels</name> <members>*</members> </types> <types> <name>Translations</name> <members>*</members> </types> </unpackaged> </retrieveRequest> </retrieve> </soap:Body> </soap:Envelope>
今回はカスタム表示ラベルとその翻訳情報を取得するので types に CustomLabels, Translations を指定していますが、この types に指定する内容によって、Apex コードやオブジェクト、プロファイル情報等、さまざまなメタデータを取得することができます。 コール後、以下のようなレスポンスが返ってきます。
<?xml version="1.0"?> <soapenv:Envelope > <soapenv:Body> <retrieveResponse> <result> <done>false</done> <id>**********</id> <state>Queued</state> </result> </retrieveResponse> </soapenv:Body> </soapenv:Envelope>
メタデータ取得の処理は時間が掛かる事があるため、非同期で実行されます。retrieve() コール時に salesforce 側で処理が開始され、id が返ってきます。この id を元に、処理状況を確認する API checkRetrieveStatus() を定期的にコールし、処理が完了したかを確認します。 checkRetrieveStatus() のコールには以下の XML を設定します。
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope > <soap:Header> <SessionHeader > <sessionId>#sessionId#</sessionId> </SessionHeader> </soap:Header> <soap:Body> <checkRetrieveStatus > <id>#id#</id> </checkRetrieveStatus> </soap:Body> </soap:Envelope>
処理が完了すると、以下のようなレスポンスが返ってきます。
<soapenv:Envelope > <soapenv:Body> <checkRetrieveStatusResponse> <result> <done>true</done> <id>**********</id> <status>Succeeded</status> <success>true</success> <zipFile>****************************************</zipFile> … </result> </checkRetrieveStatusResponse> </soapenv:Body> </soapenv:Envelope>
done の値を確認し、true であれば処理完了です。false の場合はまだ処理中ですので、再度 checkRetrieveStatus() をコールし、処理が完了するまで繰り返します。success の値を確認し、処理が成功 (true) したかを判断します。処理が成功した場合、メタデータが ZIP ファイル(base64 エンコード)で返されます。次はこの zipFile の値を処理します。 ここまでの VBA ソースは以下の通り。
' **** メタデータ(カスタム表示ラベル)取得処理 **** ' メタデータ取得用 XML 作成 dmXml = Constants.XML_CUSTOM_LABELS dmXml = Replace(dmXml, "#sessionId#", dmSessionId) ' メタデータ取得 API 呼び出し(非同期) If Not pbRequestHttp(dmMetadataServerUrl, dmXml, doXml) Then Exit Sub ' API コールの ID を取得 Dim dmId As String dmId = doXml.getElementsByTagName("id").Item(0).Text ' メタデータ取得 API 状況確認用 XML 作成 dmXml = Constants.XML_CHECK_RETRIEVE_STATUS dmXml = Replace(dmXml, "#sessionId#", dmSessionId) dmXml = Replace(dmXml, "#id#", dmId) ' メタデータ取得 API 状況確認 Dim dbDone As Boolean Do Sleep 1000 If Not pbRequestHttp(dmMetadataServerUrl, dmXml, doXml) Then Exit Sub ' done 項目が True で完了 dbDone = CBool(doXml.getElementsByTagName("done").Item(0).Text) Loop Until dbDone ' メタデータ取得 API 結果確認 Dim dbSuccess As Boolean dbSuccess = CBool(doXml.getElementsByTagName("success").Item(0).Text) If Not dbSuccess Then Exit Sub ' メタデータ取得(ZIP ファイル base64 エンコード) Dim dmZipData As String dmZipData = doXml.getElementsByTagName("zipFile").Item(0).Text
※ Do Loop 内で “Sleep 1000” とありますが、これは WindowsApi を使用しています。(1秒待機) モジュール冒頭で以下を定義しています。
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal alMsec As LongPtr)
3.メタデータの展開
次は取得した ZIP ファイル(base64 エンコード)を処理し、メタデータのファイルを取り出します。 VBA での base64 のデコード処理はこんな感じです。
' **** ' * base64 デコード処理 ' * ' * amString: base64 エンコード文字列 ' * return: デコードデータ(バイナリ) ' **** Private Function pbDecodeBase64(ByVal amString As String) As Byte() Dim doXmlDoc As Object Dim doElm As Object Set doXmlDoc = CreateObject("MSXML2.DOMDocument") ' base64 to byte array Set doElm = doXmlDoc.createElement("b64") doElm.DataType = "bin.base64" doElm.Text = amString pbDecodeBase64 = doElm.nodeTypedValue End Function
デコード後は、ファイルに出力⇒解凍の流れとなります。ZIP ファイルの解凍は Shell32 ライブラリを使って行います。ここまでの処理を踏まえて、ZIP ファイルの解凍処理は以下のようになります。
' **** ' * ZIP ファイル解凍処理 ' * ' * amZipData: ZIP ファイルデータ(base64 エンコード文字列) ' * amUnzipRootFolder: ZIP ファイル解凍先フォルダ (OUTPUT) ' **** Private Sub pUnzipData(ByVal amZipData As String, ByRef amUnzipRootFolder As String) ' base64 デコード Dim dvZipBin() As Byte dvZipBin = pbDecodeBase64(amZipData) ' 出力する ZIP ファイルのパスを作成(テンポラリフォルダに作成) Dim doFso As New Scripting.FileSystemObject Dim doTempFolder As Scripting.Folder Dim dmZipFile As String Set doTempFolder = doFso.GetSpecialFolder(TemporaryFolder) Do dmZipFile = doFso.BuildPath(doTempFolder.Path, doFso.GetTempName()) & ".zip" Loop While doFso.FileExists(dmZipFile) ' ZIP ファイルを出力 Dim diFileNo As Integer diFileNo = FreeFile() Open dmZipFile For Binary As #diFileNo Dim i As Long For i = 0 To UBound(dvZipBin) Put #diFileNo, , dvZipBin(i) Next i Close #diFileNo ' ZIP ファイル解凍先フォルダの作成(テンポラリフォルダに作成) Do amUnzipRootFolder = doFso.BuildPath(doTempFolder.Path, doFso.GetTempName()) Loop While doFso.FolderExists(amUnzipRootFolder) doFso.CreateFolder amUnzipRootFolder ' ZIP ファイル解凍 Dim doShell As New Shell32.Shell Dim doZip As Shell32.Folder Set doZip = doShell.Namespace(dmZipFile) Dim doUnzipFolder As Shell32.Folder Set doUnzipFolder = doShell.Namespace(amUnzipRootFolder) doUnzipFolder.CopyHere doZip.Items ' ZIP ファイルを削除 doFso.DeleteFile dmZipFile End Sub
メイン処理
' **** メタデータの展開 **** 'ZIP ファイルを解凍 Dim dmUnzipRootFolder As String pUnzipData dmZipData, dmUnzipRootFolder
4.カスタム表示ラベル取得情報の読み込み
ここまで来ればあとは、メタデータを読み取って Excel に出力するだけです。 試しに以下のカスタム表示ラベルを作成してみました。 ZIP ファイルを解凍したメタデータは以下の構成になっています。
フォルダ構成
|-- labels | +-- CustomLabels.labels |-- translations | +-- en_US.translation +-- package.xml
※今回は翻訳設定が英語のみなので translation は en_US のみですが、 複数言語を設定している場合、言語分ファイルが作成されます。
CustomLabels.labels
<?xml version="1.0" encoding="UTF-8"?> <CustomLabels > <labels> <fullName>LBL_APPLE</fullName> <categories>果物</categories> <language>ja</language> <protected>true</protected> <shortDescription>説明1</shortDescription> <value>りんご</value> </labels> <labels> <fullName>LBL_CHERRY</fullName> <categories>果物</categories> <language>ja</language> <protected>true</protected> <shortDescription>説明3</shortDescription> <value>さくらんぼ</value> </labels> <labels> <fullName>LBL_MELON</fullName> <categories>果物</categories> <language>ja</language> <protected>true</protected> <shortDescription>説明2</shortDescription> <value>メロン</value> </labels> </CustomLabels>
en_US.translation
<?xml version="1.0" encoding="UTF-8"?> <Translations > <customLabels> <label>Apple</label> <name>LBL_APPLE</name> </customLabels> <customLabels> <label>Cherry</label> <name>LBL_CHERRY</name> </customLabels> <customLabels> <label>Melon</label> <name>LBL_MELON</name> </customLabels> </Translations>
VBA はこんな感じで組みました。
' **** カスタム表示ラベル取得情報の読み込み **** ' トランスレーション(翻訳)情報の読み込み Dim doFso As New Scripting.FileSystemObject Dim doFile As Scripting.File Dim dcTranslations As New Scripting.Dictionary If doFso.FolderExists(dmUnzipRootFolder & "translations") Then ' translations フォルダ配下のファイルを読み込み For Each doFile In doFso.GetFolder(dmUnzipRootFolder & "translations").Files doXml.Load doFile.Path Dim doNode As MSXML2.IXMLDOMNode Dim dmTranslation As String dmTranslation = doFso.GetFileName(doXml.Url) For Each doNode In doXml.getElementsByTagName("customLabels") Dim dmName As String Dim dmLabel As String dmName = doNode.SelectSingleNode("name").Text dmLabel = doNode.SelectSingleNode("label").Text If dmLabel <> "" Then If Not dcTranslations.Exists(dmName) Then dcTranslations.Add dmName, New Scripting.Dictionary dcTranslations(dmName)(dmTranslation) = dmLabel End If Next doNode Next doFile End If ' カスタム表示ラベル情報の読み込み Dim dcRecords As New Collection Dim dcRecord As Scripting.Dictionary Dim dcFieldInfo As Scripting.Dictionary Dim doField As MSXML2.IXMLDOMNode Dim dvKey As Variant Set dcFieldInfo = New Scripting.Dictionary ' CustomLabels.labels の読み込み doXml.Load dmUnzipRootFolder & "labelsCustomLabels.labels" For Each doNode In doXml.getElementsByTagName("labels") Set dcRecord = New Scripting.Dictionary For Each doField In doNode.ChildNodes dcRecord.Add doField.nodeName, doField.Text Next doField If dcTranslations.Exists(dcRecord("fullName")) Then For Each dvKey In dcTranslations(dcRecord("fullName")).Keys dcRecord.Add dvKey, dcTranslations(dcRecord("fullName"))(dvKey) Next dvKey End If dcRecords.Add dcRecord Next doNode ' メタデータの削除 doFso.DeleteFolder dmUnzipRootFolder
5.カスタム表示ラベル情報を出力
Excel シートに出力します。VBA はこんな感じです。
' **** カスタム表示ラベル情報を出力 **** Dim doRange As Excel.Range Dim doCell As Excel.Range Dim dvRange As Variant Dim i As Long Dim j As Long Set doCell = Application.ActiveCell Set doRange = Application.Range(doCell, doCell.Offset(dcRecords.Count, dcRecords(1).Count - 1)) dvRange = doRange ' 表ヘッダ行を設定 Set dcRecord = dcRecords(1) For i = 0 To dcRecords(1).Count - 1 dvRange(1, i + 1) = dcRecord.Keys(i) Next i ' カスタム表示ラベル情報を設定 For i = 1 To dcRecords.Count Set dcRecord = dcRecords(i) For j = 1 To dcRecords(1).Count dvRange(i + 1, j) = dcRecord(dvRange(1, j)) Next j Next i ' シートに出力 doRange = dvRange
できました! という事で今回はカスタム表示ラベルを出力させる事ができました。 次は、オブジェクト定義の出力や Excel 上でのデータの更新・削除にチャレンジしたいと思います。
こんにちは!
情報システム部インフラ担当のアンドウです。
二回目の今回は、「Windows 10」の能や使い方・基本操作・よく使う機能や便利な設定などを紹介していきます。。
「GodMode を表示する」について
GodMode とは、Windows のあらゆる設定を一覧形式で表示できる隠しモードのことです。
コントロールパネルを探し回らなくても、簡単に目的の設定を見つけられます。
[デスクトップ] を右クリックし、[新規作成] から [フォルダー] をクリックします。
ファイル名をGodMode.{ED7BA470-8E54-465E-825C-99712043E01C}にします。
フォルダーアイコンからGodModeアイコンに代わりました。
開くと コントロールパネルの内容が一覧で表示されます。
コントロールパネルに比べリスト表示されてるので、目的のものが探しやすくなったのではないでしょうか。
システム運用・管理サポートサービス
弊社では、お客様の抱えているシステムの問題について全て当社が対応いたします。また、今後、システムの導入を検討もしくは、入れ替えを検討されているお客様につきましては、最適なハードウェア・ソフトウェア・ネットワーク等を当社からご提案いたします。
詳しくはこちらをご参照ください。
こんにちは!
情報システム部インフラ担当のアンドウです。
今回からは、「Windows 10」の新機能や使い方・基本操作・よく使う機能や便利な設定などを紹介していきます。
間もなく次期「Windows 10」アップデート「Fall Creators Update」がリリースされる予定ですが、まずは基本的な事から紹介していきます。
「仮想デスクトップ」について
仮想デスクトップを使用すると、デスクトップ毎にウィンドウを分けて表示できるようになります。
1つ目のデスクトップには Excel、2つ目のデスクトップには Word、3つ目のデスクトップにはブラウザを表示して、と言う様に。
多くのウィンドウを開いていると切り替えるのが大変です。
仮想デスクトップではそのデスクトップに表示されているウィンドウのみタスクバーに表示されるので、ウィンドウの切り替えが簡単になります。
仮想デスクトップの操作方法
仮想デスクトップのショートカットキー
Win + Tab :タスクビューを表示します。
Win + Ctrl + D :新しいデスクトップを作成します。
Win + Ctrl + ← :前のデスクトップに切り替えます。
Win + Ctrl + → :次のデスクトップに切り替えます。
Win + Ctrl + F4 :開いているデスクトップを削除します。
●タスクバーがウィンドウでいっぱいになった場合は、仮想デスクトップを作成して、デスクトップごとにアプリケーションを使い分けると操作がしやすくなります。
既に開いているウィンドウを別のデスクトップに移動する
新しいデスクトップを作成します。
タスクビューを表示します。
ウィンドウを移動先のデスクトップにドラッグします。
移動できました。
すべてのデスクトップで表示する
特定のウィンドウをすべてのデスクトップで表示したい場合は、
タスクビューを表示します。
表示したいウィンドウを右クリックして 、[このウィンドウをすべてのデスクトップに表示する] または [このアプリのウィンドウをすべてのデスクトップに表示する] をクリックします。
全てのウィンドウに表示できました。
仮想デスクトップを削除する
タスクビューを表示します。
タスクビューから削除したいデスクトップの [X] をクリックします。
そのデスクトップが削除され、そこで開いていたウィンドウは前のデスクトップに移動されます。
ウィンドウが閉じられることはありません。
システム運用・管理サポートサービス
弊社では、お客様の抱えているシステムの問題について全て当社が対応いたします。また、今後、システムの導入を検討もしくは、入れ替えを検討されているお客様につきましては、最適なハードウェア・ソフトウェア・ネットワーク等を当社からご提案いたします。
詳しくはこちらをご参照ください。
こんにちは!
今回は以前のプロジェクトで、ユーザのデータを移行したときに、はまった話をしたいと思います。
皆さまはSalesforceにユーザを作成する場合、ユーザのパスワードはどのように設定しているでしょうか。
殆どの場合は、ユーザ作成時か任意のタイミングで画面から「パスワードリセット」を行ない、 実際に利用するユーザの方にパスワードを設定していただいていると思います。
ただ、そのパスワードリセットが使えないケースも稀にありますよね。
・何らかの理由でユーザにメールを送りたくない
・ログイン可能なIP範囲とメールを利用するネットワークが異なる
・同一の仮パスワードを一括で設定したい etc…
今回はそういった理由により、パスワードリセットが利用できない場合のパスワード設定方法についてです。
ユーザパスワードを設定する方法
ユーザオブジェクトを登録した後に、パスワードを設定するには、開発者コンソールからSystem.setPasswordメソッドを使用できます。
Apex 開発者ガイド (Page: 2761) https://resources.docs.salesforce.com/204/latest/ja-jp/sfdc/pdf/salesforce_apex_language_reference.pdf
開発者コンソールの匿名実行Apexツールで実行
開発者コンソールの
[Debug]->[Open Execute Anonymous Window]
で匿名実行Apexツールを開き、 下記コードを貼り付けて[Execute]ボタンをクリックします。
system.setPassword('hogehogehogehoge','test0001');
上記のサンプルでは、hogehogehogehogeがユーザーID、test0001が登録したいパスワードです。
実行するとこんな感じになります。
以下のサンプルコードでは、すべてのアクティブユーザーのパスワードを設定しています。
List<User> users = [SELECT Id, Username FROM User WHERE isActive = true ORDER BY Username ]; for(User u : users){ System.setPassword(u.Id, 'Salesforce0000'); }
注意点
151人以上のアクティブユーザーがいる場合、ガバナ制限に引っ掛かり、エラーが発生します。(2017年11月現在)
パスワードを設定するための各呼び出しが1つのDMLステートメントと見なされるため、150を超えるユーザーには機能しません。
「System.LimitException: Too many DML statements: 151」
もし、パスワードを設定する必要がある場合は、ガバナ制限にも注意して利用しましょう。
正しく利用すると大変便利な機能ですが、安易に利用すると、パスワード変更をすべきではないユーザの パスワードも、誤って変更してしまう可能性があります。
ご利用の際には、用途、目的、実行者を明確にした後、利用するようにしてください。
※初期データ移行の時以外は、パスワードリセットボタンの運用をお勧めします!
こんにちは。いそべ@NSD走遊会メンバーです。
2017年10月15日(日)、第46回タートルマラソン国際大会 in 足立に参加しました!
今回、当社からは社長含め4名がハーフマラソンに挑戦しました。
コースは北千住から赤羽付近まで荒川河川敷を走り、折り返し戻ってくるといった比較的平坦で走りやすいコースとなっています。
ただ、当日は朝からあいにくの雨で、スタート地点の虹の広場は足場が悪く走る前から靴が泥まみれでした。
それでも多くのランナーがマラソンを走るために集まっていました。
走り始める前は雨に打たれて肌寒かったですが、走り始めると徐々に体もあったまってきて、気持ちよく走れました(途中までは・・・;)。
残り5キロを切ったあたりからなかなか足が前に進まなくなり、最後はだいぶペースが落ちてしまいましたが、なんとか完走することができました。
今回、NSD走遊会メンバーは途中棄権することなく全員完走しました!
社長は大会直前に腰痛で出場が危ぶまれていたにも関わらず、見事に走り切っていました!さすがです^^
走ったあとは恒例の反省会です。
といっても私は今回初参加ですが・・・
雨に打たれて冷えた体を鍋で暖めます。
NSD走遊会として、次は来年1月21日(日)の赤羽ハーフマラソンに参加する予定なので、そこに向けてまた練習に励んでいきます!応援よろしくお願いします^^
こんにちは!。
今回はTrailhead のバッジ関連の話題から、Superbadge について、取得してみた感想等を書かせていただこうと思います。
Superbadgeとは
Superbadge についてご存知ない方もいらっしゃるかと思いますので、簡単に説明いたしますと、
名前の通り、Trailheadのスーパーなバッジです!(・ω・´)
通常のバッジの取得は『Salesforceに関するスキルや知識を習得してます』という証明になりますよね。
それに加え、Superbadge はそのスキルや知識を『実際のビジネス要件に適用できる能力もありますよ!』という証明になるのです!
折角Trailhead を頑張るなら、Superbadge にもチャレンジしたいところですよねっ!!(´∀`* )
取り方
Superbadge は通常のバッジと異なり、モジュール単体のクリアでは取得できません。
前提となるバッジが複数あり、それらを取得してはじめてSuperbadge に挑戦することができます。
設問には抽象的なビジネス要件が記載されているので、それらを元にハンズオン組織を開発、
ビジネス要件通りのシステムが構築できたら、晴れてバッジ取得です(・ω・ *)
今回取得したバッジ
今回、私が取得したSuperbadge はこちら
↓↓ ◆Apex Specialist
こちらのSuperbadge の前提となるバッジは以下の通りです。
◆前提となるバッジ
・Apex トリガ
・Apex テスト
・非同期 Apex
・Apex インテグレーションサービス
※取得順はこの通りでなくても問題ありません。
「Apex Specialist」は前提となるバッジのラインナップからも判る通り、Apex の開発スキルを試されるバッジとなります。
前提バッジで学んだApexトリガやAPI の知識を駆使して、ビジネス要件に沿ったシステムを構築できるかどうか、が取得のカギとなります。
感想
ざっくり言いますと、前提バッジの総復習でした。
設問に記載されたビジネス要件を、Apex トリガ、Apex ジョブのスケジュールや API 連携等を結び付け、実装し、正しく実装できているかを確認する、の繰り返し。
そうやって、ビジネス要件を理解し、設計、実装、テストまで実施する、という一通りの構築作業を通して、 自分のSalesforce スキルの長所や短所を振り返ることができ、すこし自信のなかった分野についてはスキルアップすることができました!
知れば知るほど奥が深いApex ではありますが、このSuperbadge の取得を通して、少しはSpecialist に近づけたのではないかと思います!(・ω・´)
あと、余談ですが、通常のバッジと違い日本語に翻訳されていないのが結構大変でした・・・(・ω・`)
とはいえ、辞書サイト等をフルに活用すればそこまでハードルは高くありませんでしたので、 少しでも興味がある方はぜひ挑戦してください!
こんにちは!
今回はおよそ4年4か月前の情報の更新です。 当時の記事はこちら。 Salesforceログインを超簡単にする方法!
ここで紹介されている、「Force.com LOGINS」を現役で使っている方も多いのではないでしょうか?
わたしも数か月前までは上記のものを便利だと思って使っていたのですが、アイコンがSalesforce なのになんでオレンジなの?とか、
フォントが見にくいとか微妙に歯がゆいところがあるんですよね。
同じような拡張機能を探していて、よかったものを紹介します。
Salesforce のLOGINをかわゆく簡単に!
それがこちらです。
公式サイトはこちらから↓
http://www.synebo.io/products/salesforce_logins_extension_for_google_chrome
基本的な操作方法は「Force.com LOGINS」と同じなので、使いにくさはほとんどありません。
また、インポート機能を使うと 「Force.com LOGINS」からエクスポートしたアカウント情報をそのままインポートすることができるので、移行も楽です。
この拡張機能の一番のいいところは、環境によってアイコンの色が自動で変わることです。
水色は本番環境、グレーはsandobox、濃い青はdevelopper環境です。
似たような名前を付けてしまって、アカウント情報の詳細を見て確認していたって方もいらっしゃるのではないでしょうか?
これだとアイコンの色を見て、判断ができるので選択肢がぐっと減ってストレスなく操作できます。
今のところアカウント数に制限がない(MAX500アカウントくらい)ようですので、もし他の拡張機能を探している方がいらっしゃったらこちらはいかがでしょうか?
では、また次回。
こんにちは!
今回は皆さんに、Trailheadのオススメのモジュールをビジネスユーザ向け、システム管理者向け、開発者向けの3つご紹介します。
ビジネスユーザ(非開発者)向け
始めにビジネスユーザ向けモジュールとしてオススメなのが「Chatter の基礎 (ユーザ向け)」です。
このモジュールではChatterの基本的な使い方を学ぶことができます。
ChatterはSalesforce内で利用できる便利なコミュニケーションツールです。
一番のオススメポイントは、様々な機能を実際に使用しながら学ぶことができるところです。
このモジュールをやるだけで通常の投稿だけでなく、アンケートや質問といった機能も使いこなせます!
システム管理者向け
続いてシステム管理者向けとしてオススメなのが「クイックスタート: プロセスビルダー」です。
このモジュールではプロセスビルダーの使い方を学ぶことができます。
プロセスビルダーはレコードが作成された時や編集された時、 自動でレコードの更新やChatter投稿といったアクションを実行してくれる優れた自動化ツールです。
一番のオススメポイントは、作ったプロセスがどういった動きをするのかがとてもわかりやすいことです。
私は初めてプロセスビルダーに触れた際、 コードを1行も書かずにこれだけの機能が使えることにとても驚きました…😱
開発者向け
最後に開発者向けモジュールとしてオススメなのが「Apexトリガ」です。
このモジュールではトリガ (レコードに特定の処理を行う前後に呼び出される機能)の基礎を学ぶことができます。
一番のオススメポイントは、トリガのコンテキスト変数をわかりやすく説明しているところです。
この変数を利用することで、トリガが今どんな状態で、どんな値を持っているのかを確認することができます。
余談ですが私が一番始めに開発で任されたのがカスタムオブジェクトのトリガでした。
始めはうまく作れるか不安でしたが、 このモジュールをやったおかげでほとんどつまずくことなく作成することができました👍
今回は主に初心者向けのモジュールの紹介となりましたが、 Trailheadにはこういった初心者向けのものから中級者や上級者向けの難しいものまで
たくさんモジュールが揃っているため、ぜひぜひ挑戦してみてください。
こんにちは!
今回はタイトルに書いているとおり、今回は開発中にはまったものの紹介。
※なんてことはないケアレスミスの話です!
ブラウザバックに対応した検索画面
今回作成していたのは、Sites。
検索画面で検索結果A→検索結果Bといった状態遷移を、
モバイル対応の一環としてブラウザバックできるようにする、というものでした。
このために実装したのは以下2つ
・histoyAPI でブラウザバック可能にする(※ historyAPI の戻るボタンについてはこちら)
・ブラウザバックに対応するため、すべての画面で直接遷移可能な状態にする
上記2つの実装でブラウザバック自体はできたんです。
ブラウザバック自体は。
パラメータが変わらない
実際に動かしてみるとこんな感じ。
1.検索 パラメータ「keyword=モモンガ」→ 検索 パラメータ「keyword=ハリネズミ」
→
2.検索結果「keyword=ハリネズミ」 からブラウザバック→ 検索結果「keyword=モモンガ 」
→
3.ブラウザバックで表示された画面で検索すると、
検索 パラメータ「keyword=シマリス」のはずなのに「keyword=モモンガ」の検索結果が…
問題はブラウザバックした後でした。
ブラウザバック後に検索しても、検索できない。
正確にいうと、3の時には検索処理は正常に動作しているけど、検索結果が一向に変わらない。
3で起きた現象をたどってみると以下のようになっていました。
A:パラメータ「keyword=シマリス」を渡している
B:パラメータ「keyword=モモンガ」を受け取って正常に検索している
パラメータ名が一緒
たどってみると、?部分のAjaxが保持しているパラメータが、
ブラウザバックした当時(keyword=モモンガ)のものでした。
検索時に<apex:actionFunction/>の<apex:param/> で「keyword=シマリス」を渡していたのですが、
<apex:param/>では「http://test.com?keyword=モモンガ」でもっていたAjax内のパラメータを上書きできていないんです。
ということで、こちらは<apex:param/>を変更して「paramKeyword=シマリス」にすれば問題なく検索できました。
なんてことはないはまりどころなんですが、URLパラメータと、<apex:param/>の名前は同じにしてはいけないと勉強になりました。
まとめ
こんにちは。ツッチー@親睦会BBQ担当です。
2017年度親睦会イベントで、今年も亀有にてBBQを行いました!
当日は、台風15号の影響で昨夜から雨が降り続いており、もし、雨が止まないようなら、キッチンスペースでの飲み会も検討していました。
11時になっても雨が降ってましたが、予報では、段々と晴れてくるとのこと。
参加者も集まってきており、乾杯の11時30分になっても、まだ、多少ぐずついていましたが、絶対、晴れる!と信じ、BBQを行うことで決定!
30分遅れにはなりましたが、12時からBBQ開始しました!
開催概要
日 時:2017年9月2日(土)11時30分~15時
場 所:JR常磐線亀有駅近傍のとあるBBQ施設
天 候:雨後曇り時々晴れ
参加者:24名(従業員+家族含む23名、取引先等1名)
参加費:2,000円
スケジュール:
09:50 集合、買出(やおさだ・業務スーパー・アリオ)
11:00 準備(調理・BBQ施設)
11:30 乾杯・・・12時頃になった
14:30 終了・片付け
15:00 解散
BBQ風景
時間通り9時50分に買出班が亀有駅に集合。
まずは、野菜を買いに、超激安店の「やおさだ」に出発!
お目当ての野菜・果物をGET!
続いて、業務スーパーではし・紙皿・調味料等をGET。最後に肉・野菜・ビール等を仕入れにアリオ亀有へ。
買ってきた食材を調理します!
大量の野菜と海鮮をさばきます!
この時期、さんまも出始めたので、さんま焼きだけではなく、刺身とくし焼きにしてます。
同時にBBQ施設の火を起こします!
手慣れたアオヤマさんが、あっという間に炭に火を付けました^^
参加者も集まり、待ちに待った乾杯です!
肉(牛・豚・鳥等)・海鮮(イカ(漁師風)・エビ・ホタテ・さんま等)・野菜(玉ねぎ・長ネギ・ナス・きのこ等)も焼けてきました!
飲んで・食ってます!
飲んで・食ってます!
飲んで!
食ってます!
最後に記念撮影です^^
でも、本当に晴れてよかった^^
来年もまたやりましょう!