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()