データローダの起動エラー~何をやっても起動しないあなたへ~

はじめに

こんにちは!株式会社オプトプランニングです。
Salesforce(Salesforce.com/セールスフォース・ドットコム、略してSFDC)での気づきを書いていきます。

今回はデータローダ(dataloader)について、インストール後にデータローダの起動ができず困った体験とその解決法をちょっとした気づきとして書いていきます。

私の場合、公式に従いインストール完了後、ホームに作成されたデータローダのアイコンをダブルクリックしても、コマンドプロンプトが一瞬立ち上がりすぐに強制終了するため、データローダは起動しない・エラー内容も見れない、という状態でした。。。

データローダのインストール方法

データローダはSalesforceからインストールできます。
方法は公式ヘルプに動画付きで詳しく説明されているので以下をご覧ください。

データローダのインストール手順

手順に従いインストールしたけど全然起動しない時

データローダの再インストール、OpenJDKのインストールのやり直し(Azul Zulu以外のインストール含む)、PATHの設定確認、JAVA_HOMEの設定変更etc…

何をやってもデータローダが起動しない時は、forcedotcom/dataloader: Salesforce Data Loader – GitHubインストールしたデータローダが最新かどうか確認してみてください。

上記リンク先では、図1のように最新のデータローダのバージョンが確認できます。

図1 dataloader-GitHub
図1 dataloader-GitHub

私の場合、何を試しても上手く行かず、途方に暮れていた時にこちらを発見しました。
(今回は割愛しますが、コマンドプロンプトが強制終了しないようにプログラムを書き換えて、エラー内容を確認しつつ冒頭の設定の見直しなど行いましたが解消できず…)

バージョンの確認をしたところ、Salesforceの設定からダウンロードしたものよりも新しいバージョンのものが配布されており、ダメ元で既にインストールした旧バージョンを全て削除・アンインストールの上、最新版をインストールしたところ普通に起動しました…

手順通りにやっているはずなのに上手く行かないとお困りの方の助けになれば幸いです。

おまけ

このブログを書いていて気づいたのですが、データローダのダウンロード画面が変わったようです。(2022年10月31日現在)
しかし、新しい画面でもデータローダをダウンロードする時に気づかずに旧バージョンを選択する可能性があるかもしれません。

図2 設定のデータローダにあるダウンロードリンク
図2 設定のデータローダにあるダウンロードリンク
図3 ダウンロードリンク先
図3 ダウンロードリンク先

Salesforceの設定からデータローダのダウンロードをしようとすると図2から図3のようなサイトに遷移します。(2022年10月31日現在)

ダウンロードの選択は2つあり(赤枠部分)、左が最新バージョンです。
Windows版、MacOS版の選択はダウンロードボタンの上部にあるそれぞれのアイコンで選択します。

図3をよく見ると、選択されていないMacOS版の方はグレーアウトしているのが分かると思います。
(私の場合、デフォルトではWindows版が選択されていました)

ここで赤枠右側のダウンロードボタンを選択すると旧バージョンのダウンロードが行われてしまいます。

内容を確認せずに、なんとなく左がMacOS版、右がWindows版と思いこんで右側をクリックしてたりするかもしれませんね…

あとがき

今回紹介したforcedotcom/dataloader: Salesforce Data Loader – GitHubは、既にデータローダを使用していて最新版を再インストールしたい方々の参考にもなるかと思います。

また、どうしても旧バージョンをインストールしたい場合はforcedotcom/dataloader: Salesforce Data Loader – GitHubからしかインストールすることができないようです。

Salesforceの設定から行うデータローダのダウンロードですが、2022年9月に行った際は公式の動画のようにリンクではなく直接ダウンロードだったと思います。
直近のリリースで変更されたのかもしれませんね!

今回は実際に困ったので起動エラーについて書きましたが、近いうちにデータローダの使い方も紹介していければと思います。

それでは、またお会いしましょう!!

このやり方知ってる?レポートのドリルダウン

はじめに

こんにちは!株式会社オプトプランニングです。
Salesforce(Salesforce.com/セールスフォース・ドットコム、略してSFDC)であれこれやってみたことを書いていきます。

今回はLightning Experienceでのレポートのドリルダウン(ドリルイン)機能についてあれこれやってみたことを書いていきます。

ドリルダウンのやり方~公式編~

レポートのドリルダウンについては公式ヘルプにやり方が載っていますので、そちらを確認してください。

レポートへのドリルダウンによる詳細の確認

ドリルダウンのやり方~非公式編~

こんなやり方もあります。
(2022年9月時点、公式ヘルプを探しても見つかりませんでしたので、非公式と名付けます。)

それは、グラフからドリルダウンする方法です。

