diff --git a/lib/sheetq/google_client.rb b/lib/sheetq/google_client.rb index 490bf41..f9d724a 100644 --- a/lib/sheetq/google_client.rb +++ b/lib/sheetq/google_client.rb @@ -15,8 +15,11 @@ class AuthorizationError < StandardError ; end extend Forwardable def_delegators :@client, + :get_spreadsheet, :get_spreadsheet_values, - :append_spreadsheet_value + :append_spreadsheet_value, + :update_spreadsheet_value, + :batch_update_spreadsheet def initialize(client_id, client_secret, token_store_path, user, logger = nil) @client_id = client_id diff --git a/lib/sheetq/service/sheet.rb b/lib/sheetq/service/sheet.rb index 8150d42..a0d4281 100644 --- a/lib/sheetq/service/sheet.rb +++ b/lib/sheetq/service/sheet.rb @@ -15,6 +15,25 @@ def append_row(resource) spreadsheet.append_row(sheet_name, resource) end + def update_row(resource, row_num) + unless resource.is_a?(@resource_class) + fail "Invalid resource #{resource.class} to update sheet #{sheet_name}" + end + spreadsheet.update_row(sheet_name, resource, row_num) + end + + def update_row_including_keyword(keyword, resource) + unless resource.is_a?(@resource_class) + fail "Invalid resource #{resource.class} to update sheet #{sheet_name}" + end + row_num = spreadsheet.get_row_num(sheet_name, keyword) + spreadsheet.update_row(sheet_name, resource, row_num) + end + + def delete_row(row_num) + spreadsheet.delete_row(sheet_name, row_num) + end + def fetch(range = nil) range = if range sheet_name + "!" + range diff --git a/lib/sheetq/service/spreadsheet.rb b/lib/sheetq/service/spreadsheet.rb index 4d15ee4..8873381 100644 --- a/lib/sheetq/service/spreadsheet.rb +++ b/lib/sheetq/service/spreadsheet.rb @@ -11,6 +11,18 @@ def get_spreadsheet_values(range) client.get_spreadsheet_values(spreadsheet_id, range) end + def get_row_num(sheet_name, word) + row_num = nil + values = client.get_spreadsheet_values(spreadsheet_id, sheet_name).values + values.each_with_index do |row, index| + if row.any? { |cell| cell == word} + row_num = index + 1 + return row_num + break + end + end + end + def append_row(sheet_name, resource) # https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append # https://www.rubydoc.info/github/google/google-api-ruby-client/Google/Apis/SheetsV4/SheetsService#append_spreadsheet_value-instance_method @@ -25,6 +37,39 @@ def append_row(sheet_name, resource) ) end + def update_row(sheet_name, resource, row_num) + value_range_object = Google::Apis::SheetsV4::ValueRange.new(values: [resource.to_a]) + target = 'A' + row_num.to_s + response = client.update_spreadsheet_value( + spreadsheet_id, + "#{sheet_name}!#{target}", + value_range_object, + value_input_option: "RAW" + ) + end + + def delete_row(sheet_name, row_num) + sheet_meta = client.get_spreadsheet(spreadsheet_id) + sheet = sheet_meta.sheets.find { |s| s.properties.title == sheet_name } + sheet_id = sheet.properties.sheet_id + + delete_request = Google::Apis::SheetsV4::Request.new( + delete_dimension: Google::Apis::SheetsV4::DeleteDimensionRequest.new( + range: Google::Apis::SheetsV4::DimensionRange.new( + sheet_id: sheet_id, + dimension: "ROWS", + start_index: row_num - 1, # 0ベースに変換 + end_index: row_num # 削除する行の次の行 + ) + ) + ) + + batch_update_request = Google::Apis::SheetsV4::BatchUpdateSpreadsheetRequest.new( + requests: [delete_request] + ) + client.batch_update_spreadsheet(spreadsheet_id, batch_update_request) + end + def sheet(sheet_name, resource_class = nil) Sheet.new(self, sheet_name, resource_class) end