Skip to content

Commit

Permalink
feat: 🎸 ダイレクトメッセージのデータをスプレッドシートに送り込む (#200)
Browse files Browse the repository at this point in the history
  • Loading branch information
nikukyugamer authored Jun 27, 2022
1 parent 0a6ac78 commit da2d382
Show file tree
Hide file tree
Showing 8 changed files with 225 additions and 57 deletions.
6 changes: 6 additions & 0 deletions app/models/direct_message.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ class DirectMessage < ApplicationRecord

validates :id_number, uniqueness: true

def self.for_spreadsheet
to_gensosenkyo
.order(messaged_at: :asc)
.order(id_number: :asc)
end

# self.user と同義
def sender
User.find_by(id_number: sender_id_number)
Expand Down
68 changes: 58 additions & 10 deletions app/services/sheets/write_and_update/direct_messages.rb
Original file line number Diff line number Diff line change
@@ -1,16 +1,64 @@
module Sheets
module WriteAndUpdate
class DirectMessages
def self.exec
direct_messages = DirectMessage.for_spreadsheet

direct_messages.each_slice(100).with_index do |dm_100, index_on_hundred|
prepared_written_data_by_array_in_hash = []

dm_100.each_with_index do |dm, i|
inserted_hash = {}

inserted_hash['screen_name'] = dm.user.screen_name
inserted_hash['dm_id'] = dm.id_number.to_s
inserted_hash['日時'] = dm.messaged_at.strftime('%Y/%m/%d %H:%M:%S').to_s
inserted_hash['内容'] = dm.content_text
# この行のコストが高い
inserted_hash['suggested_names'] = NaturalLanguage::SuggestCharacterNames.exec(dm) # Array

prepared_written_data_by_array_in_hash << inserted_hash
end

two_digit_number = format('%02<number>d', number: index_on_hundred + 1)
sheet_name = "集計_#{two_digit_number}"

written_data = []

prepared_written_data_by_array_in_hash.each_with_index do |written_data_hash, index|
row = []

# TODO: 取得漏れには 10001 始まりを付与したい
id_on_sheet = (index_on_hundred * 100) + (index + 1)

# TODO: ハードコーディングをしたくない
row[0] = id_on_sheet
row[1] = written_data_hash['screen_name']
row[2] = written_data_hash['dm_id']
row[3] = written_data_hash['日時']
row[10] = written_data_hash['内容']
row[49] = written_data_hash['suggested_names'] # 50列目 (AX)
row[199] = '' # 200列目 (GR) を表示させるために空文字を入れる

row.flatten! # suggested_names は長さが不定なので flatten する

written_data << row
end

# suggested_names を最初に全削除する
SheetData.write_rows(
sheet_id: ENV.fetch('COUNTING_DIRECT_MESSAGES_SHEET_ID', nil),
range: "#{sheet_name}!AX2:GR101",
values: [[''] * 50] * 100 # 100行分の空文字を入れる
)

SheetData.write_rows(
sheet_id: ENV.fetch('COUNTING_DIRECT_MESSAGES_SHEET_ID', nil),
range: "#{sheet_name}!A2", # 始点
values: written_data
)
end
end
end
end
end

# DM
# dms = DirectMessage.to_gensosenkyo
# dm = dms.first
# dm.messaged_at
# dm.content_text
# dm.user.screen_name
# dm.user.name
# id(自動) 送信者(自動) 内容(自動) キャラ1 キャラ2 キャラ3 ツイ見られない?(自動) 備考 要レビュー? 返信 or チェック済み? 全終了? ドロップダウン用配列(触らない)
# DM は言語が取得できない
12 changes: 6 additions & 6 deletions clasp/gensosenkyo/ZzzColumnNames.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,15 @@ namespace ZzzColumnNames {
'screen_name',
'dm_id',
'日時',
'DMが見られない?',
'備考',
'要レビュー?',
'二次チェック済み?',
'対応済み?',
'全終了?',
'DMが見られない?',
'集計対象外?',
'対応済み?',
'二次チェック済?',
'種類', // ZzzDataValidation.setDataValidationDirectMessageTypes
'内容',
'種類',
'備考',
'要レビュー?',
'キャラ1 or 作品名',
'キャラ2 or 協力攻撃名',
'キャラ3',
Expand Down
39 changes: 30 additions & 9 deletions clasp/gensosenkyo/ZzzConditionalFormats.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ namespace ZzzConditionalFormats {
}, '「条件付き書式」をクリアしました')
}