ちなみに、SFDCのレポートでグラフを表示できるのは

  • サマリー形式
  • マトリックス形式

のレポートですので、表形式のレポートは公式の方法同様、対象外となるのでご了承ください。

グラフからのドリルダウンその1

グラフからドリルダウンする方法は2つあります。
1つ目は、表示されているグラフから直接行う方法です。

グラフの種類がドーナツの場合、下図のような赤枠で囲んだ部分を使用します。

図1 レポートグラフ
図1 レポートグラフ

グラフのうち、ドリルダウンしたい色の部分をクリックします。
今回は、フェーズの中から一番多い水色部分の「Closed Won」にあたる部分をクリックしてみます。

すると、以下のようになります。

図2 グラフからのドリルダウンした時のグラフ変化
図2 グラフからのドリルダウンした時のグラフ変化
図3 グラフからドリルダウンした時の表
図3 グラフからドリルダウンした時の表

Closed Wonでドリルインできたことが表からも確認できます。

編集しているわけではないので、もう一度水色部分をクリックしたり、レポートを表示し直すとドリルダウンは解除されます。

グラフからのドリルダウンその2

2つ目は、グラフの凡例から行う方法です。

赤枠部分に凡例が表示されていますが、こちらを使用します。
(凡例は表示させる位置を変更できるので、必ずこの位置にあるとは限りません)

図4 グラフの凡例
図4 グラフの凡例

凡例からドリルダウンする場合も、グラフからの時と同様にドリルダウンしたい凡例をクリックします。
今回は一番下にある「その他」をクリックしてみます。

すると、以下のようになります。

図5 凡例からドリルダウンした時のグラフ変化
図5 凡例からドリルダウンした時のグラフ変化
図6 凡例からドリルダウンした時の表
図6 凡例からドリルダウンした時の表

グラフから行った時と同様にドリルインできました。

エクスポートについて

公式のドリルダウン方法とグラフからのドリルダウン方法それぞれでエクスポートを行ってみるとどうなるかやってみましたが、どちらも同じ内容をエクスポートすることができました。
(エクスポートはどちらも「フォーマット済みレポート」を「Excel形式(.xlsx)」で行いました)

どちらも同じ内容ですが、参考までにエクスポート結果を載せておきます。

図7 左が公式、右がグラフからドリルダウンした時のエクスポート結果
図7 左が公式、右がグラフからドリルダウンした時のエクスポート結果

左が公式のドリルダウン方法でエクスポートを行った場合、右がグラフからのドリルダウン方法で行った場合です。

どちらも「グラフからのドリルダウン1」で行った「Closed Won」でドリルダウンを行い、エクスポートしています。
検索条件の内容を見てみると、どちらも同じ内容になっていることが確認できます。

これにより、グラフからのドリルダウンも全く同じ絞り込みが行えていることがわかりました。

あとがき

公式に載っていませんが、もしかするとレポートを頻繁に見る機会のある方は感覚的・直観的に使っている機能かもしれません。

グラフからドリルダウンを行う場合、メリットとしてはレポートの再表示を行わなくてもドリルダウン前のレポートに戻せる点です。

デメリットとしては、グラフからドリルダウンする場合は複数の項目値を選択することができない点です。
複数の値でドリルダウンを行いたい場合は公式のやり方で行ってください。

今回、説明のために使用したレポートは、Trailheadで勉強した時にインストールしたものに付属していた商談レポートです。
(どのハンズオンChallengeでインストールしたパッケージだったか忘れてしまいました…)
Trailheadを利用したことがある方は、同じレポートがあるかもしれないので、ご自身のハンズオン組織で確認することができると思います。
(もちろん、同じレポートでなくても確認できますよ!)

それでは、またお会いしましょう!!

ヘルスケア通信簿 速報版

こんにちは、株式会社オプトプランニングです。

先日、きょうかいけんぽ広島支部様より、
令和4年度のヘルスケア通信簿 速報版が届きました!

まだ、速報値の段階ではありますが、当社が取り組んでいる
健康経営の結果が現れています。

例えば、
○従業員1人あたりの年間平均医療費が下がっている
○従業員の受診率は現段階で90.0%を超えている
○特定保健指導実施率は、なんと100%!

この調子で、年度末まで行きますよ!
「健康づくりの好循環」をさらに拡大させていきたいと思います。

意外と知らないかも?数式項目の復元について

はじめに

こんにちは!株式会社オプトプランニングです。
Salesforce(Salesforce.com/セールスフォース・ドットコム、略してSFDC)で気づいたことを書いていきます。

今回は、たまたまデータ型が数式のカスタム項目を削除した後に復元しなければいけないことがあり、初めて遭遇した画面だったので書いてみます。

