Google Cloud での Job Search API

この Codelab では、Cloud Talent Solution API(CTS)を使用して、組織の求人検索と人材獲得を強化する方法を学びます。CTS を使用することで、求人検索エクスペリエンスに機械学習の機能を追加できます。

ラボの内容

  • Google Cloud プロジェクトで CTS を有効にする
  • 「会社」を作成し、それらの会社にエンティティと仕事を創出

必要なもの

  • お支払い情報が設定されている Google Cloud プロジェクトを設定します(まだ作成していない場合)。作成してください。
  • 1 時間程度

このチュートリアルの利用方法をお選びください。

閲覧のみ 閲覧と演習を行う

Google Cloud Platform の使用経験についてお答えください。

初心者 中級者 エキスパート

このチュートリアルは Google Cloud Platform 上で完全に動作するように設計されています。ワークステーションへのダウンロードは必要ありません。

Cloud Talent Solutions API を有効にします

Cloud Console でアプリケーションを開き、左上にあるハンバーガー メニューをクリックします。メニューで [Talent Solution -> Overview] に移動します。

これは新しいプロジェクトであるため、新しい画面にリダイレクトされ、API を有効にするよう求められます。[有効にする] をクリックし、このプロジェクトで API が有効になるまで数分待ちます。

データロギングを有効にする

前の概要ページに戻ります。データロギングを有効にするように求める新しいダイアログが表示されます(オンになっていない場合は、前のダイアログに戻ります)。これは、Job Search API がデータを必要とする機械学習モデルを利用することの確認にすぎません。統合の一環として、これらのモデルをさらにトレーニングしようとしているユーザーのイベントを送信できます。コードを使用して実装する場合、送信する情報を指定できます。

これらのイベントの概要と送信方法については後ほど詳しく説明しますが、事前トレーニング済みのモデルも使用できます。データロギングを有効にしてから、このダイアログの左側のナビゲーションにある [サービス アカウント接続] をクリックしてください。

サービス アカウントを設定する

API リクエストは、実際の認証済みアカウントに代わって行う必要があります。Google Cloud Platform では、この目的でサービス アカウントを作成することをおすすめしています。サービス アカウントは、権限が制限された認証済みユーザーを簡単に設定する方法と考えてください。これによって、独立した安全なシステムを構築できます。

たとえば、Job Search API を使用するにはサービス アカウントが必要です。左側のナビゲーション パネルの [Cloud Talent Solution] で「Job Editor」を使用して、読み取り権限と書き込み権限を付与します。「ジョブ閲覧者」だけを使用してサービス アカウントを設定することもできます。この場合、読み取り専用アクセス権になります。

次の手順で、このサービス アカウントへのアクセス権をユーザーに付与するかどうかを尋ねます。この手順は省略できますが、下部にある [キーを作成] をクリックしてください。鍵のタイプとして [JSON] を選択し、[作成] を選択します。新しい JSON 認証情報ファイルが自動的にダウンロードされます。このファイルをサーバーに保存します。認証には、この後のセクションで作成するコードが使用します。

環境変数を設定する

便宜上、Google Cloud Shell を使用します。この処理を独自の開発環境から行う場合、任意の言語で Google Cloud SDKクライアント ライブラリをインストールしてください(この Codelab では Python を使用します)。Cloud Shell には Cloud クライアント ライブラリがすでにインストールされています。便利ですね。

ライブラリを使用してコードを実行するには、2 つの環境変数が設定されている必要があります。1 つはプロジェクト ID を指定し、もう 1 つはサービス アカウントのキーファイルを指定するものです。これを設定しましょう。

プロジェクトで、ウェブ コンソールの右上にある >_&tt; アイコンをクリックして Cloud Shell を開きます。次の環境変数を追加して、プロジェクト ID を指定し、json キーファイルへのパスを設定します。

export GOOGLE_CLOUD_PROJECT="your-project-id"
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"

変数が設定されたことを確認するには、「echo」を使用します。

