Box Signテンプレートの使用

Yuko Taniguchi
Box Developer Japan Blog
13 min readDec 20, 2023

この記事では、Box Platformを使用してテンプレートからドキュメントに電子サインを行う方法について説明します。

Box Signテンプレートは、構造化されたドキュメントの一種であり、そこでは署名者とその役割が明らかで、署名やその他のプロパティの配置がテンプレートにすでに存在します。

前回の記事では、テンプレートの使用に共通する署名リクエストの多くの機能だけでなく、非構造化ドキュメントにBox Signを使用する方法についても説明しました。前回の記事については以下を参照してください。

今後の記事では、構造化されたドキュメントや複雑なユースケースに焦点を当てる予定です。

このワークショップは、こちらのGitHubリポジトリにあるコードサンプル一式を使用して進めることができます。ここでは、Box Platformの次世代のPython SDKを使用します。

Box Signテンプレート

Box Signテンプレートは、テキストだけでなく、署名の要件や配置も含む特別な種類のドキュメントです。

基本的に、Box Signテンプレートは、署名用に事前に準備されているドキュメントであるため、署名者に直接送信できます。

必須フィールドには、署名、フルネーム、日付など、その他多くのオプションがあります。

これらのフィールドには1人のオーナーが設定されています。つまり、フィールドは署名者が入力され、署名者間で共有することはできません。これらは、必須または省略可にすることができるほか、アプリケーションによって事前入力することもできます。ただし、事前入力されている場合でも、署名者がいつでも変更できます。

それでは、テンプレートの作成から始めましょう。

テンプレートの作成

Boxアプリから、左側の [Sign] メニューに移動し、[テンプレート] を選択します。

Box Signで [テンプレート] に移動

次に、[新しいテンプレート] ボタンをクリックし、Boxからドキュメントを選択またはアップロードします。

この演習では、ドキュメントが準備されているため、workshops/sign/docsに移動し、Simple-PDF.pdfを選択して、[次へ] をクリックします。または、テストドキュメントを選択またはアップロードします。

テンプレート作成時にドキュメントを選択

次のように、日付、名前、署名フィールドをテンプレートにドラッグアンドドロップします。

テンプレートに署名、名前、日付を追加

テンプレートを保存します。

テンプレートの識別

Box Sign APIでテンプレートを使用するには、template_idが必要になります。ユーザーが使用できるすべてのテンプレートのリストを取得する、次のメソッドを考えてみましょう。

def sign_templates_list(client: Client):
"""List all sign templates"""
sign_templates = client.sign_templates.get_sign_templates()
print(f"\nSign templates: {len(sign_templates.entries)}")
for sign_template in sign_templates.entries:
print(f" {sign_template.id} - {sign_template.name}")

mainメソッドはシンプルに次のようにします。

def main():
"""Simple script to demonstrate how to use the Box SDK"""
conf = ConfigOAuth()
client = get_client_oauth(conf)

user = client.users.get_user_me()
print(f"\nHello, I'm {user.name} ({user.login}) [{user.id}]")

sign_templates_list(client)

if __name__ == "__main__":
main()

次のような結果が返されます。

Hello, I'm Rui Barbosa [18622116055]

Sign templates: 1
94e3815b-f7f5-4c2c-8a26-e9ba5c486031 - Simple-PDF.pdf

テンプレートからの署名リクエストの作成

テンプレートを使用する大きな利点は、ドキュメントの準備について心配する必要がないことです。必要なのは、署名者のメールアドレス、テンプレート、署名済みドキュメントを格納するフォルダだけです。

次の例を考えてみましょう。

def create_sign_request(client: Client, template_id: str, signer_email: str):
"""Create sign request from template"""
parent_folder = FolderMini(
id=SIGN_DOCS_FOLDER, type=FolderBaseTypeField.FOLDER
)

signer = SignRequestCreateSigner(
email=signer_email,
)
sign_request = client.sign_requests.create_sign_request(
signers=[signer],
parent_folder=parent_folder,
template_id=template_id,
)
return sign_request

mainで次のように使用します。

def main():
...

# Create sign request from template
sign_request = create_sign_request(client, TEMPLATE_SIMPLE, SIGNER_A)
check_sign_request(sign_request)

結果は次のとおりです。

Simple sign request: b25674a2-540b-4201-ae18-a78f05ef1a9a
Status: created
Signers: 2
final_copy_reader: ...@gmail.com
signer: YOUR_EMAIL+a@gmail.com
Prepare url: None