実は、以前書いた削除後のデータについての気づきで数式項目を復元したことはあります。
その時は、「復元できるかどうか」しか着目していなかったため、今回の内容に気づけませんでした…

数式項目を復元したらどうなる…?

数式項目を削除した後に復元し、オブジェクトマネージャから対象の項目の詳細情報を確認してみると、数式オプション部分に以下のような文面が表示されます。

この数式は、項目が削除されたときに無効になりました。もう一度有効にするには、編集して保存してください。

図1 復元後の数式項目詳細画面
図1 復元後の数式項目詳細画面

復元後にひと手間

復元した数式項目を有効にするには、数式オプションに書かれているように「編集して保存」するひと手間が必要になります。

やり方はいたって簡単。

文面通り「編集」ボタンを押して「保存」するだけです。

編集画面を開いても特にエラーは出ず、何かする必要もありませんので「保存」をクリックします。
(もちろん、何か編集しても構いません)

図2 復元後の数式項目編集画面
図2 復元後の数式項目編集画面

保存後は項目詳細画面に戻ります。
数式オプションを見てみると先ほどの文面が消えているのが確認できます。

これで有効化の完了です!!

図3 復元後、有効化された数式項目詳細画面
図3 復元後、有効化された数式項目詳細画面

項目削除についての補足

削除時の表示について

項目を削除する時の表示内容について、削除後のデータについての気づきではどんな画面が表示されるか載せただけだったので、内容について見ておきたいと思います。

この表示は数式項目だけでなく、どのデータ型のカスタム項目を削除しても表示される内容です。

まずは、削除する際の内容です。

図4 項目削除時のポップアップ
図4 項目削除時のポップアップ

項目を削除しようとすると、このようなポップアップが出ます。

連動項目や制御項目、割り当てルールやエスカレーションルールに削除予定の項目が使用されていないか把握しておく必要があることが分かります。

復元時の表示について

次に、項目の復元時に表示される内容です。
削除時と同様、どのデータ型のカスタム項目を復元しても表示されます。

図5 項目復元時に表示される画面
図5 項目復元時に表示される画面

実は、ここに数式について言及があります!!
また、手動で変更を戻す必要があることも記載があります。

他にも、

  • ページレイアウトからは削除されたまま
  • API参照名は「×××_del」に変更される
  • すべてのレポート・レポートタイプから削除されたまま
  • AppExchangeパッケージに直接含まれている場合、削除されたまま

などがありますので、注意が必要です。

ページレイアウトに関しては復元後すぐに気づいて対応しそうですが、レポートに関しては作成しているものがない場合、削除されたままになっていることに気づかず、修正しないまま後から困りそうな部分です。

また、すでにレポートを作成している場合で、削除予定の項目をレポートで使用していてもエラーが出ることなく削除できてしまう点は注意が必要です。
しかも、列や行での使用だけでなく絞り込み条件として項目を使用している場合でもエラーが出ることなく削除できてしまいます。

対処法としては、削除前に項目の使用場所を確認しておくぐらいしかないと思います。

API参照名について

項目の復元時に表示される内容のうち、

  • API参照名が ×××_del に変更されました。

という部分について、少し言及したいと思います。

API参照名(項目名)は、削除した時に「×××_del」に自動で変更されます。
このことは、項目を削除した後に「削除済み項目」の一覧を見ると分かります。

図6 削除前のAPI参照名
図6 削除前のAPI参照名
図7 削除後のAPI参照名
図7 削除後のAPI参照名

復元したときにAPI参照名が変わるというよりは、削除したときに変更されたAPI参照名「×××_del」のまま復元される、といった方が正しいような気がしますが、復元前後でAPI参照名が変わってしまうことに注意してください。

もちろん、項目を削除してから復元するまでの間に同じAPI参照名の項目を作成していない場合は、復元後に編集する(「_del」部分を消す)ことで、削除前と同じAPI参照名に戻すことができます。

あとがき

フローやApexなどで使用している項目は、削除しようとしてもエラーが出て削除ができませんが、レポートの場合、エラーが出ることなく削除できてしまいます。

そのため、削除項目を復元後にレポートやダッシュボードの動作がおかしい場合は復元した項目を該当レポートで使用していないかの確認を行った方がいいと思います。

また、復元した項目をレポートで使用したいのに見つからない場合は、レポートタイプ設定から項目を再設定する必要があることにも注意が必要です。

やはり、復元が簡単にできるからといっても万能なわけではないので(削除時点でAPI参照名は変わってしまうし)安易に削除・復元しないことが一番よさそうだな、というのが個人的な感想です。

それでは、またお会いしましょう!!

関連記事
削除後のデータについての気づき

ひろしま企業健康宣言 2022

こんにちは、株式会社オプトプランニングです。

