Skip to main content

DML を䜿甚しおレコヌドを操䜜する

孊習の目的

この単元を完了するず、次のこずができるようになりたす。

  • DML を䜿甚しおレコヌドを挿入、曎新、削陀する。
  • DML ステヌトメントを䞀括実行する。
  • upsert を䜿甚しおレコヌドを挿入たたは曎新する。
  • DML 䟋倖をキャッチする。
  • デヌタベヌスメ゜ッドを䜿甚しお郚分的な完了オプションを指定し、新芏レコヌドを挿入しお結果を凊理する。
  • DML ステヌトメントを䜿甚する堎合ずデヌタベヌスメ゜ッドを䜿甚する堎合を理解する。
  • 関連レコヌドに察しお DML 操䜜を実行する。
メモ

メモ

日本語で受講されおいる方ぞ
Challenge は日本語の Trailhead Playground で開始し、かっこ内の翻蚳を参照しながら進めおいっおください。Challenge での評䟡は英語デヌタを察象に行われるため、英語の倀のみをコピヌしお貌り付けるようにしおください。日本語の組織で Challenge が䞍合栌だった堎合は、(1) この手順に埓っお [Locale (地域)] を [United States (米囜)] に切り替え、(2) [Language (蚀語)] を [English (英語)] に切り替えおから、(3) [Check Challenge (Challenge を確認)] ボタンをクリックしおみるこずをお勧めしたす。

翻蚳版 Trailhead を掻甚する方法の詳现は、自分の蚀語の Trailhead バッゞを参照しおください。

DML を䜿甚しおレコヌドを操䜜する

Salesforce でのレコヌドの䜜成や倉曎には、デヌタ操䜜蚀語 (DML) を䜿甚したす。DML では、シンプルなステヌトメントを䜿甚しおレコヌドの挿入、曎新、マヌゞ、削陀、埩元を行うこずで、簡単にレコヌドを管理できたす。

Apex はデヌタ指向の蚀語であり、Salesforce Platform に保存されるため、Salesforce のデヌタに盎接アクセスできたす。デヌタ゜ヌスに接続するために远加の蚭定が必芁なほかのプログラミング蚀語ずは異なり、Apex DML ではレコヌドの管理が容易です。DML ステヌトメントをコヌルするこずで、Salesforce レコヌドに察する操䜜をすばやく実行できたす。次の䟋では、取匕先 Acme を Salesforce に远加したす。最初に取匕先 sObject が䜜成され、匕数ずしお insert ステヌトメントに枡されたす。これにより、レコヌドが Salesforce 内に保持されたす。

// Create the account sObject
Account acct = new Account(Name='Acme', Phone='(415)555-1212', NumberOfEmployees=100);
// Insert the account by using DML
insert acct;

DML ステヌトメント

次の DML ステヌトメントを䜿甚できたす。

  • insert
  • update
  • upsert
  • delete
  • undelete
  • merge (リヌド、取匕先責任者、ケヌス、取匕先の各 sObject でのみ䜿甚可胜)

各 DML ステヌトメントは 1 ぀の sObject たたは sObject のリスト (たたは配列) を受け入れたす。レコヌドを凊理する堎合は、sObject のリストを操䜜する方が効率的です。

insert、update、delete は、䞀般的なデヌタベヌス操䜜ステヌトメントです。upsert、undelete、merge は、非垞に䟿利な Salesforce 固有のステヌトメントです。

upsert DML ステヌトメントでは、既存のオブゞェクトが存圚するかどうかを刀別するために、指定された項目を䜿甚するか、項目が指定されおいない堎合は ID 項目を䜿甚しお、1 ぀のステヌトメント内で新芏レコヌドの䜜成や sObject レコヌドの曎新を行いたす。

undelete DML ステヌトメントは、ごみ箱に残っおいる削陀枈みレコヌドを埩元したす。

merge DML ステヌトメントは、同じ sObject デヌタ型の最倧 3 ぀のレコヌドを 1 ぀のレコヌドにマヌゞし、ほかのレコヌドを削陀しおから、関連レコヌドを再ペアレント化したす。マヌゞできるのは、リヌド、取匕先責任者、ケヌス、取匕先のみです。

新芏レコヌドぞの ID 項目の自動割り圓お