echo $GOOGLE_CLOUD_PROJECT
echo $GOOGLE_APPLICATION_CREDENTIALS

Cloud Shell でコードエディタを開く

Google Cloud Console で、右上の Cloud Shell アイコンから Cloud Shell を開きます。

Cloud Shell の右上に、一連のアイコンが表示されます。次に示すように、[File] -> [Launch Code Editor] をクリックします。

会社を作成する

[File] -> New File を使用して新しいソースファイルを作成し、以下の内容を入力します。create_company.py という名前を付けます。

create_company.py

import os

from googleapiclient.discovery import build
from googleapiclient.errors import Error

# Build the service object, passing in the api name and api version
client_service = build('jobs', 'v3')
project_id = 'projects/' + os.environ['GOOGLE_CLOUD_PROJECT']


# Specifying details for the company that's going to be created.
# These are the only two required fields.
# Optional fields are documented at
# http://googleapis.github.io/google-api-python-client/docs/dyn/jobs_v3.projects.companies.html#create
new_company = {
    'display_name': "FooCorp",
    'external_id': "foo_llc"
}
request = {'company': new_company}

try:

    # This is the API call that actually creates the new company.
    result = client_service.projects().companies().create(
       parent=project_id, body=request).execute()

    # You can easily just print the result as a string if you want
    print('Company created: %s' % result)

    # Or you can individual fields.  The fields returned depend on what's specified
    # in the "new_company" object.  To see possible fields of the
    # response, see the "create" documentation at:
    # http://googleapis.github.io/google-api-python-client/docs/dyn/jobs_v3.projects.companies.html#create
    print('%s: %s, %s' % (result.get('externalId'),
                       result.get('displayName'),
                       result.get('name')))

except Error as e:
    print('Got exception while creating company')
    raise e

このコードは何を行っているのでしょうか。始めましょう。以下に、関連するクライアント ライブラリの呼び出しを 2 つ示します。

  • client_service = build('jobs', 'v3') は、Google API Python クライアント ライブラリを使用してサービス オブジェクトを作成します。
  • client_service.projects().companies().create(parent=project_id, body=request).execute() は、API 呼び出しを実行して会社を作成します。この呼び出しへのレスポンスは、会社情報を含むオブジェクトです。リクエスト オブジェクトとレスポンス オブジェクトの内容は、create メソッドのドキュメントに記載されています。

コマンド プロンプト(コードエディタ ウィンドウの下に役立つ)からファイルを実行すると、次の出力が表示されます。

> python create_company.py
Company created: {u'externalId': u'foo_llc', u'displayName': u'FooCorp', u'name': u'projects/[PROJECT_ID]/companies/1cd6ada9-e678-49cf-80da-aaaf8876feda'}
Foo_llc, FooCorp, projects/[PROJECT_ID]/companies/1cd6ada9-e678-49cf-80da-aaaf8876feda 

name は Job Search API で生成される一意の識別子ですが、external_id は独自のジョブシステムから指定する識別子です。API を使ってオブジェクトを参照する場合、必ず名前を使用する必要があります。

会社の更新

システム内にすでに企業エンティティがあり、フィールドを追加または変更する場合、プロセスは次の手順に分かれています。

  • 会社の現在のフィールド値を使用してオブジェクトを作成します。
  • 新しいフィールドまたは更新されたフィールドでそのオブジェクトを更新します。API が更新対象の会社を認識できるように、会社&name; フィールドをキーとして使用します。
  • 「パッチ」メソッドを使用して新しいオブジェクトを送信します。

このプロセスでは、実際に更新した値にかかわらず、会社の値がすべて上書きされるため、既存の値をすべて設定しておく必要があります。つまり、会社情報を更新する前に、その情報を取得する必要があります。

新しいファイルを update_company.py ワークスペースに作成します。無効の場合は、get_company メソッドを以下のように追加します。

update_company.py

import os