2022年8月12日付で、当社は協会けんぽ広島支部様より、
「ひろしま企業健康宣言 健康づくり優良事業所」に認定されました!
昨年に続き、2年連続 5つ星です!!

当社の令和3年度(令和3年4月~令和4年3月)の取組みですが、
基本はもちろん、身近に出来ることから力をいれてきました!

まずは、特定保健指導を社員全員に実施しました。
全員の健康診断後、直接対面で行ったり、WEB面談でお願いもしました。

昨年度好評で、既に定着しつつある社内運動大会も継続して開催、
新しい取り組みとしては、朝のストレッチもやってみました。
広く認識を深めるために、認知症サポーターの講座も受講しています。


当社の健康経営に関する取り組みは、
コーポレートサイトの「健康経営のページ」をご覧ください!
https://www.opt-p.co.jp/initiatives/#link_sec_02


これからも、従業員のみなさんの健康づくりを支えてきたいと思います!

社内 野の花画伯から その4

向日葵(ひまわり)

花言葉は、「憧れ」、「情熱」、「あたなだけ見つめる」、など、
太陽に向かって花が咲く、花の向きが変わる、日廻り(ひまわり)と呼ばれています。
元気/明るいイメージでポジティブな花言葉が多く、友人にエールを送りたい時や
プロポーズの際にもピッタリな花です。

種も栄養価が高くて、種からとれるひまわり油も効果効能も非常に高く、
ビタミン、ミネラルがたくさん含まれる優れものです。

今回は、岡山の吉備路を「ダーマトグラフ」という色鉛筆で
暑さに負けないよう、太目に描きました。

AWS CLIで情報を出力しようVPC編(Linux版-その3)

VPCにはどの様な情報があるのだろうか?。一番気になるのは,CIDR,サブネット,どのようにしたら見れるのだろうか?

             図A VPCの一覧を図で書いてみる

1.利用中のリージョンのVPC情報を出力しよう

利用中のVPC一覧を出力する場合は、以下のコマンドを実行します。

aws aws ec2 describe-vpcs

              図B VPC一覧出力

json形式で出力されます。

2.必要な情報のみ出力するようにしましょう

オプションのqueryを使用することで絞り込みができます。
以下の例は、CIDRとVPC名に絞った例です。トップレベルがVpcs,で(画像B 階層と項目)
CidrBlockとtags[0]をdict{}に配置させます。

aws ec2 describe-vpcs \
--query "Vpcs[].[{CIDR:CidrBlock,Name:Tags[0].Value}]" \
--out table

オプションのqueryを使用することで絞り込みができます。
–query オプションの順番を変えても出力順序は変わりません。CIDRが先に出力されます

aws ec2 describe-vpcs \
--query "Vpcs[].[{Name:Tags[0].Value,CIDR:CidrBlock}]" \
--out table

           図C 項目を絞って出力

VPCのCIDRとVPC名を出力できました。

3.必要な情報(追加)出力するようにしましょう

オプションのqueryを使用することで絞り込みができます。
以下の例は、CIDRとVPCIdにVPCの名前を追加した例です。トップレベルがSubnets,で
(画像D 階層と項目)CidrBlockとVpcIdをdict{}に配置させます。

aws ec2 describe-vpcs \
--query "Vpcs[].[{CIDR:CidrBlock,Name:Tags[0].Value,VpcId:VpcId}]" \
--out table

            図D CIDRとVPC名とVPCID

VPCのCIDRとVPC名とVPCIDを出力できました。

4.サブネット情報を出力してみましょう

VPCの情報出力では、サブネットの情報は出力されないので、サブネット情報
を出力するコマンドでサブネット情報を出力しましょう。

aws ec2 describe-subnets

             図E サブネット情報

サブネットの情報がjson形式で出力されます。

5.必要な情報のみ出力するようにしましょう

オプションのqueryを使用することで絞り込みができます。
以下の例は、CIDRとVPCIdに絞った例です。トップレベルがSubnets,で(画像E サブネット情報)
VPCid,CidrBlock,Nameを出力させます。

aws ec2 describe-subnets --query "Subnets[].[VpcId,CidrBlock,Tags[0].Value]" \
--out table

              図F サブネットのCIDRとVPCID

サブネットのCIDRとVPCIDが出力されます。

6.VPCとサブネットの情報を出力しよう

VPCの情報出力では、サブネットの情報は出力されないので、サブネット情報
を出力するコマンドとVPC-Idをfilterに指定してサブネット情報を出力しましょう。

aws ec2 describe-subnets \
--filters "Name=vpc-id,Values=vpc-0e628XXXXXXXXYYYY" \
--query "Subnets[].{CIDR:CidrBlock,VpcId:VpcId,Name:Tags[?Key=='Name'].Value}" \
--out table

         図G サブネットとVPCID