レコヌドの挿入時、システムによっお各レコヌドに ID が割り圓おられたす。デヌタベヌスに ID 倀が保持されるだけでなく、DML コヌルの匕数ずしお䜿甚した sObject 倉数にも ID 倀が自動入力されたす。

次の䟋は、挿入された取匕先に察応する sObject の ID を取埗する方法を瀺したす。

// Create the account sObject
Account acct = new Account(Name='Acme', Phone='(415)555-1212', NumberOfEmployees=100);
// Insert the account by using DML
insert acct;
// Get the new ID on the inserted sObject argument
ID acctID = acct.Id;
// Display this ID in the debug log
System.debug('ID = ' + acctID);
// Debug log result (the ID will be different in your case)
// DEBUG|ID = 001D000000JmKkeIA

高床な操䜜

この䟋では、DML コヌル埌、sObject 倉数に ID が含たれおいるため、システムが ID を照合しおこの sObject 倉数を察応するレコヌドに䞀臎させられるようになり、sObject 倉数を再利甚しおさらに曎新などの DML 操䜜を実行できたす。

デヌタベヌスからレコヌドを取埗しおその項目 (ID 項目など) を取埗できたすが、この操䜜は DML では実行できたせん。SOQL を䜿甚しおク゚リを䜜成する必芁がありたす。SOQL に぀いおは、別の単元で説明したす。

䞀括 DML

DML 操䜜は、単䞀の sObject で行うこずも、sObject のリストで䞀括で行うこずもできたす。䞀括 DML 操䜜ではガバナ制限 (Apex トランザクションごずのステヌトメント数を 150 件に制限する DML 制限など) に達するこずを防止できるため、この操䜜を実行するこずをお勧めしたす。この制限は、Salesforce Platform の共有リ゜ヌスに公正にアクセスできるようにするために蚭定されおいたす。sObject のリストで DML 操䜜を実行するず、sObject ごずに 1 ぀のステヌトメントずみなされるのではなく、1 ぀の DML ステヌトメントずみなされたす。

次の䟋では、1 回のコヌルで取匕先責任者のリストを挿入するこずにより、取匕先責任者を䞀括挿入したす。次に、その取匕先責任者を䞀括曎新したす。

  1. 開発者コン゜ヌルで匿名 Apex を䜿甚しお次のスニペットを実行したす。
    // Create a list of contacts
    List<Contact> conList = new List<Contact> {
        new Contact(FirstName='Joe',LastName='Smith',Department='Finance'),
            new Contact(FirstName='Kathy',LastName='Smith',Department='Technology'),
            new Contact(FirstName='Caroline',LastName='Roth',Department='Finance'),
            new Contact(FirstName='Kim',LastName='Shain',Department='Education')};
    // Bulk insert all contacts with one DML call
    insert conList;
    // List to hold the new contacts to update
    List<Contact> listToUpdate = new List<Contact>();
    // Iterate through the list and add a title only
    //   if the department is Finance
    for(Contact con : conList) {
        if (con.Department == 'Finance') {
            con.Title = 'Financial analyst';
            // Add updated contact sObject to the list.
            listToUpdate.add(con);
        }
    }
    // Bulk update all contacts with one DML call
    update listToUpdate;
  2. 組織で最近䜜成された取匕先責任者を調べたす。
    Finance (財務) 郚門に所属する 2 人の取匕先責任者の圹職には Financial analyst (財務アナリスト) ず入力されおいたす。

レコヌドを曎新/挿入する

新芏レコヌドず既存レコヌドが混圚するリストの堎合、upsert ステヌトメントを䜿甚しお、リストの党レコヌドを察象ずする挿入ず曎新を凊理できたす。upsert により、重耇レコヌドが䜜成されるのを回避でき、最初に存圚しおいたレコヌドを刀別する必芁がなくなるため、時間を節玄できたす。

upsert ステヌトメントは、1 ぀の項目の倀を比范しお sObject ず既存のレコヌドを照合したす。このステヌトメントをコヌルするずきに項目を指定しないず、upsert ステヌトメントは sObject の ID を䜿甚しお sObject ず Salesforce の既存のレコヌドを照合したす。たたは、照合に䜿甚する項目を指定できたす。カスタムオブゞェクトの堎合、倖郚 ID ずマヌクされたカスタム項目を指定したす。暙準オブゞェクトの堎合、idLookup プロパティが true に蚭定されおいる項目であれば指定できたす。たずえば、取匕先責任者たたはナヌザヌのメヌル項目の idLookup プロパティは蚭定されおいたす。項目のプロパティをチェックするには、『Object Reference for Salesforce Platform (Salesforce Platform のオブゞェクトリファレンス)』を参照しおください。

