システム管理者の独り言

元営業の素人がsalesforceシステム管理者になったので備忘録を。。

Apexに触れたきっかけみたいなものを綴る

元々営業職で開発未経験だった自分が見よう見まねで覚えたことを少し晒していこうかと。 まずはApexを覚えるきっかけを。。。 私は転職した会社でシステム管理者から始まりましたが、その時点でSalesforceを知りませんでした。 なにそれ美味しいの?なレベル。

こんな方向けの内容

理由は問わず開発未経験でSalesforceに携わって、 ちょっとコードも書いてみたい人向け。

  • Selesforceの開発やってみたいけどよくわからん
  • システム管理者だけどコーディングになんとなく興味ある
  • 外注する予算はないけどApexでちょっとした機能拡張をやって みたい
  • 社内の情報システム関連の方たちに依頼できない(しづらい)
  • ちょっとコード書ける自分になりたい(-ω☆)キラリ

こんな動機ですかね。

内容もあってるかどうかわからない場合があります。あくまで 個人的な見解に基づくものです

先に結論言っておくと、 Javaの参考書を勉強することから始めるといいよって内容

スタート時点のスキル

  • html書いたことない
  • 当然cssなんて知らない
  • そもそもコーディングしたことない
  • だからJavaScriptJavaが違うなんて聞いてない

銅の剣と皮の服って状態でした。

Apexにふれるきっかけ

システム管理者に任命されたけど、 周りにSalesforceを知ってる人がいないのでとりあえず 闇雲に触り続ける。 カスタムオブジェクトとか項目作成、ページレイアウト、 レコードタイプ、ワークフローなどを用語とともに覚え始め、 ちょっとずつ慣れてきた頃にvisualforce・ Apexという単語が少しずつ目につくようになる。

それがなんなのかわからないので、 担当の営業さんに聞いてみると標準だとできないことがなんでもできますよ! って具合でしたが格好つけて言うと

自社のビジネスプロセス効率化のためにSalesforceの機 能を拡張するって感じでしょうか。

徐々に自分で設定できることが増えてきてなんとなく慣れてきたかなって頃に、アバウトな依頼が。

●●みたいなのってできねーの?てかやって。 でも開発費ねーから。多少時間かかってもいいよ。

これがきっかけですね。 やるしかないから調べ始めました。

具体的には、詳細ページでボタンを押すことで、 ある日付項目を更新した状態のレコードを複製したいってことでし た。

とりあえずApexを調べたところ

開発者用ドキュメントによると。。 。

Apex は、開発者が Salesforce サーバでフローとトランザクションの制御ステートメントAPI へのコールと組み 合わせて実行できるようにした、 強く型付けされたオブジェクト指向プログラミング言語です。 Java に似た、 データベースのストアドプロシージャのように動作する構文を使用 する Apex により、開発者は、ボタンクリック、関連レコードの更新、および Visualforce ページなどのほとんどのシステムイベントにビジネスロジックを追 加できます。 Apex コードは、Web サービス要求、およびオブジェクトのトリガから開始できます。

全く頭に入りませんでした。 ほぼ日本語として理解できなかったですwww ですが、とりあえずこんな手順で入りました。

  1. Apexって調べても参考書が見当たらん
  2. Javaに似てるってことだけなんとなくわかったような気がする
  3. Javaって単語は結構聞いたことあるな。
  4. とりあえず本屋でJavaの参考書買ってみっか。 で当時買った本はスッキリわかるJava入門

スッキリわかるJava入門 第2版 (スッキリシリーズ)

スッキリわかるJava入門 第2版 (スッキリシリーズ)

結論

プログラムを全くやったことのない私は、 Javaなど参考書が豊富にある言語で一度勉強して、 先の引用にあった「型」などの用語がなんとなく理解できました。 代入とか、 条件分岐とか繰り返しの制御などだけでも勉強するといいと思いま す。

そこからはApexでできることを少しずつ増やした感じです。 visualforceについてはPDF出力をする依頼があって 覚えるようになりました。 もしvisualforceから覚えようとしても、 Apexの知識がないと無理だと思います。

余談

開発ができるのは優れたスキルだと間違いなく思います。 でもシステム管理者ならざっくりですが、 以下の順番で検討した方が良いと思います。

  1. 標準機能で実現できるかとにかく検討する
  2. AppExchange で探す
  3. 開発してくれるコンサルタントを探す(営業に紹介してもらう)

特に標準機能で何ができるかをまず理解しておくことが肝 要で、 プロセスビルダーやフローでどうにかなることが意外とありますし 、開発自体はやはりコストがかかります。 さらに言えば標準機能でやっておけばアップデートの恩恵 を受ける機会が増えます。 これは項目1つとっても言えることで標準項目を使えるなら使うべ き。 そのへんは導入時点でどれだけ考慮できているかによりますが。

時間がないとか逼迫した理由がなければまずは調べるべき! と強く思います。 調べた事自体は新たな知識として身につきますので。

今後は、ちょっとずつ基本的な内容を書いていこうと思います。( 脱線もあると思いますが)

記事作成中にamazonApexで書籍検索したら 修羅の門ってマンガが大量にヒットしました(笑)

 