from googleapiclient.discovery import build
from googleapiclient.errors import Error

# Build the service object, passing in the api name and api version
client_service = build('jobs', 'v3')
project_id = 'projects/' + os.environ['GOOGLE_CLOUD_PROJECT']
company_name = 'Your company name goes here'


def get_company(company_name):
   try:
       company_existed = client_service.projects().companies().get(
           name=company_name).execute()
       print('Company existed: %s' % company_existed)
       return company_existed
   except Error as e:
       print('Got exception while getting company')
       raise e


newCompany = get_company()

この時点で注目すべき点が、API 呼び出しが会社を設立する場合と明らかに似ている点です。クライアント ライブラリは REST インターフェースに合わせて生成されるため、企業で行う CRUD 操作はすべて client_service.projects().companies().theMethod(argName=argValue).execute(). という形式になります。

既存の値のセットを取得したら、更新するフィールド名とその新しい値を含む「パッチ」オブジェクトを作成し、それを使用して会社のオブジェクトを新しい値で更新します。ここでは、Python でのこの処理についてご紹介します。クライアント ライブラリは、会社を辞書オブジェクトとして表したものです。これは、メソッドがすでに組み込まれていることを意味します。複雑なループは必要ありません。作成済みのコードのすぐ下に辞書オブジェクトを作成します。

update_company.py

...  
    patch = {
       'displayName': "The New Bar",
       'websiteUri': "http://www.example.com"
    }
    newCompany.update(patch)
    print("Debug: New company info %s " % newCompany)
... 

あとは、リクエスト オブジェクトを作成して(そこに含まれる内容の詳細については、パッチ ドキュメントを参照)、API 呼び出しを実行するだけです。

... 
    request = {'company': newCompany}
 
    company_updated = client_service.projects().companies().patch(
        name=company_name, body=request).execute()
    print('Company updated: %s' % company_updated)
... 

あるいは、実際に変更するフィールドだけを提供したい場合は、フィールドを更新アップデート マスクに含めます。これは、会社オブジェクトの設定をまだ更新していない場合、または更新する項目が 1 つしかなく、不必要に大きなオブジェクトをやり取りしたくない場合に便利です。その一方で、アップデート マスクをどのように使用すればよいでしょうか。企業情報を更新する画期的で斬新な方法を示すコードはどこにありますか。

説明を読みました。下記のスニペットでは、エントリ全体を置き換えるのではなく、更新マスクを使用して会社情報を更新します。

update_company.py

... 
   # New set of fields, not the complete company object
   companyFields = {'displayName': 'The New Bar',
                    'websiteUri': 'http://shouldNotUpdate.com',
                    'externalId': 'bar_llc'}

   # Note that the mask only contains the display name, not the URL.
   # This is entirely for demonstration purposes.  This mask will tell the API
   # to update the display name, but NOT the website uri.
   mask = 'displayName'
   request = {'company': companyFields,
              'update_mask': mask}
   company_updated = client_service.projects().companies().patch(
       name=company_name,
       body=request).execute()
   print('Company updated!: %s' % company_updated)
... 

API 呼び出しは同じです。違いは、リクエスト オブジェクトには 1 つのフィールド(会社)ではなく、2 つのフィールド(companyupdate_mask)が含まれる点です。更新マスクはフィールドのカンマ区切りのリストです。マスクに「websiteUri"」フィールドを含める場合、マスク値は次のようになります。

   mask = 'displayName,websiteUri'

どちらの方法を選択しても Cloud Shell から実行できます。これらの print ステートメントを残しておくと、会社の新旧両方の値を示す出力が表示されます。

$ python update_company.py
Company existed: {u'externalId': u'bar_llc', u'displayName': u'The New Bar', u'name': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'websiteUri': u'http://www.example.com'}
Company {u'externalId': u'bar_llc', u'displayName': u'The New Bar', u'name': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'websiteUri': u'http://www.example.com'}
New company info {u'externalId': u'bar_llc', u'name': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'displayName': 'The New Bar', u'websiteUri': 'http://www.example.com'}
Company updated: {u'externalId': u'bar_llc', u'displayName': u'The New Bar', u'name': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'websiteUri': u'http://www.example.com'}
$