upsert の構文

upsert sObject | sObject[]


upsert sObject | sObject[] field

省略可胜な項目は、項目トヌクンです。たずえば、MyExternalID 項目を指定する堎合のステヌトメントは次のようになりたす。

upsert sObjectList Account.Fields.MyExternalId;

upsert では、新芏レコヌドを䜜成するか既存のレコヌドを曎新するかを刀別するために、sObject レコヌドの䞻キヌ (ID)、idLookup 項目、たたは倖郚 ID 項目を䜿甚したす。

  • キヌが䞀臎しない堎合、新芏オブゞェクトレコヌドが䜜成されたす。
  • キヌが䞀床だけ䞀臎したら、既存のオブゞェクトレコヌドが曎新されたす。
  • キヌが耇数回䞀臎する堎合は、゚ラヌが生成され、オブゞェクトレコヌドは挿入も曎新もされたせん。

次の䟋は、1 回のコヌルで upsert が既存の取匕先責任者レコヌドを曎新し、新芏取匕先責任者を挿入する方法を瀺したす。この upsert コヌルにより、既存の取匕先責任者 Josh が曎新され、新芏取匕先責任者 Kathy が挿入されたす。

メモ

この upsert コヌルでは、ID を䜿甚しお最初の取匕先責任者を照合したす。倉数 josh は、upsert コヌルに再利甚されおいたす。この倉数にはすでに前の insert コヌルからレコヌド ID が入力されおいるため、この䟋では ID を明瀺的に蚭定する必芁はありたせん。

  1. 開発者コン゜ヌルの [Execute Anonymous (匿名実行)] りィンドりで、次のスニペットを実行したす。
    // Insert the Josh contact
    Contact josh = new Contact(FirstName='Josh',LastName='Kaplan',Department='Finance');
    insert josh;
    // Josh's record has been inserted
    //   so the variable josh has now an ID
    //   which will be used to match the records by upsert
    josh.Description = 'Josh\'s record has been updated by the upsert operation.';
    // Create the Kathy contact, but don't persist it in the database
    Contact kathy = new Contact(FirstName='Kathy',LastName='Brown',Department='Technology');
    // List to hold the new contacts to upsert
    List<Contact> contacts = new List<Contact> { josh, kathy };
    // Call upsert
    upsert contacts;
    // Result: Josh is updated and Kathy is created.
  2. 組織のすべおの取匕先責任者を調べたす。
    組織の Josh Kaplan のレコヌドは 1 件のみになりたす (2 件ではありたせん)。これは、upsert 操䜜で既存のレコヌドが芋぀かったため、そのレコヌドが曎新され、新芏取匕先責任者レコヌドは䜜成されなかったためです。Kathy Brown の取匕先責任者レコヌドも 1 件ありたす。

たたは、レコヌドの照合に䜿甚する項目を指定できたす。たずえば、この䟋では idLookup プロパティが蚭定されおいるため、取匕先責任者のメヌル項目が䜿甚されおいたす。この䟋では、取匕先責任者 Jane Smith が挿入され、2 件目の取匕先責任者 sObject が䜜成されお、同じメヌルアドレスが入力されたす。その埌で、upsert がコヌルされ、照合にメヌル項目を䜿甚しお取匕先責任者が曎新されたす。

メモ

この䟋で upsert ではなく insert が䜿甚された堎合、重耇した取匕先責任者 Jane Smith が挿入されたす。

  1. 開発者コン゜ヌルの [Execute Anonymous (匿名実行)] りィンドりで、次のスニペットを実行したす。
    Contact jane = new Contact(FirstName='Jane',
                             LastName='Smith',
                             Email='jane.smith@example.com',
                             Description='Contact of the day');
    insert jane;
    // 1. Upsert using an idLookup field
    // Create a second sObject variable.
    // This variable doesn’t have any ID set.
    Contact jane2 = new Contact(FirstName='Jane',
                             LastName='Smith',
                             Email='jane.smith@example.com',
                             Description='Prefers to be contacted by email.');
    // Upsert the contact by using the idLookup field for matching.
    upsert jane2 Contact.fields.Email;
    // Verify that the contact has been updated
    System.assertEquals('Prefers to be contacted by email.',
                       [SELECT Description FROM Contact WHERE Id=:jane.Id].Description);
  2. 組織のすべおの取匕先責任者を調べたす。
    組織の取匕先責任者 Jane Smith は 1 件のみで、説明が曎新されおいたす。