【番外】画像認識LINE BOT

X-HACK主催のワークショップに参加してみました。

 herokuとnode.jsを使ったLINE botの構築です。

 

AIは、IBMのVisual Recognition (画像認識)を利用しました。

最初は、LIINEのDeveloperアカウントを取得してLINE botでメッセージを送ると、「hello,[name]さん」と返事する仕組みを構築。

※構築といってもコード自体はコピーして作成。環境変数などをいじっただけですが…

 

その後に画像認識のAIを追加して写真を送ると、どんな画像か返信するという内容です。

 

f:id:iwaoLog:20180909222053j:plain

 

実質2時間弱でここまでできたのは、準備もさることながらスムーズに進められたと思います。
herokuとnode.jsを覚えたいということもあり、とても勉強になりましたので今後はこれをベースに色々試してみたいです。

データベースを使用する回もあるそうなのでスケジュールがあえば参加したいと思います。



 

 

 

 

SOQLで含まないを使う

よくわかってなかったので備忘録

●を含むときには、こんな感じ

SELECT Id, Name FROM Contact WHERE Name LIKE '●'

じゃあ 含まない はどう使う??となって調べました。

一郎を「含む」場合

SELECT Id, Name FROM Contact WHERE Name LIKE '%一郎%' AND Account.Name = 'hogehoge'

結果

f:id:iwaoLog:20180903113454j:plain

一郎を「含まない」場合

SELECT Id, Name FROM Contact WHERE (NOT Name LIKE '%一郎%') AND Account.Name = 'hogehoge'

結果

f:id:iwaoLog:20180903113548j:plain

NOTを付けて( )で括るようです。知らなかった...

sandboxと本番環境の判定方法

半年以上書いてなかった…

開発してたときに、sandboxと本番環境でAPIキーを使い分けたいことがあった。
以下のSOQLで組織のsandboxが判定可能

Organization org = [SELECT Id, isSandbox FROM organization];

developer環境ではfalseが返りました。

ちょっとはまったハナシ

先日、セールスフォースのshieldからEvent Monitoringを導入しました。

セキュリティアドオン – Salesforce Shield - セールスフォース・ドットコム

 

analyticsにテンプレートが用意されているということだったのですが、

例外のエラーが表示されて進まない。。。

 

サポートに訪ねたところ、analytics有効化時に自動でユーザが作成されるが

ユーザのカスタム項目に「必須」「ユニーク」なものが設定されていると、

ユーザが作成されないとのこと...

調べてみたらまさにその通りでした。

 

ちょっとはまったハナシ。

うるう年の日付

日付の疑問

あるあるな話かもしれないが、個人的な備忘録として残しておく。

Date d = Date.newInstance(2018, 2, 29);
System.debug(d);

さて、何日が表示されるのか。。

f:id:iwaoLog:20180109185426p:plain

でしょうね。

次に'''addYears(num)'''で年数を加算したらどうなるか。4年先まで追加。

f:id:iwaoLog:20180109185818p:plain

ですよね。

最後に、実在するうるう年の日付に年数を加算。

Date d = Date.newInstance(2020, 2, 29);
System.debug(d.addYears(1));
System.debug(d.addYears(2));
System.debug(d.addYears(3));
System.debug(d.addYears(4));

f:id:iwaoLog:20180109190650p:plain

2月末日の日付が表示されました。 今年は筆まめに。。

レポートのエクスポート権限が割り当てられたユーザ

ずいぶん投稿してなかった。

ちょうど「レポートのエクスポート権限」がどのユーザに割り当てられてるか調べる依頼があったのでメモ。。

場所

プロファイルごとに権限のセットができる

f:id:iwaoLog:20171129142706p:plain
レポートのエクスポート
つまり、各プロファイルごとにチェックがあるか確認して、「このプロファイルに属するユーザの参照」をして一つ一つ調べていけばできると。。

一度に確認できないか?

ひとつずつ調べるのは面倒な作業だし、何かできないか調べてみる。

developer.salesforce.com

この辺を調べてみたところ、「レポートのエクスポート」の権限を指定する名称がわからなかったので、さらに調べる。

developer.salesforce.com

「PermissionsPermissionName」というのを見つけた。ところが、

使用可能な権限のリストを取得するには、describeSObjects() を使用します。

とあったので、下記で取得。

    Map<String, Schema.SObjectField> fieldMap = Schema.SObjectType.PermissionSet.fields.getMap();
    System.debug(fieldMap.size());
    for(String s : fieldMap.keyset()){
        System.debug(fieldMap.get(s));
    }

194件あったので、それっぽいのがないか確認したところ、 ようやく「PermissionsExportReport」と判明したので、SOQLクエリを実行

SELECT Id, AssigneeID, Assignee.Name, Assignee.IsActive, PermissionSet.Name
FROM PermissionSetAssignment
WHERE PermissionSet.PermissionsExportReport=TRUE AND Assignee.IsActive = TRUE

AssigneeがUserオブジェクトを指すので、有効ユーザのみに絞り込んで、権限をもつユーザが取得できました。 思った以上に時間かかったので、ひとつずつ調べた方が早かったかも。。。