Open5
slackからユーザーごとのリアクション数を集計する
ピン留めされたアイテム
メモ:これくらいならやはり自分で書いたほうが早い。
JSONの形式が決まっており、分かりやすい処理なのでChatGPTに全て任せてみる。
JSON構造を教えて、コードを書かせる。ChatGPTのいいところは自動家電と同じように他作業の片手間でコードが完成するところだと思っている。
import json
# JSONデータを読み込む
with open('data.json', 'r') as f:
data = json.load(f)
# ユーザーごとのリアクションのカウントを保存する辞書を作成する
user_reaction_counts = {}
# データを1つずつ処理する
for item in data:
# itemから"reactions"を取り出す
reactions = item['reactions']
# reactionsを1つずつ処理する
for reaction in reactions:
# reactionから"name"と"users"を取り出す
name = reaction['name']
users = reaction['users']
# usersを1つずつ処理する
for user in users:
# user_reaction_countsのuserに対応する値がなければ、新しいリストを作成する
if user not in user_reaction_counts:
user_reaction_counts[user] = []
# user_reaction_countsのuserに対応するリストに、nameをキーとして1を値とした辞書を追加する
user_reaction_counts[user].append({name: 1})
# 結果を表示する
print(user_reaction_counts)
正確性チェックは後回しにしspreadsheetに保存するコードを引き続きかかせる。
# Google Spreadsheet APIを使用する
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
# スプレッドシートサービスを作成する
service = build('sheets', 'v4', credentials=creds)
# スプレッドシートのIDを指定する
spreadsheet_id = 'XXXXX' # スプレッドシートのIDを指定する
# シートを作成する
sheet_name = 'Sheet1' # シート名
body = {
'requests': [{
'addSheet': {
'properties': {
'title': sheet_name
}
}
}]
}
# リクエストを送信する
response = service.spreadsheets().batchUpdate(spreadsheetId=spreadsheet_id, body=body).execute()
print(response)
# シートに書き込む
values = []
# ヘッダーを作成する
values.append(['user', 'name', 'count'])
# ユーザーごとに処理をする
for user, reactions in user_reaction_counts.items():
# リアクションごとに処理をする
for reaction in reactions:
# リアクション名を取得する
name = list(reaction.keys())[0]
# リアクションカウントを取得する
count = list(reaction.values())[0]
# シートに書き込むデータを作成する
values.append([user, name, count])
# シートに書き込む
body = {
'values': values
}
result = service.spreadsheets().values().update(
spreadsheetId=spreadsheet_id, range=f'{sheet_name}!A1',
valueInputOption='RAW', body=body).execute()
print(f'{result["updatedCells"]} cells updated.')
当然だがchatGPTに渡す際にデータ内のuser_idやユーザー名は排除する
怪しいので再出力
# Google Sheets APIをインポートする
import google.auth
from googleapiclient.discovery import build
from googleapiclient.errors import HttpError
# Google Sheets APIを使用するための認証情報を取得する
credentials, _ = google.auth.default()
# Google Sheets APIのサービスを作成する
service = build('sheets', 'v4', credentials=credentials)
# スプレッドシートのIDを指定する
spreadsheet_id = 'your-spreadsheet-id'
# シート名を指定する
sheet_name = 'Sheet1'
# シートを取得する
sheet = service.spreadsheets().get(spreadsheetId=spreadsheet_id).execute()
sheets = sheet.get('sheets', '')
# シートが存在しない場合は、新しいシートを作成する
if not any(s.get('properties', {}).get('title', '') == sheet_name for s in sheets):
sheet = {
'properties': {
'title': sheet_name
}
}
result = service.spreadsheets().batchUpdate(spreadsheetId=spreadsheet_id, body={
'requests': [{
'addSheet': sheet
}]
}).execute()
sheets = result.get('replies', [])
# シートを取得する
sheet = next(s for s in sheets if s.get('properties', {}).get('title', '') == sheet_name)
sheet_id = sheet.get('properties', {}).get('sheetId', 0)
# シートにデータを書き込む
values = []
for client_msg_id, reactions in message_reaction_counts.items():
for reaction in reactions:
for name, count in reaction.items():
values.append([client_msg_id, name, count])
body = {
'requests': [{
'updateCells': {
'start': {
'sheetId': sheet_id,
'rowIndex': 0,
'columnIndex': 0
},
'rows': [{
'values': [{
'userEnteredValue': {
'stringValue': f'{client_msg_id}'
}
}, {
'userEnteredValue': {
'stringValue': f'{name}'
}
}, {
'userEnteredValue': {
'numberValue': count
}
}]
} for client_msg_id, name, count in values],
'fields': 'userEnteredValue'
}
}]
}
result = service.spreadsheets().batchUpdate(spreadsheetId=spreadsheet_id, body=body).execute()