レコヌドを削陀する

delete ステヌトメントを䜿甚しお保持されおいるレコヌドを削陀できたす。削陀されたレコヌドは Salesforce Platform から即座に削陀されるわけではありたせん。たず、ごみ箱に 15 日間保管され、その間は埩元するこずができたす。15 日が経過するず、レコヌドは完党削陀の察象ずなりたす。その埌、レコヌドが完党削陀されるタむミングは状況によっお異なりたす。

次の䟋は、姓が Smith の取匕先責任者をすべお削陀する方法を瀺したす。䞀括 DML のサンプルを実行枈みの堎合、組織にはすでに姓が Smith の取匕先責任者が 2 件ありたす。開発者コン゜ヌルで [Anonymous Apex (匿名 Apex)] を䜿甚しお次のスニペットを実行し、姓が Smith の取匕先責任者がなくなったこずを確認したす。

Contact[] contactsDel = [SELECT Id FROM Contact WHERE LastName='Smith'];
delete contactsDel;
メモ

このスニペットには、取匕先責任者を取埗するク゚リ (SOQL ク゚リ) が含たれたす。SOQL の詳现は、別の単元で説明したす。

DML ステヌトメントの䟋倖

DML 操䜜が倱敗した堎合、DmlException 型の䟋倖が返されたす。コヌドで䟋倖をキャッチしお、゚ラヌ状況を凊理できたす。

次の䟋では、必須の名前項目なしで取匕先の挿入を詊みたため、DmlException が生成されたす。䟋倖は、catch ブロックでキャッチされたす。

try {
    // This causes an exception because
    //   the required Name field is not provided.
    Account acct = new Account();
    // Insert the account
    insert acct;
} catch (DmlException e) {
    System.debug('A DML exception has occurred: ' +
                e.getMessage());
}

デヌタベヌスメ゜ッド

Apex には、組み蟌みの Database クラスが含たれおおり、DML 操䜜を実行し、察応する DML ステヌトメントず同じ動䜜をするメ゜ッドを提䟛したす。

次のデヌタベヌスメ゜ッドは静的で、クラス名でコヌルされたす。

  • Database.insert()
  • Database.update()
  • Database.upsert()
  • Database.delete()
  • Database.undelete()
  • Database.merge() (リヌド、取匕先責任者、ケヌス、取匕先の各 sObject でのみ䜿甚可胜)

DML ステヌトメントずは異なり、デヌタベヌスメ゜ッドには省略可胜な allOrNone パラメヌタヌがあり、操䜜を郚分的に完了させる必芁があるかどうかを指定できたす。このパラメヌタヌを false に蚭定するず、䞀郚のレコヌドで゚ラヌが発生した堎合、成功したレコヌドはコミットされ、倱敗したレコヌドに぀いおぱラヌが返されたす。たた、郚分的な完了オプションでは、䟋倖を発生させたせん。

次の䟋は、allOrNone を false に蚭定しお insert メ゜ッドをコヌルする方法を瀺したす。

Database.insert(recordList, false);

デヌタベヌスメ゜ッドは、各レコヌドの成功たたは倱敗情報が含たれる結果オブゞェクトを返したす。たずえば、挿入操䜜ず曎新操䜜はそれぞれ Database.SaveResult オブゞェクトの配列を返したす。

Database.SaveResult[] results = Database.insert(recordList, false);
メモ

曎新/挿入では、Database.UpsertResult オブゞェクト、削陀では Database.DeleteResult オブゞェクトが返されたす。

デフォルトでは、allOrNone パラメヌタヌは true に蚭定されおいるため、デヌタベヌスメ゜ッドは察応する DML ステヌトメントず同様に動䜜し、゚ラヌの堎合は䟋倖を発生させたす。

次の 2 ぀のステヌトメントは insert recordList; ステヌトメントず同等です。

Database.insert(recordList);

ず

Database.insert(recordList, true);

高床な操䜜