VPCIDをフィルターして、このVPCにどんなサブネットがあるのかがわかります。

7.VPC CIDRとサブネット CIDRを出力しよう

サブネットの情報(CIDR)とVPCのCIDRを出力したい。これにはちょっと工夫が必要です。
コマンド一発というわけにはいかないのです。他に方法があるかもしれません。

aws ec2 describe-subnets --query "sort_by(Subnets[].{VpcId:VpcId,SubnetCIDR:Cidr
Block,AZ:AvailabilityZone},&VpcId)" \
--out table > subnet.txt
aws ec2 describe-vpcs \
--query "Vpcs[].[{CIDR:CidrBlock,VpcId:VpcId}]" \
--out text > vpc.txt
./replace.py

more replace.py
#!/usr/bin/env python3
import textfile
list_from_vpcs = []
with open('vpc.txt') as f:
	reader = csv.reader(f, delimiter='\t')
	list_from_vpcs = [rows for rows in reader]
for vpc in list_from_vpcs:
	textfile.replace('subnet.txt',vpc[1],vpc[0])
textfile.replace('subnet.txt','VpcId','VpcCIDR')
            図H サブネットCIDRとVPCCIDR

先ず,サブネットの情報をサブネットのCIDRでソートしてsubnet.txtに出力させます。次に,vpc.txtにvpc情報を出力させます。そして、subnet.txtのファイルの中身を、vpc.txtのvpcIDと一致する項目をCIDRに置き換えています。また、表示名をVpcIdからVpcCIDRに変更しています。これで、サブネットとVPCの関係がわかります。

8.InternetGWの情報を出力しよう

InternetGWの情報を必要な項目のみ出力してみましょう

aws ec2 describe-internet-gateways \
--query "InternetGateways[].[{VPC_id:Attachments[0].VpcId,Name:Tags[0].Value}]" --out table

オプションのqueryを使用することで絞り込みができます。
上記の例は、InternetGatewaysがトップレベル次にVpcIdとTagsのValue情報を出力させています


            図J InternetGateway情報

次回はInternetGWとVPC,サブネットCIDRを一緒に出力させる方法を書きます


Linux版その1 EC2の情報出力 https://opt-p.co.jp/blog/aws/post-1633/

Linux版その2 RDSの情報出力 https://opt-p.co.jp/blog/aws/post-1718/

Linux版その4 色々な情報出力 https://opt-p.co.jp/blog/aws/post-2421/

【実践&検証】Sandboxの更新

はじめに

こんにちは!株式会社オプトプランニングです。
Salesforce(Salesforce.com/セールスフォース・ドットコム、略してSFDC)であれこれやってみたことを書いていきます。

先日、Sandboxの更新を初めて行いました。
その際、テスト用に作成していたレコードがSandbox更新後になくなってしまいました…(泣)

そこで今回はSandboxの更新について、更新前後でどのような変化が起こるのか、検証を交えてやってみようと思います。

今回やってみること

「Sandboxの更新」って何??

Sandboxの更新については、公式ヘルプで以下のように記載があります。

Sandbox を更新すると、ソース組織のメタデータが更新されます。Sandbox がコピーであるか、Sandbox で Sandbox テンプレートが使用されている場合は、更新プロセスにより、そのメタデータと組織のデータが更新されます。

Sandboxの更新

本番組織を元に作成したSandboxの更新については情報があったのですが、Sandboxを元に作成したSandbox(SandboxのコピーSandbox)の更新についてはあまり情報がなかったため、今回は後者について書いていきます。

SandboxのコピーSandboxの更新をやってみる

今回更新をやってみる環境は、以前作成したSandbox「T2Sandbox」です。(詳しくはこちらをご覧ください)
この「T2Sandbox」は、「TSandbox」というSandboxを元に作成したSandbox(コピーSandbox)です。

コピーSandboxを更新するとコピー元と比べて中のデータがどうなるのか、更新前後でSandboxにどんな変化があるのかを検証を交えて確認していきたいと思います。

イメージは以下の図になります。

図1 内容概要(イメージ)
図1 内容概要(イメージ)

検証用のデータ作成をやってみた

その1:カスタムオブジェクトの作成

Sandboxの更新をやってみる前に、更新前後で比較するための検証用データをコピー元のSandbox(TSandbox)とコピーSandbox(T2Sandbox)にそれぞれ作成していきます。

まず、TSandboxとT2Sandboxにそれぞれの以下のようなカスタムオブジェクトを作成しました。

Sandbox名カスタムオブジェクトの表示ラベルAPI参照名
TSandbox顧客カスタム(Tsandbox作成)Tsandbox__c
T2Sandbox関係者の同意カスタム(T2sandbox作成)T2sandbox__c
図2 TSandboxで作成したオブジェクト
図2 TSandboxで作成したオブジェクト
図3 T2Sandboxkで作成したオブジェクト
図3 T2Sandboxkで作成したオブジェクト

