Skip to content

Commit

Permalink
feat: 🎸 ダイレクトメッセージのデータをスプレッドシートに送り込む
Browse files Browse the repository at this point in the history
  • Loading branch information
nikukyugamer committed Jun 27, 2022
1 parent 0a6ac78 commit 558a48d
Show file tree
Hide file tree
Showing 6 changed files with 156 additions and 42 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
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
3 changes: 1 addition & 2 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 Down
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['種類']
)
},
'「種類」の「入力規則」を設定する'
)
}
74 changes: 49 additions & 25 deletions clasp/gensosenkyo/createTweetCountingSheets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,28 +37,35 @@ namespace createTweetCountingSheets {
)
}

export const setColumnWidths = () => {
const colNameToNumber = ZzzColumnNames.colNameToNumber()
export const setColumnWidths = (category = '') => {
const colNameToNumber = ZzzColumnNames.colNameToNumber(category)

ZzzSheetOperations.applyFunctionToAllCountingSheets(
(sheet: GoogleAppsScript.Spreadsheet.Sheet) => {
sheet.setColumnWidth(colNameToNumber['ID'], 40)
sheet.setColumnWidth(colNameToNumber['screen_name'], 30)
sheet.setColumnWidth(colNameToNumber['tweet_id'], 50)
sheet.setColumnWidth(colNameToNumber['日時'], 30)
sheet.setColumnWidth(colNameToNumber['URL'], 30)
sheet.setColumnWidth(colNameToNumber['別ツイ'], 40)
sheet.setColumnWidth(colNameToNumber['全終了?'], 40)
sheet.setColumnWidth(colNameToNumber['ツイ見られない?'], 120)
sheet.setColumnWidth(colNameToNumber['集計対象外?'], 90)
sheet.setColumnWidth(colNameToNumber['ふぁぼ済?'], 90)
sheet.setColumnWidth(colNameToNumber['二次チェック済?'], 130)
sheet.setColumnWidth(colNameToNumber['内容'], 200)
sheet.setColumnWidth(colNameToNumber['備考'], 100)
sheet.setColumnWidth(colNameToNumber['要レビュー?'], 90)
sheet.setColumnWidth(colNameToNumber['キャラ1 or 作品名'], 140)
sheet.setColumnWidth(colNameToNumber['キャラ2 or 協力攻撃名'], 140)
sheet.setColumnWidth(colNameToNumber['キャラ3'], 140)

if (category === 'directMessage') {
sheet.setColumnWidth(colNameToNumber['dm_id'], 50)
sheet.setColumnWidth(colNameToNumber['DMが見られない?'], 120)
sheet.setColumnWidth(colNameToNumber['対応済み?'], 90)
} else {
sheet.setColumnWidth(colNameToNumber['tweet_id'], 50)
sheet.setColumnWidth(colNameToNumber['URL'], 30)
sheet.setColumnWidth(colNameToNumber['別ツイ'], 40)
sheet.setColumnWidth(colNameToNumber['ツイ見られない?'], 120)
sheet.setColumnWidth(colNameToNumber['ふぁぼ済?'], 90)
}
},
'列幅を指定しました'
)
Expand Down Expand Up @@ -100,19 +107,25 @@ namespace createTweetCountingSheets {
}

// 既存データを上書きする破壊的メソッドなので注意する
export const createCheckBoxes = () => {
const colNameToNumber = ZzzColumnNames.colNameToNumber()
export const createCheckBoxes = (category = '') => {
const colNameToNumber = ZzzColumnNames.colNameToNumber(category)

ZzzSheetOperations.applyFunctionToAllCountingSheets(
(sheet: GoogleAppsScript.Spreadsheet.Sheet) => {
const requiredCheckboxColumnNumbers = [
colNameToNumber['ツイ見られない?'],
colNameToNumber['集計対象外?'],
colNameToNumber['ふぁぼ済?'],
colNameToNumber['二次チェック済?'],
colNameToNumber['要レビュー?'],
]

if (category === 'directMessage') {
requiredCheckboxColumnNumbers.push(colNameToNumber['対応済み?'])
requiredCheckboxColumnNumbers.push(colNameToNumber['DMが見られない?'])
} else {
requiredCheckboxColumnNumbers.push(colNameToNumber['ふぁぼ済?'])
requiredCheckboxColumnNumbers.push(colNameToNumber['ツイ見られない?'])
}

requiredCheckboxColumnNumbers.forEach(requiredCheckboxColumnNumber => {
const range = ZzzCellOperations.getRangeSpecificColumnRow2ToRow101(requiredCheckboxColumnNumber, sheet)

Expand All @@ -124,7 +137,7 @@ namespace createTweetCountingSheets {
}

// 表示形式 -> ラッピング -> はみ出す | 折り返す | 切り詰める
export const setRappings = () => {
export const setRappings = (category = '') => {
const colNameToNumber = ZzzColumnNames.colNameToNumber()

ZzzSheetOperations.applyFunctionToAllCountingSheets(
Expand All @@ -134,9 +147,12 @@ namespace createTweetCountingSheets {
colNameToNumber['tweet_id'],
colNameToNumber['日時'],
colNameToNumber['URL'],
colNameToNumber['別ツイ'],
]

if (category !== 'directMessage') {
kiritsumeruColumnNumbers.push(colNameToNumber['別ツイ']) // DMでは存在しないカラム
}

kiritsumeruColumnNumbers.forEach(requiredColumnNumber => {
const range = ZzzCellOperations.getRangeSpecificColumnRow2ToRow101(requiredColumnNumber, sheet)

Expand All @@ -158,30 +174,34 @@ namespace createTweetCountingSheets {
)
}

export const setDefaultConditionalFormats = () => {
const colNameToNumber = ZzzColumnNames.colNameToNumber()

export const setDefaultConditionalFormats = (category = '') => {
ZzzSheetOperations.applyFunctionToAllCountingSheets(
(sheet: GoogleAppsScript.Spreadsheet.Sheet) => {
// 「全終了?」列
ZzzConditionalFormats.setInitToIsAllCompletedColumn(sheet)
// FIXME:
ZzzConditionalFormats.setInitToIsAllCompletedColumn(sheet, category)

// 「要レビュー?」列
ZzzConditionalFormats.setInitToIsRequiredReview(sheet)
ZzzConditionalFormats.setInitToIsRequiredReview(sheet, category)

// 「二次チェック済?」列
ZzzConditionalFormats.setInitToIsCompletedSecondCheck(sheet)

// 「ふぁぼ済?」列
ZzzConditionalFormats.setInitToIsCompletedFavorite(sheet)
ZzzConditionalFormats.setInitToIsCompletedSecondCheck(sheet, category)

if (category === 'directMessage') {
// 「対応済み?」列
ZzzConditionalFormats.setInitToIsCompletedDMResponse(sheet, category)
} else {
// 「ふぁぼ済?」列
ZzzConditionalFormats.setInitToIsCompletedFavorite(sheet, category)
}
},
'「条件付き書式」の設定'
)
}

// 特定条件において行全体を灰色の背景にする「条件付き書式」
export const setGrayBackGroundInSpecificCondition = () => {
const colNameToNumber = ZzzColumnNames.colNameToNumber()
export const setGrayBackGroundInSpecificCondition = (category = '') => {
const colNameToNumber = ZzzColumnNames.colNameToNumber(category)
let columnAlphabet: string
let newRule: GoogleAppsScript.Spreadsheet.ConditionalFormatRule

Expand All @@ -200,7 +220,11 @@ namespace createTweetCountingSheets {
)
rules.push(newRule)

columnAlphabet = ZzzConverters.convertColumnNumberToAlphabet(colNameToNumber['ツイ見られない?'])
if (category === 'directMessage') {
columnAlphabet = ZzzConverters.convertColumnNumberToAlphabet(colNameToNumber['DMが見られない?'])
} else {
columnAlphabet = ZzzConverters.convertColumnNumberToAlphabet(colNameToNumber['ツイ見られない?'])
}

newRule = ZzzConditionalFormats.getRuleToSetGrayBackgroundToAllRowCellsInSpecificCondition(
i,
Expand Down

0 comments on commit 558a48d

Please sign in to comment.