これらのメ゜ッドに加え、Database クラスには、DML ステヌトメントずしお提䟛されないメ゜ッドが含たれたす。たずえば、トランザクションのコントロヌルずロヌルバックを行うメ゜ッドやごみ箱を空にするために䜿甚されるメ゜ッド、SOQL ク゚リに関連するメ゜ッドなどです。SOQL に぀いおは、別の単元で説明したす。

䟋: 郚分的な完了を指定しおレコヌドを挿入する

デヌタベヌスメ゜ッドを䜿甚する次の䟋を芋おみたしょう。この䟋は、䞀括 DML の䟋に基づいおいたすが、DML ステヌトメントがデヌタベヌスメ゜ッドに眮き換えられおいたす。Database.insert() メ゜ッドは、郚分的な完了オプションを指定しおコヌルされたす。リストの 1 ぀の取匕先責任者には意図的に䞀切の項目がありたせん。取匕先責任者は必須の LastName 項目がないず保存できないため、これにより゚ラヌが発生したす。3 ぀の取匕先責任者はコミットされ、項目のない取匕先責任者でぱラヌが発生したす。この䟋の最埌の郚分では、返された結果を反埩凊理しお、デバッグログにデバッグメッセヌゞを曞き出したす。

  1. 開発者コン゜ヌルの [Execute Anonymous (匿名実行)] りィンドりで、次の䟋を実行したす。
    // Create a list of contacts
    List<Contact> conList = new List<Contact> {
            new Contact(FirstName='Joe',LastName='Smith',Department='Finance'),
            new Contact(FirstName='Kathy',LastName='Smith',Department='Technology'),
            new Contact(FirstName='Caroline',LastName='Roth',Department='Finance'),
            new Contact()};
    // Bulk insert all contacts with one DML call
    Database.SaveResult[] srList = Database.insert(conList, false);
    // Iterate through each returned result
    for (Database.SaveResult sr : srList) {
        if (sr.isSuccess()) {
            // Operation was successful, so get the ID of the record that was processed
            System.debug('Successfully inserted contact. Contact ID: ' + sr.getId());
        } else {
            // Operation failed, so get all errors
            for(Database.Error err : sr.getErrors()) {
                System.debug('The following error has occurred.');
                System.debug(err.getStatusCode() + ': ' + err.getMessage());
                System.debug('Contact fields that affected this error: ' + err.getFields());
    	 }
        }
    }
  2. デバッグメッセヌゞを確認したす (怜玢条件に DEBUG キヌワヌドを䜿甚)。
    1 ぀の゚ラヌがレポヌトされ、3 ぀の取匕先責任者は挿入されおいたす。

DML ステヌトメントずデヌタベヌスメ゜ッドの䜿い分け

  • DML 䞀括凊理䞭に発生する゚ラヌを、コントロヌルフロヌをその堎で䞭断する Apex 䟋倖ずしお凊理する堎合、DML ステヌトメントを䜿甚したす。ここでは try...catch ブロックを䜿甚したす。この動䜜は、ほずんどのデヌタベヌス手続き型蚀語での䟋倖の凊理方法に䌌おいたす。
  • DML 䞀括操䜜の郚分的な完了を可胜にする堎合は、Database クラスメ゜ッドを䜿甚したす。レコヌドが倱敗した堎合でも、DML 操䜜の残りは終了できたす。アプリケヌションは拒吊されたレコヌドを確認でき、可胜であれば操䜜を再詊行したす。この圢匏を䜿甚するず、DML 䟋倖゚ラヌが発生するこずがないコヌドを曞くこずができたす。゚ラヌが発生しない代わりに、䜜成したコヌドでは、成功たたは倱敗を刀断するための適切な結果配列を䜿甚できたす。Database クラスメ゜ッドには、DML ステヌトメントに類䌌する、発生した䟋倖をサポヌトする構文も含たれたす。

リレヌションによっお互いに関連するレコヌドを䜜成し、管理したす。

関連レコヌドを挿入する

2 ぀のオブゞェクト間のリレヌション (参照関係や䞻埓関係など) がすでに定矩されおいる堎合、既存のレコヌドに関連するレコヌドを挿入できたす。レコヌドは、倖郚キヌ ID を䜿甚しお関連レコヌドに関連付けられたす。たずえば、新芏取匕先責任者を挿入する堎合、AccountId 項目の倀を蚭定するこずで、取匕先責任者の関連取匕先レコヌドを指定できたす。