その2:レコードの作成

次に、レコードを作成します。
違いを分かりやすくするため、以下の標準オブジェクトにそれぞれ1つのレコードを作成しました。

レコード名などは画像を参照してください。

Sandbox名レコードを作成したオブジェクト
TSandboxリード
T2Sandbox取引先
図4 TSandboxのリード(レコードあり)
図4 TSandboxのリード(レコードあり)
図5 T2Sandboxのリード(レコードなし)
図5 T2Sandboxのリード(レコードなし)
図6 TSandboxの取引先(レコードなし)
図6 TSandboxの取引先(レコードなし)
図7 T2Sandboxの取引先(レコードあり)
図7 T2Sandboxの取引先(レコードあり)

Sandboxの更新方法と手順

まずは本番環境へ

Sandbox作成の時もそうでしたが、Sandboxの更新も本番環境からでしか行うことはできません。

本番環境へログインし、設定のクイック検索で「Sandbox」と入力し「環境」の配下にある「Sandbox」をクリックします。

さっそく更新

Sandboxの一覧が表示されたら、対象のSandboxの左にある「更新」をクリックします。

図8 Sandboxの一覧画面
図8 Sandboxの一覧画面

「更新」をクリックすると「Sandboxの更新」が表示されます。
(なんだか見覚えのあるような画面ですね~)

「Sandboxの情報」には既に「T2Sandbox」の情報が入っていましたが、変更することもできるようです。

また、「作成元」は「TSandbox」になっていますが、こちらも変更することができるようです。

今回は、更新前後の違いが分かるように「説明」に更新年月を追加し、名前や作成元はそのままで「次へ」をクリックします。(検証を行ったのは2022年6月でした)

図9 Sandboxの更新画面
図9 Sandboxの更新画面

次に表示されるのは「Sandboxオプション」でした。
こちらは空白のまま「作成」をクリックします。

図10 Sandboxオプション
図10 Sandboxオプション

後は待つだけ

「作成」をクリック後、Sandboxの一覧に戻ってきました。

先ほど更新を行った「T2Sandbox」の「状況」は「待機中」になっており、「説明」が変わっていることが確認できます。
また、「アクション」、「場所」、「完了日」は空白になりました。

更新元である「TSandbox」の方は「アクション」のうち「削除」と「更新」が消えました。

図11 Sandboxの一覧画面
図11 Sandboxの一覧画面

ここまできたらSandboxの作成の時と同じように更新が完了するのを待つだけのはずです!!

いつまで経っても更新が完了しない…

有効化待機中について

Sandboxの一覧画面を時々リロードして見ていたものの、いつまで経っても更新が完了しませんでした。(Sandbox作成の時はすんなりできた記憶があるので、おかしいなと思いつつ他の作業を行っていました。)

半日ほど経過し、流石に時間がかかりすぎでは?と思い、Sandbox一覧画面をよくよく確認してみると…

図12 有効化待機中で表示されるアクション「有効化」と「破棄」
図12 有効化待機中で表示されるアクション「有効化」と「破棄」

更新を行ったT2Sandboxの「状況」が「有効化待機中」になっており、「アクション」に「有効化」と「破棄」が追加されていました…!

そうです、Sandboxの更新では有効化ができるようになったら(状況が有効化待機中に変わった段階で)手動で「有効化」しなければならないのです!!
待つだけではダメでした…(泣)

このことはしっかり公式ヘルプにも載っていましたので気になる方は公式ヘルプも参考にしてください…

Sandbox の更新
更新された Sandbox の有効化

通常だと、有効化する準備ができるとSFDCからメールが送られてくるようです。(私の場合、システムメールを送信しない設定にしていたために気づくのが遅くなりました)

Sandboxの作成と更新は手順や画面が似ているので、気を付けましょう!

有効化する前に破棄を試してみた

気を取り直して、有効化を行おうと思ったのですが、その前に「破棄」をクリックするとどうなるかやってみました。

図13 ポップアップ「更新を破棄」
図13 ポップアップ「更新を破棄」

このようなポップアップが出現しました。

この後、「キャンセル」ボタンを押し、破棄は行いませんでしたが、「破棄」クリック後は確認のポップアップが出るのですぐに破棄されるわけではない、ということが分かりました。

更新の有効化をやってみた

いつも通り脱線してしまいましたが、更新の有効化をやってみます!
「有効化」をクリックすると…

図14 ポップアップ「有効化」
図14 ポップアップ「有効化」
図15 有効化ボタンがアクティブ状態
図15 有効化ボタンがアクティブ状態