送信者の受信トレイに移動し、署名リクエストを完了します。

テンプレートにはすでに署名要件が設定されているため、ドキュメントの準備は必要ありませんが、日付には現在の日付が自動的に入力されていることに注意してください。

しかし、名前を事前入力したい場合はどうすればよいでしょうか。

署名の属性の事前入力

使いやすさの観点から、ユーザーに求める入力データを事前に設定すると、ストレスをいくらか減らすことができます。

一部の入力データは意図的に入力されていない可能性があることにご注意ください。例えば、法務部門では、署名者が明示的に「はい、同意します」と設定する必要があると規定しているとします。

Boxアプリの署名テンプレートエディタを使用すると、各入力データにexternal_idを割り当てて、アプリに任意のデータソースから入力データを入力させることができます。

これを名前に実装しましょう。

テンプレートのデザインに戻り、次のように [名前フィールド] にIDを追加します。

署名プロパティの入力データにタグIDを割り当て

テンプレートを保存します。

名前を事前入力する新しいメソッドを作成します。

def create_sign_request_name_default(
client: Client, template_id: str, signer_name, signer_email: str
):
"""Create sign request from template"""
parent_folder = FolderMini(
id=SIGN_DOCS_FOLDER, type=FolderBaseTypeField.FOLDER
)

signer = SignRequestCreateSigner(
email=signer_email,
)
# tags
tag_full_name = SignRequestPrefillTag(
document_tag_id="signer_full_name",
text_value=signer_name,
)
sign_request = client.sign_requests.create_sign_request(
signers=[signer],
parent_folder=parent_folder,
prefill_tags=[tag_full_name],
template_id=template_id,
)
return sign_request

mainで次のように使用します。

def main():
...

# Create sign request from template with name
sign_request_name = create_sign_request_name_default(
client, TEMPLATE_SIMPLE, "Signer A", SIGNER_A
)
check_sign_request(sign_request_name)

結果は次のとおりです。

Simple sign request: adab1740-eeba-4392-a3f5-defddc79c946
Status: created
Signers: 2
final_copy_reader: ...@gmail.com
signer: ...+a@gmail.com
Prepare url: None

署名者の受信トレイを開き、署名リクエストを完了します。

ドキュメントに署名

名前が事前入力されていることに注目してください。ただし、署名者はその名前を変更できます。

テンプレートに関する詳細情報の取得

ユーザーが使用できるテンプレートのリストを取得できることはわかりましたが、

特定のテンプレートの詳細情報を取得することもできます。

テンプレートの基本情報を返すほか、署名要件をすべて列挙するメソッドを作成します。

def sign_template_print_info(client: Client, template_id: str):
sign_template = client.sign_templates.get_sign_template_by_id(template_id)
print(f"\nSign template: {sign_template.id} - {sign_template.name}")
print(f" Signers: {len(sign_template.signers)}")
for signer in sign_template.signers:
print(f" {signer.role.value}")
if len(signer.inputs) > 0:
print(" Tag ID\t Type\t Required")
for input in signer.inputs:
print(
f" {input.document_tag_id} {input.type.value} {input.is_required}"
)

mainで次のように使用します。

def main():
...

# Print sign template details
sign_template_print_info(client, TEMPLATE_SIMPLE)

結果は次のとおりです。

Sign template: 94e3815b-f7f5-4c2c-8a26-e9ba5c486031 - Simple-PDF.pdf
Signers: 2
final_copy_reader
signer
Tag ID Type Required
None date True
signer_full_name text True
None signature True

signer_full_nameは、名前の事前入力に使用したタグIDです。

まとめ

テンプレートは、署名用の構造化されたドキュメントの一種で、署名要件がすでに定義され、ドキュメントに配置されています。

これは、契約管理チームを満足させるだけではなく、ユーザーにとって一貫性があり労力の少ないプロセスを構築します。

さらに、ドキュメントの署名要件に多くの選択肢がある場合は、別のデータソースからこれらを事前に入力して、ユーザーの時間を節約することができます。

これらのプロパティを所有するユーザーはいつでも変更できることを覚えておいてください。

テンプレートを作成するためのAPIエントリポイントはないため、Boxアプリから手動で作成して管理する必要があります。

ただし、そのための回避策はあります。今後にご期待ください。

ドキュメントと参考情報

アイデア、コメント、フィードバックがある場合は、コミュニティフォーラム (英語のみ) にコメントをお送りください。

--

--