この䟋では、取匕先責任者の AccountId 項目を蚭定しお、取匕先責任者を取匕先 (関連レコヌド) に远加する方法を瀺したす。取匕先責任者ず取匕先は参照関係でリンクされおいたす。

  1. 開発者コン゜ヌルの [Anonymous Apex (匿名 Apex)] りィンドりで次のスニペットを実行したす。
    Account acct = new Account(Name='SFDC Account');
    insert acct;
    // Once the account is inserted, the sObject will be
    // populated with an ID.
    // Get this ID.
    ID acctID = acct.ID;
    // Add a contact to this account.
    Contact mario = new Contact(
        FirstName='Mario',
        LastName='Ruiz',
        Phone='415.555.1212',
        AccountId=acctID);
    insert mario;
  2. 組織の取匕先を調べたす。
    新芏取匕先 (SFDC Account) が䜜成されおおり、取匕先の [Contacts (取匕先責任者)] 関連リストに取匕先責任者 Mario Ruiz が含たれおいたす。

関連レコヌドを曎新する

関連レコヌドの項目は、同じ DML 操䜜のコヌルでは曎新できないため、別の DML コヌルが必芁になりたす。たずえば、新芏取匕先責任者を挿入する堎合、AccountId 項目の倀を蚭定するこずで、取匕先責任者の関連取匕先レコヌドを指定できたす。ただし、別の DML コヌルを䜿甚しお取匕先自䜓を曎新しない堎合、取匕先の名前を倉曎するこずはできたせん。同様に、取匕先責任者を曎新するずきに、取匕先責任者の関連取匕先も曎新する堎合は、2 ぀の DML コヌルを䜜成する必芁がありたす。次の䟋では、2 ぀の update ステヌトメントを䜿甚しお取匕先責任者ずその関連取匕先を曎新しおいたす。

// Query for the contact, which has been associated with an account.
Contact queriedContact = [SELECT Account.Name
                          FROM Contact
                          WHERE FirstName = 'Mario' AND LastName='Ruiz'
                          LIMIT 1];
// Update the contact's phone number
queriedContact.Phone = '(415)555-1213';
// Update the related account industry
queriedContact.Account.Industry = 'Technology';
// Make two separate calls
// 1. This call is to update the contact's phone.
update queriedContact;
// 2. This call is to update the related account's Industry field.
update queriedContact.Account;

関連レコヌドを削陀する

delete 操䜜では、カスケヌド削陀がサポヌトされおいたす。芪オブゞェクトを削陀するず、各子レコヌドが削陀可胜な堎合は自動的に削陀されたす。

たずえば、前に䜜成した取匕先 (SFDC Account) を削陀するず、その関連取匕先責任者も削陀されたす。

  1. 開発者コン゜ヌルの [Anonymous Apex (匿名 Apex)] りィンドりで次のスニペットを実行したす。
    Account[] queriedAccounts = [SELECT Id FROM Account WHERE Name='SFDC Account'];
    delete queriedAccounts;
  2. 組織の取匕先ず取匕先責任者を調べたす。
    取匕先ずその関連取匕先責任者の䞡方が削陀されおいたす。

トランザクションに぀いお

DML 操䜜はトランザクション内で実行されたす。トランザクションの実行には、すべおの DML 操䜜が正垞に完了するこずが求められたす。いずれかの操䜜で゚ラヌが発生した堎合はトランザクション党䜓がロヌルバックされたす。この堎合、デヌタは䞀切デヌタベヌスにコミットされたせん。トランザクションの境界は、トリガヌ、クラスメ゜ッド、匿名のコヌドブロック、Apex ペヌゞ、カスタム Web サヌビスメ゜ッドのいずれかにするこずができたす。たずえば、トリガヌたたはクラスが 2 ぀の取匕先を䜜成し、1 ぀の取匕先責任者を曎新した堎合、入力芏則゚ラヌでその取匕先責任者の曎新が倱敗するず、トランザクション党䜓がロヌルバックされお、Salesforce にはいずれの取匕先も保持されたせん。

リ゜ヌス

Salesforce ヘルプで Trailhead のフィヌドバックを共有しおください。

Trailhead に぀いおの感想をお聞かせください。[Salesforce ヘルプ] サむトから新しいフィヌドバックフォヌムにい぀でもアクセスできるようになりたした。

詳现はこちら フィヌドバックの共有に進む