破棄の時と同じようにポップアップが出現しました。

このままではポップアップ内の「有効化」ボタンがグレーアウトして押せないので、チェックボックスにチェックをつけます。

すると、「有効化」ボタンがアクティブになるのでクリックします。

図16 有効化中に変化
図16 有効化中に変化

「有効化待機中」から「有効化中」に状況が変化し、「アクション」は空白になりました。

あとは「完了」になるのを待つだけです!!

更新前後のSandboxの比較をやってみた

Sandbox自体の比較をしてみた

まず、更新前後で組織IDが変化し、インスタンス(場所)も変わります。

図17 更新前後のSandbox情報比較
図17 更新前後のSandbox情報比較

そして…先日必須となったMFA認証についてですが、設定は初期化されていました。
そのため、再度設定が必要です。

Sandboxの中身(データ)を比較してみた

冒頭で作成した検証用のデータについて、更新したSandbox(T2Sandbox)は更新前と比較してどうなったか見てみます。

まずは、カスタムオブジェクトを見てみます。

更新後のT2Sandboxを見てみると、更新前に作成したカスタムオブジェクトはなくなり、更新元のTSandboxで作成したカスタムオブジェクトだけありました。

図18 更新後のT2Sandboxのオブジェクトマネージャ
図18 更新後のT2Sandboxのオブジェクトマネージャ

次にレコードを見てみます。

こちらもカスタムオブジェクトと同様で、T2Sandboxで作成したレコードはなくなり、更新元のTSandboxで作成したレコードだけとなっていました。

図19 更新後の取引先
図19 更新後の取引先
図20 更新後のリード
図20 更新後のリード

比較からわかったこと

組織IDやインスタンスの場所、MFA認証も初期化されることから、Sandboxの更新は更新元のSandboxから新規でコピーSandboxを作成するのと変わりがないように思います。

更新時に「作成元」が変更できるのも、新規でSandboxを作成するのと変わらないからこそできるように思います。

データを見ても、Sandboxを作成した後に作ったカスタムオブジェクトやレコードは更新をすることで消滅してしまいます。

ここで注意したいのは、Sandbox上でなんらかの開発を行った後にSandboxの更新を計画する場合です。
更新を行うと更新元のSandboxと全く同じデータになるので、更新を行うSandbox上で新規作成したデータはすべて消えてしまいます。
Sandboxの更新について、更新元データを付け足してくれるイメージを持たないようにしましょう。

ではどんな時にSanedboxの更新を行うのがいいのか考えてみました。

  • Sandboxの作成上限に達しているが、不要なSandboxがあるため、新規でSandboxを作成したい
  • 複数のSandboxで同時に開発を行い、1つのSandboxに開発内容を集約した後、他のSandbox同士でも開発内容を共有したい

などが挙げられると思います。

一つ目の場合は、不要なSandboxを削除して作成を行うよりも、不要なSandboxを更新する方が手間が省けそうです。

二つ目の場合は、リリースを特定のSandboxのみに行うことで、相互にリリースしなくていいので変更セット作成とリリースの手間が減りそうです。
言葉だと分かりにくいかもしれませんが、イメージとしては以下です。

図21 複数のSandboxで同時に開発する場合
図21 複数のSandboxで同時に開発する場合

この場合、Sandbox①を本番環境へのリリース用とすれば、本番環境リリース後に開発用Sandboxを更新するとでそれぞれの開発用Sandboxは本番環境と同等の環境に揃えることができそうです。

開発用のSandboxはそれぞれ違った環境を元に作成していても、更新時に同じ環境を更新元(作成元)とすればいいだけです。

もちろん、それぞれの開発環境に独自にテストデータを用意していて、今後も継続して使用したい場合は、レコードの場合はデータローダなどでデータを保存しておいたり、オブジェクトの場合は更新元に作成しておいたりしなければなりません。

あとがき

ここまでやってみて、あまりSandboxの更新は需要がないような気がしてきましたが…
更新を行うとどうなるんだろう?と疑問に思われている方の参考になれば幸いです。

今後も、気になったことがあれば検証してみたいと思います。

それでは、またお会いしましょう!!

関連記事
SalesforceでSandboxを作ってみた(1)
SalesforceでSandboxを作ってみた(2)

社内 野の花画伯から その3

 ハイビスカスは、南国の花のイメージです。

花言葉は、「上品な美」、「新しい恋」、「繊細な美」、「恒久の美」等です。

沖縄などでは、生垣や庭木として親しまれています。花は、一日花で摘んでも暫くは枯れない生命力を持っているのでパワーがあります。花の鮮やかな色や情熱的な姿から「陽の木」が溢れていると言われ、人気運・愛情運・恋愛運を高めてくれるパワーがあるそうです。赤い花は、赤を象徴する火の気があり、火の気の方向としては、「南」を指します。この方向に飾っておくことで運気がアップするそうです。

