SharePointリストをデータソースとしてPower Appsを作成したり、何かとSharePointリストで検証をしたい時があります。
これまではExcelからSharePointリストへエクスポートすることで対応していました。
ただ、
- Excelからのエクスポートは、その都度リストが新規作成され、Power Appsなどの接続先の修正が面倒
- 10万件以上のデータをSharePointにエクスポートするにはPCスペックが必要
という面倒なことがありました。
特に10万件以上のデータを準備したい時にはPower automateなどを駆使してフローを組まないと作れず、データを作る手間が多すぎました。
それをPythonから直接SharePointリストへ作成できるようになったので備忘録としてまとめておきます。
Microsoft Graphを利用するための設定を行う
PythonからSharePointへ接続する際に、Microsoft Graphを利用します。Azure Active Directory上で設定が必要です。
設定内容等につては、下記の記事で紹介しています。
Mimesisでテストデータを作成する
Pythonで適当なデータを作成する方法として、Mimesisというライブラリを利用します。
インストールされていない場合はインストールしておいてください。
pip install Mimesis
作成できるデータの内容や、作成方法は下記記事で解説しています。
実際のコード
実際のコードはこちらです。
import msal
import requests
from mimesis import Generic
from mimesis.random import Random
from mimesis.locales import Locale
# 1回のループで生成するデータ件数
batch_size = 10
# ループ回数
num_batches = 1
# num_batches = 1
# MSALの設定
authority = 'https://login.microsoftonline.com/<YOUR_TENANT_ID>'
client_id = '<YOUR_CLIENT_ID>'
scope = ['https://graph.microsoft.com/.default'] # スコープを指定
app = msal.ConfidentialClientApplication(
client_id,
authority=authority,
client_credential="<YOUR_CLIENT_SECRET>" # クライアントシークレットを指定
)
result = app.acquire_token_silent(scope, account=None)
if not result:
# キャッシュされたトークンがない場合、新たにトークンを取得する
result = app.acquire_token_for_client(scopes=scope)
if "access_token" in result:
# SharePointへのアクセストークンを取得
access_token = result["access_token"]
# SharePointサイトのURLを指定
api_url = "https://graph.microsoft.com/v1.0/sites/<YOUR_SITE_ID>/lists/<YOUR_LIST_ID>/items"
headers = {
'Authorization': 'Bearer ' + access_token,
"Content-Type": "application/json"
}
gen = Generic(locale=Locale.JA) # もし日本語のデータが欲しい場合は引数を'JA'に設定
random = Random()
for _ in range(batch_size):
data = {
"fields":{
# モックデータの生成
"Title": "1",
'address': gen.person.email(),
'full_name' : gen.person.full_name(),
'sex' : gen.person.sex(),
'age':gen.person.age(),
'username' : gen.person.username(),
'password' : gen.person.password()
}
}
response = requests.post(api_url, headers=headers, json=data)
if response.status_code == 201:
print("成功")
else:
print(f"リストの追加に失敗しました。 Status code: {response.status_code}")
else:
print("MSAL での認証に失敗しました。")
ループ回数などを設定することで、大量のデータを作成することができます。任意の数字に自由に書き換えてください。
# 1回のループで生成するデータ件数
batch_size = 10
# ループ回数
num_batches = 1
# num_batches = 1
ただ、取得したトークンは60~90分で有効期限が切れます。有効期限が切れた後の処理は全て失敗になります。私の環境では、大体15,000件程度が60分で終わりましたので、多くとも同じぐらいのデータ量までにすることをおすすめします。
こちらの記事でも解説していますが、テナントIDやクライアントIDなどを実際の値に置き換えます。
APIのURLにサイトIDとリストIDを利用しています。
api_url = "https://graph.microsoft.com/v1.0/sites/<YOUR_SITE_ID>/lists/<YOUR_LIST_ID>/items"
サイトID等は下記記事を参考に取得して実際の値に置き換えてください。
dataに「列名:入れたい値」という形式で入れたいデータを作成します。列名はSharePointの列名と同じになるように設定してください。
data = {
"fields":{
# モックデータの生成
"Title": "1",
'address': gen.person.email(),
'full_name' : gen.person.full_name(),
'sex' : gen.person.sex(),
'age':gen.person.age(),
'username' : gen.person.username(),
'password' : gen.person.password()
}
}
実行時間目安
実際に実行した際の時間です。数回実行しましたが、大体同じぐらいの時間で終わりました。
件数 | 時間 |
---|---|
1,000 | 00:03:48 |
5,000 | 00:18:14 |
10,000 | 00:38:02 |
15,000 | 00:57:18 |