export const setInitToIsAllCompletedColumn = (sheet: GoogleAppsScript.Spreadsheet.Sheet) => {
const colNameToNumber = ZzzColumnNames.colNameToNumber()
export const setInitToIsAllCompletedColumn = (sheet: GoogleAppsScript.Spreadsheet.Sheet, category = '') => {
const colNameToNumber = ZzzColumnNames.colNameToNumber(category)

const requiredReviewColumnNumber = colNameToNumber['要レビュー?']
const requiredReviewColumnAlphabet = ZzzConverters.convertColumnNumberToAlphabet(requiredReviewColumnNumber)
Expand Down Expand Up @@ -81,8 +81,8 @@ namespace ZzzConditionalFormats {
)
}

export const setInitToIsRequiredReview = (sheet: GoogleAppsScript.Spreadsheet.Sheet) => {
const colNameToNumber = ZzzColumnNames.colNameToNumber()
export const setInitToIsRequiredReview = (sheet: GoogleAppsScript.Spreadsheet.Sheet, category = '') => {
const colNameToNumber = ZzzColumnNames.colNameToNumber(category)

const range = ZzzCellOperations.getRangeSpecificColumnRow2ToRow101(
colNameToNumber['要レビュー?'],
Expand All @@ -96,8 +96,8 @@ namespace ZzzConditionalFormats {
)
}

export const setInitToIsCompletedSecondCheck = (sheet: GoogleAppsScript.Spreadsheet.Sheet) => {
const colNameToNumber = ZzzColumnNames.colNameToNumber()
export const setInitToIsCompletedSecondCheck = (sheet: GoogleAppsScript.Spreadsheet.Sheet, category = '') => {
const colNameToNumber = ZzzColumnNames.colNameToNumber(category)

const range = ZzzCellOperations.getRangeSpecificColumnRow2ToRow101(
colNameToNumber['二次チェック済?'],
Expand All @@ -117,11 +117,32 @@ namespace ZzzConditionalFormats {
)
}

export const setInitToIsCompletedFavorite = (sheet: GoogleAppsScript.Spreadsheet.Sheet) => {
const colNameToNumber = ZzzColumnNames.colNameToNumber()
export const setInitToIsCompletedFavorite = (sheet: GoogleAppsScript.Spreadsheet.Sheet, category = '') => {
const colNameToNumber = ZzzColumnNames.colNameToNumber(category)

const range = ZzzCellOperations.getRangeSpecificColumnRow2ToRow101(
colNameToNumber['ふぁぼ済?'],
colNameToNumber['ふぁぼ済?'], // DMでは'対応済み?'
sheet
)
ZzzConditionalFormats.setColorToRangeInSpecificCondition(
range,
sheet,
'TRUE',
'#ccffcc' // Red
)
ZzzConditionalFormats.setColorToRangeInSpecificCondition(
range,
sheet,
'FALSE',
'#ffc0cb' // Red
)
}

export const setInitToIsCompletedDMResponse = (sheet: GoogleAppsScript.Spreadsheet.Sheet, category = 'directMessage') => {
const colNameToNumber = ZzzColumnNames.colNameToNumber(category)

const range = ZzzCellOperations.getRangeSpecificColumnRow2ToRow101(
colNameToNumber['対応済み?'],
sheet
)
ZzzConditionalFormats.setColorToRangeInSpecificCondition(
Expand Down
5 changes: 2 additions & 3 deletions clasp/gensosenkyo/ZzzDataValidation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ namespace ZzzDataValidation {
return sheet.getRange(rowNumber, 50, 1, 151)
}

export const setDataValidationDirectMessageTypes = (sheetName: string, columnNumber: number, destroyWord: string = '') => {
const sheet = ZzzSheetOperations.changeActiveSheetTo(sheetName)
export const setDataValidationDirectMessageTypes = (sheet: GoogleAppsScript.Spreadsheet.Sheet, columnNumber: number, destroyWord: string = '') => {
const startRowNumber = 2
const endRowNumber = 101

Expand All @@ -54,6 +53,6 @@ namespace ZzzDataValidation {
'ボ・開票イラスト',
'ボ・推し台詞',
'ボ・選挙運動',
'その他',
'票に関係ない',
]
}
64 changes: 64 additions & 0 deletions clasp/gensosenkyo/appForDirectMessages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
const mainForDirectMessages = () => {
// createTweetCountingSheets.destroyAllSheets()

// NOTE: 約6分かかる
createTweetCountingSheets.createAllSheets()

ZzzCommonScripts.showStartAndEndLogger(() => {
createTweetCountingSheets.setColumnNames('directMessage')
}, '列名を入力する')

ZzzCommonScripts.showStartAndEndLogger(() => {
createTweetCountingSheets.freezeFirstRowAndFirstColumn()
}, '一行目 および 一列目 を固定をする')

ZzzCommonScripts.showStartAndEndLogger(() => {
createTweetCountingSheets.setColumnWidths('directMessage')
}, '列幅を調整する')

ZzzCommonScripts.showStartAndEndLogger(() => {
createTweetCountingSheets.setBanpeis()
}, '102行目の各セルに "@" を入れる')

// 保護設定を全削除(やや重い処理)
ZzzSheetOperations.removeAllProtectedCellsOnAllSheets()

// やや重い処理
ZzzCommonScripts.showStartAndEndLogger(() => {
createTweetCountingSheets.createCheckBoxes('directMessage')
}, 'チェックボックスを作成する')

ZzzCommonScripts.showStartAndEndLogger(() => {
createTweetCountingSheets.setRappings('directMessage')
}, '「ラッピング」の形式を設定する')

// 「条件付き書式」を全削除
ZzzConditionalFormats.clearConditionalFormatsOnAllSheets()

// NOTE: 冪等ではない(追記となる)
ZzzCommonScripts.showStartAndEndLogger(() => {
// FIXME: 列がズレている
createTweetCountingSheets.setDefaultConditionalFormats('directMessage')
}, '「条件付き書式」を設定する')

// NOTE: 冪等ではない(追記となる)
ZzzCommonScripts.showStartAndEndLogger(() => {
createTweetCountingSheets.setGrayBackGroundInSpecificCondition('directMessage')
}, '(条件付き書式)特定のセルが条件を満たしたら行を灰色に塗る')

// サジェスト用に「入力規則」を設定する(重い)
createTweetCountingSheets.setDataValidationsForSuggestions('directMessage')

// 「種類」に「入力規則」を与える
const colNameToNumber = ZzzColumnNames.colNameToNumber('directMessage')

ZzzSheetOperations.applyFunctionToAllCountingSheets(
(sheet: GoogleAppsScript.Spreadsheet.Sheet) => {
ZzzDataValidation.setDataValidationDirectMessageTypes(
sheet,
colNameToNumber['種類']
)
},
'「種類」の「入力規則」を設定する'
)
}
Loading

0 comments on commit da2d382

Please sign in to comment.