ハワイ州では、州花にハイビスカスを指定しています。現地では、「神様に捧げる花」として多くの人々に愛されています。ハワイでフラダンスの踊り子達がハイビスカスを髪に挿して踊る姿が目に浮かびます。ハイビスカスを右に挿しているのは未婚者、左に挿しているのは既婚者という意味があるそうです。

Apexを使った簡単なメール送信方法

セールスフォース

 SFDCからメールを送信する方法は色々とありますが、今回はApexを使った簡単なメール送信方法を紹介します。

 Apexコードを使用するとApexトリガーやApexスケジューラからメールを送信することができます。
 Apexからメール送信する方法には「単一メール送信」と「一括メール送信」があります。今回は「単一メール送信」を使った方法を説明します。
 さらにメール本体についてはApexの中でメール本体を作成する方法と「メールテンプレート」を使う方法がありますが、ここではメール本体をApexの中で作成します。

1.メールアドレス保存用カスタムオブジェクトの作成

 メール送信先を登録するための以下のようなカスタムオブジェクト(MailMember)を作成します。

カスタムオブジェクト(メールメンバー)
図1 カスタムオブジェクト(MailMember)

2.Apexでのメール作成と送信

 Apexでメールを作成し、送信する部分のコードは以下となります。

List<String>mailAdderList = new List<String>();

String mailMsg = '連絡事項';

List<MailMember__c>mailMember = [select id,Name,mailAddress__c from MailMember__c];
for(MailMember__c mM:mailMember){
  mailAdderList.add(mM.mailAddress__c);
  mailMsg += '\n';
  mailMsg += nM.name;
}
mailMsg += '\n';
mailMsg += 'メッセージを入力';

Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();

mail.setToAddresses(mailAdderList);
mail.setSubject('Test Mail Subject');
mail.setPlainTextBody(mailMessage);
mail.setUseSignature(false);
mail.setBccSender(false);
mail.setSenderDisplayName('メール送信者名入力');

List<Messaging.SendEmailResult> results = 
  Messaging.sendEmail(new List<Messaging.SingleEmailMessage>{mail},false);
for (Messaging.SendEmailResult result : results) {
    if (!result.isSuccess()) {
        System.debug(LoggingLevel.ERROR, result.getErrors()[0]);
    }
}

 コードの簡単な説明です。

 List<mailMember__c>mailMemberで送信先メールアドレスを保存します。

 new Messaging.SingleEmailMessage()により「単一メール送信」のインスタンスを作成します。

 mail.setToAddresses()にて送信先アドレスを設定します。設定できるアドレスは100件までです。

 mail.setSubject()にてメールサブジェクトを設定します。

 メール本体(メールのBody部)はmail.setPlainTextBody()にて作成します。

 メールの署名とBccは不要なので、setUseSignature()/setBccSender()にfalseを設定します。

 mail.setSenderDisplayName()でFrom行に表示される送信者表示名を設定します。   setOrgWideEmailAddressId()で組織の送信元のアドレスIDを設定した場合には設定できません。

 また、setOrgWideEmailAddressId()で添付ファイルをsetOrgWideEmailAddressId()で返信先メールアドレスを設定することができます。

 最後に、Messaging.sendEmail()でメールを送信します。2つ目の引数の指定は省略可能でデフォルトはtrueです。trueの場合、任意のsendEmailで失敗した場合、その他すべてのメッセージを送信しない、falseの場合は、メッセージを送信します。
 このメソッドはApex トランザクションごとに 10 回コールすることができます。

 Messaging.sendEmail()の結果はList<Messaging.SendEmailResult> resultsで受け取ることができます。配列で返却された結果に対してisSuccess()メソッドを実施することで結果を取得することができます。isSuccess()の結果がfalseの場合、getError()を使い、sendEmailErrorオブジェクトを取得することができます。エラーとなるのは送信時のエラーで、送信先に到達したか否かは関係ありません。

3.NO_MASS_MAIL_PERMISSIONエラー

 メール送信を実行した場合に「NO_MASS_MAIL_PERMISSION」というエラーが出る場合があります。これは「メールを送信するためのアクセス権」がない場合に発生します。設定により、権限を「すべてのメール」に変更します。

1.検索窓で「送信」を入力
2.メールメニューの「送信」を選択

図2 メールのアクセス権の設定(1)
【図2 メールのアクセス権の設定(1)】

3.アクセス権で「すべてのメール」を選択

図3 メールのアクセス権の設定(2)
【図3 メールのアクセス権の設定(2)】
【図4】メールのアクセス権の設定(3)
【図4】メールのアクセス権の設定(3)