求人情報を検索しない求人情報検索ソリューションには意味がありません。前のセクションでは、会社の作成方法についてお話ししました。次に、ジョブの作成方法と作業のベスト プラクティスについて説明します。

ジョブは会社に関連付けられます。まだ API を使用して作成した会社がない場合(または「削除」が問題なく終了し、唯一の会社を削除した場合)は、もう一度戻って会社を作成してください。これで、ジョブを作成する準備が整いました。

ジョブを作成する

ジョブの作成から始めましょう。

ジョブを作成するには、次のデータが必要です。

  • 会社の名前。人間が読める形式の「My fancy company LLC」の文字列ではなく、さらに長い「projects/[プロジェクト ID]/companies/Company_ID」という文字列です。
  • ジョブの要求 ID。これは会社の external_id に似ています。Cloud Job Solution API を現在の求人ソリューションと簡単に同期させるために、ジョブの一意の識別子を識別するものです。例:
  • ジョブのタイトル。ジョブの表示名です(例: "シニア Llama Wrangler.")。
  • ジョブの説明。注: 説明に適切な形式を適用するために、埋め込み HTML を含めることもできます。説明の必要はないコンテンツです。"<p>llama wranglers のチームを主導する。</p><p> llamas を主導する能力と経験が必要。"</p>
  • applicationInfo - 申請方法についての詳細情報。1 つ以上の URI、1 つ以上のメールアドレス、または詳細な説明を含む HTML 形式の文字列を使用できます。3 つのテーマをすべて追加することもできます。少なくとも 1 つ含める必要があります。

以前に作成した FooCorp 企業のジョブを作成する場合、フィールドは次のようになります。

name

projects/[PROJECT_ID]/companies/0123-Big-Hex-String-AABB0

requisition_id

シニア向け llama_wrangler

title

シニアラマラングラー

description

フルタイムのポジションには、経験豊富な Llama Wrangler が必要です。ラマの介護士のチームを本格的なラングラーに育てるトレーニングが必要なため、リーダーの能力が必要です。<p/>動物とうまく連携できなければならず、ときにはかなりの速さで走る準備ができています。極めて高速です。簡単なラマを紹介します。

application_info

URIs: http://www.example.com/llama_wrangler_application/

メール: llama-apply@example.com

会社名が手元にない場合は、ステップ 3 で使用した &gettcompany_code を使用して取得できます。

求人を作成するためのコードは、会社を作成するコードとよく似ています。最初の数行はよく似ておられるはずです(bla blah blah や client クライアント オブジェクトのインスタンス化です)。次に、リクエストを表すディクショナリ オブジェクト(ネストされた Key-Value ペアのセット)を作成し、「create」API 呼び出しとともに送信します。

create_job.py という名前のファイルに次のスニペットを貼り付けます。実際には、任意のファイル名を使用できますが、このチュートリアルでは、ファイル名は仮定しています。

create_job.py

import os

from googleapiclient.discovery import build
from googleapiclient.errors import Error

client_service = build('jobs', 'v3')
project_id = 'projects/' + os.environ['GOOGLE_CLOUD_PROJECT']

new_job = {
   'company_name': 'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e',
   'title': 'Senior Llama Wrangler',
   'description':
   """Experienced Llama Wrangler required for full-time position.
   Leadership ability required, as you will be taking a team of llama
   caregivers and training them up to full-scale wranglers.
   <p/>Must work well with animals and occasionally be prepared to run
   really, like really really fast.  Like REALLY fast.
   These are quick llamas.""",
   'requisition_id': 'senior_llama_wrangler',
   'application_info': {
       'uris': ['http://www.example.com/llama-wrangler-application'],
       'emails': ['llama-apply@example.com']
   }
}

