メイン(VBA)
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const staterng As String = "C3:C33" '状態列 Const seirng As String = "K3:K33" '性向列 '現在時刻取得とフォーマット Dim daytime As Date daytime = Now Dim nowtime As String nowtime = Format(daytime, "yyyy/mm/dd HH:MM") '情報更新箇所取得 Dim trow As Variant trow = ActiveCell.Row '選択行 Dim account As Variant account = Cells(trow, 1).Interior.Color 'アカウントカラー Dim ccol As Variant ccol = RGB(192, 80, 77) 'チェックカラー Dim i As Integer '性向ゲージ再計算処理 If Not Application.Intersect(Target, Range(seirng)) Is Nothing Then '性向取得 Dim seikou As Integer seikou = Target.Value '塗りつぶしマス数計算 Dim masu As Variant masu = Application.WorksheetFunction.RoundUp(seikou / -16, 0) masu = masu + 3 '塗りつぶし処理 For i = 4 To 10 Cells(trow, i).Interior.Color = account Next For i = 4 To masu Cells(trow, i).Interior.Color = ccol Next Cancel = True '状態による計算処理 ElseIf Not Application.Intersect(Target, Range(staterng)) Is Nothing Then '状態取得 Dim state As String state = Target.Value '状態の値による処理分岐 Select Case state: Case "かけら出し" '現在時刻と更新日時を比較し更新できるか判定 Dim kousin As Date kousin = Cells(trow, 2).Value '更新日時 If nowtime >= kousin Then Target.Value = "更新可" Else Target.Value = "更新待ち" End If Case "更新可" '次回更新日時更新処理 Target.Value = "報酬交換" Dim kousintime As Date kousintime = DateAdd("d", 7, nowtime) kousintime = DateAdd("n", 1, kousintime) Cells(trow, 2).Value = kousintime Case "報酬交換" '性向更新処理 Target.Value = "かけら出し" '性向数字入力欄が空でなければ処理する If Not Cells(trow, 11).Value = "" Then '最初に性向-100か調べる Dim gauge As Variant gauge = Cells(trow, 10).Interior.Color 'ゲージ7マス目 If gauge = ccol Then '性向-100なら For i = 4 To 10 Cells(trow, i).Interior.Color = account 'ゲージリセット Next Cells(trow, 11).Value = 0 '性向0にセット Else '性向-100以外なら For i = 4 To 10 gauge = Cells(trow, i).Interior.Color '性向ゲージiマス目 If Not gauge = ccol Then '色が違うなら Cells(trow, i).Interior.Color = ccol '1マス塗りつぶし Cells(trow, 11).Value = (i - 3) * -16 '性向数値計算 If Cells(trow, 11).Value < -100 Then '-100以下になったら-100にする Cells(trow, 11).Value = -100 End If Exit For '更新処理終了 End If Next End If End If End Select Cancel = True End If End Sub
更新待ち評価処理(VBA)
Sub Reload() Dim daytime As Date daytime = Now Dim nowtime As String nowtime = Format(daytime, "yyyy/mm/dd HH:MM") Range("B1").Value = nowtime Dim i As Long i = 3 Do While Cells(i, 1) <> "" If Cells(i, 3) = "更新待ち" Then If daytime >= Cells(i, 2) Then Cells(i, 3) = "更新可" End If End If i = i + 1 Loop End Sub
メイン(GAS)
Syntax highlightingはGASがない?ためjavascript
function kakera_kousin() { //active get var spread = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spread.getActiveSheet(); var cell = sheet.getActiveCell(); //現在時刻取得 var nowtime = Moment.moment(); //active cellの情報取得 var row = cell.getRow(); var column = cell.getColumn(); var color = cell.getBackground(); //状態を更新するか、性向ゲージを再描写するか列rangeでスイッチ //3:状態、11:ゲージ再描写 switch(column){ //状態更新 case 3: //現在の状態を取得 var state = cell.getValue(); //状態に合わせて処理スイッチ switch(state){ case "かけら出し": //現在時刻と更新日時を比較して更新できるか判定する //更新日時獲得(js Date type) var kousin = sheet.getRange(row, 2).getValue(); //js Date type -> moment type kousin = Moment.moment(kousin); //更新可能か判定して状態を更新 if(kousin.isBefore(nowtime)){ cell.setValue("更新可"); }else{ cell.setValue("更新待ち"); } break; case "更新可": //次回更新日時を計算して更新 //状態更新 cell.setValue("報酬交換"); //次回更新日時計算用の現在時刻を取得 var kousintime = Moment.moment(); //今から7日と1分後を加算 kousintime.add(7, "d"); //7day kousintime.add(1, "m"); //1minute //更新日時列のrangeをとって値を置き換える sheet.getRange(row, 2).setValue(kousintime.format("YYYY/MM/DD HH:mm")); break; case "報酬交換": //性向ゲージの変動を計算して反映 //状態更新 cell.setValue("かけら出し"); //性向数値部分のrangeをあらかじめとっとく var range11 = sheet.getRange(row, 11); //性向数値が空白(天上通い)か判定 if(range11.isBlank()){ break; //天上通いなら処理終了 }else{ //性向-100か判定 if(range11.getValue() == "-100"){ //ゲージをリセット sheet.getRange("D" + row + ":J" + row).setBackground(color); //性向数値を0にセット range11.setValue(0); break; }else{ //性向-100以外なら //ゲージの背景色取得 var gauge = sheet.getRange("D" + row + ":J" + row).getBackgrounds(); for(var i = 4; i <= 10; i++){ //ゲージ背景色とアカウント背景色が同じになったら if(gauge[0][i-4] == color){ //1マス塗る sheet.getRange(row, i).setBackgroundRGB(192,80,77); //性向数値を計算する var si = (i - 3) * -16; //-100以下になったら-100に合わせる if( si < -100){ si = -100; } //性向数値更新 range11.setValue(si); break; } } } } } break; case 11: //性向ゲージ再描写 //現在の性向数値取得 var seikou = cell.getValue(); //塗りつぶすマス数を計算 var masu = Math.ceil(seikou / -16) -1; //columnを変換 var ca = ["D", "E", "F", "G", "H", "I", "J"]; //ゲージをリセット sheet.getRange("D" + row + ":J" + row).setBackground(color); //塗りつぶし処理 sheet.getRange("D" + row + ":" + ca[masu] + row).setBackgroundRGB(192,80,77); break; } }
更新待ち評価処理(GAS)
function onOpen(){ //active get var spread = SpreadsheetApp.getActiveSpreadsheet(); var sheet = spread.getActiveSheet(); //現在時刻取得 var time = Moment.moment(); //B1を更新 sheet.getRange("B1").setValue(time.format("YYYY/MM/DD HH:mm")); //全員の状態を取得 var range = sheet.getRange("C3:C39").getValues(); //更新待ちを探索 for(var i = 0; i < range.length; i++){ if(range[i][0] == "更新待ち"){ //rowを設定する var row = i + 3; //次回更新日時を取得 var kousin = sheet.getRange(row, 2).getValue(); kousin = Moment.moment(kousin); //更新できるか判定 if(kousin.isBefore(time)){ sheet.getRange(row, 3).setValue("更新可"); } } } }