From 68b940edbace2bfadd2006053e875666c00bdaf3 Mon Sep 17 00:00:00 2001 From: Shimoine Date: Thu, 22 Aug 2024 05:54:57 +0000 Subject: [PATCH 1/3] Add new method to update row --- lib/sheetq/google_client.rb | 3 ++- lib/sheetq/service/sheet.rb | 7 +++++++ lib/sheetq/service/spreadsheet.rb | 11 +++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/sheetq/google_client.rb b/lib/sheetq/google_client.rb index 490bf41..2dc6d3e 100644 --- a/lib/sheetq/google_client.rb +++ b/lib/sheetq/google_client.rb @@ -16,7 +16,8 @@ class AuthorizationError < StandardError ; end def_delegators :@client, :get_spreadsheet_values, - :append_spreadsheet_value + :append_spreadsheet_value, + :update_spreadsheet_value 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..178cf53 100644 --- a/lib/sheetq/service/sheet.rb +++ b/lib/sheetq/service/sheet.rb @@ -15,6 +15,13 @@ 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 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..d6d0ea4 100644 --- a/lib/sheetq/service/spreadsheet.rb +++ b/lib/sheetq/service/spreadsheet.rb @@ -25,6 +25,17 @@ 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 sheet(sheet_name, resource_class = nil) Sheet.new(self, sheet_name, resource_class) end From 60c7fd74791d6583edb50d58fd402c009f3fb25e Mon Sep 17 00:00:00 2001 From: Shimoine Date: Mon, 2 Dec 2024 19:41:02 +0900 Subject: [PATCH 2/3] Add new method to delete row --- lib/sheetq/google_client.rb | 4 +++- lib/sheetq/service/sheet.rb | 4 ++++ lib/sheetq/service/spreadsheet.rb | 22 ++++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/lib/sheetq/google_client.rb b/lib/sheetq/google_client.rb index 2dc6d3e..f9d724a 100644 --- a/lib/sheetq/google_client.rb +++ b/lib/sheetq/google_client.rb @@ -15,9 +15,11 @@ class AuthorizationError < StandardError ; end extend Forwardable def_delegators :@client, + :get_spreadsheet, :get_spreadsheet_values, :append_spreadsheet_value, - :update_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 178cf53..0a09951 100644 --- a/lib/sheetq/service/sheet.rb +++ b/lib/sheetq/service/sheet.rb @@ -22,6 +22,10 @@ def update_row(resource, row_num) 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 d6d0ea4..db67192 100644 --- a/lib/sheetq/service/spreadsheet.rb +++ b/lib/sheetq/service/spreadsheet.rb @@ -36,6 +36,28 @@ def update_row(sheet_name, resource, row_num) ) 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 From 22ffde0bce44972dd3949bb8982bc666901dd9b0 Mon Sep 17 00:00:00 2001 From: Shimoine Date: Tue, 14 Jan 2025 11:12:21 +0900 Subject: [PATCH 3/3] Add new method to get row number --- lib/sheetq/service/sheet.rb | 8 ++++++++ lib/sheetq/service/spreadsheet.rb | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/lib/sheetq/service/sheet.rb b/lib/sheetq/service/sheet.rb index 0a09951..a0d4281 100644 --- a/lib/sheetq/service/sheet.rb +++ b/lib/sheetq/service/sheet.rb @@ -22,6 +22,14 @@ def update_row(resource, row_num) 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 diff --git a/lib/sheetq/service/spreadsheet.rb b/lib/sheetq/service/spreadsheet.rb index db67192..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