try:
   # Nest that Job object in a "job" object.  Now it's an API request!
   request = {'job': new_job}

   # The actual API call happens here.
   result = client_service.projects().jobs().create(
       parent=project_id, body=request).execute()
   print('Job created: %s' % result)

except Error as e:
   print('Got exception while creating job')
   raise e

これを Cloud Shell から実行すると、作成したジョブを含む JSON の大きな blob が返されます。

$ python create_job.py
Job created: {u'languageCode': u'en', u'description': u'Experienced Llama Wrangler required for full-time position. Leadership ability required, as you will be taking a team of llama caregivers and training them up to full-scale wranglers.Must work well with animals and occasionally be prepared to run really, like really really fast. Like REALLY fast. These are some quick llamas.', u'applicationInfo': {u'emails': [u'llama-apply@example.com'], u'uris': [u'http://www.example.com/llama-wrangler-application']}, u'companyName': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'requisitionId': u'senior_llama_wrangler', u'title': u'Senior Llama Wrangler', u'postingExpireTime': u'2019-09-11T16:04:48.546Z', u'visibility': u'ACCOUNT_ONLY', u'postingCreateTime': u'2019-08-12T16:04:48.546Z', u'companyDisplayName': u'Masked Panda Inc', u'postingUpdateTime': u'2019-08-12T16:04:48.611Z', u'postingPublishTime': u'2019-08-12T16:04:48.611Z', u'name': u'projects/[PROJECT_ID]/jobs/12345}

上記のような結果が返された場合は、ジョブは正常に作成されています。

ジョブは一意である必要があります

テストでは、最後のスクリプトを再度実行して、何が起こるかを確認します。

$ python create_job.py
Got exception while creating job
Traceback (most recent call last):
  File "create_job.py", line 37, in <module>
    raise e
googleapiclient.errors.HttpError: <HttpError 409 when requesting https://jobs.googleapis.com/v3/projects/[PROJECT_ID]/jobs?alt=json returned "Job projects/[PROJECT_ID]/jobs/103672929591403206 already exists. Request ID for tracking: ec94f4cb-70f1-48cf-bae6-b4dad056ac3f:APAb7ITRlgTTpVMONSSBCG4LnFzqR765Eg==. Related Job requisition ID: senior_llama_wrangler.">

ここで何が起きたのでしょうか。重複する求人情報を入力しました。期限切れでないジョブは、システム内で一意である必要があります

一意性は次のフィールドによって決まります。

  • 会社名 - ジョブの作成時に必須、更新不可
  • 求人 ID - ジョブの作成時に必須、更新不可
  • 言語コード - 省略可。デフォルトは en_us、更新可能

作成または更新しようとしたジョブに、期限切れでない既存のジョブと共通するこれら 3 つの項目すべてが存在する場合、それらのジョブは重複していると見なされ、作成または更新は失敗となり、上記のエラー メッセージが表示されます。

送信しました

これで、1 つの会社とその会社の求人情報がシステムに登録されました。すべて 1 時間未満ですべて完了しました。ここまでの話で、求人情報検索サイトをインターネットで見つけやすくなるまでに要した時間がわかりますか。1 時間以上。もっと気に入りましょう。週月。役員会もスプレッドシートと行動指針が関係していたかもしれません。それらのオフィスでは、それが現実のものになっていたでしょう。よろしければ、1 時間強。すばらしいですね!

他にもさまざまな機能があります。先に進みましょう。

Job の更新

企業の場合と同様に、ジョブを取得して詳細を確認し、更新するジョブにパッチを適用できます。

ここでは、ジョブの詳細を取得します。以下のスニペットに見覚えがある場合は、前のセクションの「get_company」メソッドを取得し、「company」を「job_name」変数に追加したためです。まず、ジョブ情報の取得について見ていきましょう。

update_job.py

import os

from googleapiclient.discovery import build
from googleapiclient.errors import Error

client_service = build('jobs', 'v3')
project_id = 'projects/' + os.environ['GOOGLE_CLOUD_PROJECT']

# The interesting bit
def get_job():
   try:
       job_existed = client_service.projects().jobs().get(
           name=job_name).execute()
       print('Job existed: %s' % job_existed)
       return job_existed
   except Error as e:
       print('Got exception while getting job')
       raise e

job_name = "projects/[PROJECT_ID]/jobs/12345"
job_info = get_job(job_name)

実際にジョブを更新するには、会社を更新したときと同じオプションを使用します。つまり、更新した値を含む完全なオブジェクトを送信して古いジョブを置き換えるか、カンマ区切りのフィールド マスクを使用して小さなパッチを送信します。

update_job.py(オブジェクトの完全な置換による更新)

   # First the full-replacement method.  Update the complete job object with new field values.
   job_patch = {
       'title': "Rogue Llama Acquisition Engineer"
   }

   job_info.update(job_patch)
   request = {"job": job_info}

   job_updated = client_service.projects().jobs().patch(
       name=job_name, body=request).execute()
   print ("Updated job info : %s" % job_updated)

update_job.py(新しいフィールド値と更新マスクのみ)

   # Alternatively, if you know which fields have been updated, you can submit a patch with just the changes
   # and an update mask. This time let's just re-use the same job patch, and create an update mask.
   job_patch = {
       'title': "Rogue Llama Acquisition Engineer"
   }

   update_mask = "title"
   request = {"job": job_patch,
              "updateMask": update_mask
              }

   job_updated = client_service.projects().jobs().patch(
       name=job_name, body=request).execute()

   print ("Updated job info : %s" % job_updated)   

上記の 2 つのスニペットは、まったく同じことを行います。特定の求人情報を役職「Rogue Llama Acquisition Engineer」で更新します。また、API 呼び出しの行は同じです。唯一の違いは、リクエスト オブジェクト内です。1 つは完全なジョブ オブジェクトで、このジョブオブジェクトがそのジョブ名に置き換えられます。もう 1 つは、更新するフィールドのセットです。

どちらの方法を選択しても、出力は同じになります。ぜひ挑戦してみてください。

$ python update_job
Updated job info : {u'languageCode': u'en', u'description': u'Experienced Llama Wrangler required for full-time position. Leadership ability required, as you will be taking a team of llama caregivers and training them up to full-scale wranglers.Must work well with animals and occasionally be prepared to run really, like really really fast. Like REALLY fast. These are some quick llamas.', u'applicationInfo': {u'emails': [u'llama-apply@example.com'], u'uris': [u'http://www.example.com/llama-wrangler-application']}, u'companyName': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'derivedInfo': {u'jobCategories': [u'SCIENCE_AND_ENGINEERING']}, u'requisitionId': u'senior_llama_wrangler', u'title': u'Rogue Llama Acquisition Engineer', u'postingExpireTime': u'2019-09-11T16:04:48.546Z', u'visibility': u'ACCOUNT_ONLY', u'postingCreateTime': u'2019-08-12T16:04:48.546Z', u'companyDisplayName': u'Masked Panda Inc', u'postingUpdateTime': u'2019-08-12T19:28:41.850Z', u'postingPublishTime': u'2019-08-12T16:04:48.611Z', u'name': u'projects/[PROJECT_ID]/jobs/12345}

おめでとうございます。ステップ 4 を完了しました。

さあ、顔を上げましょう。というのは、いわば生産性のモンスターのようなものです。ここまでで、会社を作成してジョブを作成し、一気にアップデートできるようになりました。しかし、興味深いことに気づかない方もいらっしゃるでしょう。D を C.R.U.D に置く最後のオペレーションです。それらを削除するには、どうすればよいでしょうか。読者の皆さま、ご安心ください次のセクションで詳しく説明します。

企業から始めます。約 5 分で説明が理にかなっている理由があります。

会社を削除する

会社の削除は簡単です。会社を作成または更新したときと同じ import ステートメントを使用して、delete メソッドを呼び出し、会社名だけを渡します(リクエスト本文は必要ありません)。

   # Yup, that's the whole thing.
   company_to_delete = "Insert company name here"
   result = client_service.projects().companies().delete(
       name=company_to_delete).execute()

この API の使用中にクリーンアップに役立つよう、ここでは会社の名前をコマンドライン パラメータとして受け取り、推測で会社を削除するシンプルな Python スクリプトについて説明します。

delete_company.py

from googleapiclient.discovery import build
from googleapiclient.errors import Error

client_service = build('jobs', 'v3')

# Name of the company to delete
company_to_delete = 'projects/[PROJECT_ID]/companies/123-abc-123'

try:
   # Yup, that's the whole thing.
   result_company = client_service.projects().companies().delete(
       name=company_to_delete).execute()

   print('Result of deleting company: %s' % result_company)

except Error as e:
   print('Got exception while deleting company')
   raise e

会社名を唯一のコマンドライン引数として渡して呼び出します。

$ python delete_company.py projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e
Got exception while deleting company
Traceback (most recent call last):
  File "delete_company.py", line 29, in <module>
    raise e
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://jobs.googleapis.com/v3/projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e?alt=json returned "Company with name projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e still has open jobs. Request ID for tracking: 6b9fe1a0-50ae-48b0-b33d-1622d547c363:APAb7ISnO4taWI4poffoX/EqzRCPSwpEbQ==">

これで準備完了です。成功しました。しばらくお待ちください。説明エラー?"まだ募集中の求人

これで、これで、会社を削除するという 1 つ目のルールがわかりました。その会社に募集中の求人がありていなければ、そのルールは失敗するということです。対応方法会社に関連付けられているすべての募集中の求人をすべて削除する必要があります。

まず、私が考えているのは、私が作成した求人情報を削除し、その後、一緒に行った会社を削除することです。説明は以上です。これを実現しましょう。

delete_company.py

from googleapiclient.discovery import build
from googleapiclient.errors import Error

client_service = build('jobs', 'v3')

# Replace with your actual company and job names.
company_to_delete = 'projects/[PROJECT_ID]/companies/123-abc-123'
job_to_delete = 'projects/[PROJECT_ID]/jobs/12345'

try:
   result_job = client_service.projects().jobs().delete(
       name=job_to_delete).execute()

   result_company = client_service.projects().companies().delete(
       name=company_to_delete).execute()

   print('Result of deleting job: %s' % result_job)
   print('Result of deleting company: %s' % result_company)

except Error as e:
   print('Got exception while deleting company')
   raise e

もう一度実行してみてください。これらの API 呼び出しから返される値は、現在の「company」と「job」のエントリを空にする必要があります。

python delete_company.py
Result of deleting job: {}
Result of deleting company: {}

そう、よくできました。

最後になりますが、上記の解決策は、読者(読者)が

  • この会社の既存のすべてのジョブにはすでにジョブ名が付与されています。
  • 同社の求人を手動で作成したにはあまりにも多く作成していません。

話題にならなかったごっこ

そこで、指定されたプロジェクト ID と親会社に一致するジョブを返す API 呼び出し jobs.list() が追加されました。このメソッドは以下のように呼び出します。

jobs_response = client_service.projects().jobs().list(
    parent=project_id,
    filter='companyName="' + company_name + '"').execute()
if jobs_response.get('jobs') is not None:
    for job in jobs_response.get('jobs'):
        print('- %s: %s' % (
              job.get('title'),
              job.get('name')))

Google Cloud Talent Solution Job Search API を使用して、会社と求人情報を作成、管理できるようになりました。

学習した内容

  • 会社を作成、管理する
  • それらの会社の求人情報の作成と管理
  • ユーザーの代わりに API とやり取りできるようにサービス アカウントを設定する

詳細