lib/Processors/GoogleSheetProcessor.rb in ZReviewTender-1.3.5 vs lib/Processors/GoogleSheetProcessor.rb in ZReviewTender-1.3.6

- old
+ new

@@ -6,11 +6,11 @@ require "pathname" require "GoogleAPI" class GoogleSheetProcessor < Processor - attr_accessor :keywordsInclude, :ratingsInclude, :territoriesInclude, :logger, :googleAPI, :sheetID, :sheetName, :formatValues, :timeZoneOffset + attr_accessor :keywordsInclude, :ratingsInclude, :territoriesInclude, :logger, :googleAPI, :spreadsheetID, :sheetInsertType, :sheetId, :sheetName, :sheetInsertAt, :formatValues, :timeZoneOffset def initialize(config, configFilePath, baseExecutePath) @config = config @configFilePath = configFilePath @baseExecutePath = baseExecutePath @@ -39,12 +39,35 @@ if !config["territoriesInclude"].nil? @territoriesInclude = config["territoriesInclude"] end @timeZoneOffset = Helper.unwrapRequiredParameter(config, "googleSheetTimeZoneOffset") - @sheetID = Helper.unwrapRequiredParameter(config, "googleSheetID") - @sheetName = Helper.unwrapRequiredParameter(config, "googleSheetName") + @spreadsheetID = Helper.unwrapRequiredParameter(config, "googleSpreadsheetID") + + sheetInsertStyle = Helper.unwrapRequiredParameter(config, "googleSheetInsertStyle") + if !sheetInsertStyle.is_a? Array + raise "googleSheetInsertStyle must specify as Array in GoogleSheetProcessor." + end + + sheetInsertStyles = {} + sheetInsertStyle.each do |value| + value.keys.each do |key| + sheetInsertStyles[key] = value[key] + end + end + + @sheetInsertType = Helper.unwrapRequiredParameter(sheetInsertStyles, "type") + + if sheetInsertType != "insert" && sheetInsertType != "append" + raise "googleSheetInsertStyle.type only accept insert or append in GoogleSheetProcessor." + elsif sheetInsertType == "insert" + @sheetInsertAt = Helper.unwrapRequiredParameter(sheetInsertStyles, "at").to_i + @sheetId = Helper.unwrapRequiredParameter(sheetInsertStyles, "sheetID") + elsif sheetInsertType == "append" + @sheetName = Helper.unwrapRequiredParameter(sheetInsertStyles, "sheetName") + end + @formatValues = [] if !config["values"].nil? @formatValues = config["values"] end @@ -72,11 +95,16 @@ filterReviews = filterReviews.select{ |review| review.body.include? keywordInclude } end end values = [] - filterReviews.each do |review| + sortedFilterReviews = filterReviews + if sheetInsertType == "insert" + sortedFilterReviews = sortedFilterReviews.sort! { |a, b| b.createdDateTimestamp <=> a.createdDateTimestamp } + end + + sortedFilterReviews.each do |review| cols = [] formatValues.each do |formatValue| formatValue = formatValue.gsub("%TITLE%", review.title || "") formatValue = formatValue.gsub("%BODY%", review.body || "") formatValue = formatValue.gsub("%RATING%", review.rating.nil? ? "" :review.rating.to_s) @@ -92,15 +120,55 @@ end values.append(cols) end page = 1 - limit = 500 + limit = 100 values.each_slice(limit) do |value| - puts "[GoogleSheetProcessor] Insert rows(#{page}/#{(values.length/limit).ceil + 1}) to #{sheetID}-#{sheetName}" + puts "[GoogleSheetProcessor] Insert rows page:(#{page}/#{(values.length/limit).ceil + 1}) #{sheetInsertType} to #{spreadsheetID}" page += 1 - googleAPI.request("https://sheets.googleapis.com/v4/spreadsheets/#{sheetID}/values/#{sheetName}!A1:append?valueInputOption=RAW", "POST", {:values => value}) + if sheetInsertType == "insert" + googleAPI.request("https://sheets.googleapis.com/v4/spreadsheets/#{spreadsheetID}:batchUpdate", "POST", { + "requests": [ + { + "insertRange": { + "range": { + "sheetId": sheetId, + "startRowIndex": sheetInsertAt, + "endRowIndex": sheetInsertAt + value.length + }, + "shiftDimension": "ROWS" + } + }, + { + "pasteData": { + "data": rowsToString(value), + "type": "PASTE_NORMAL", + "delimiter": ",", + "coordinate": { + "sheetId": sheetId, + "rowIndex": sheetInsertAt, + } + } + } + ] + }) + elsif sheetInsertType == "append" + googleAPI.request("https://sheets.googleapis.com/v4/spreadsheets/#{spreadsheetID}/values/#{sheetName}!A1:append?valueInputOption=RAW", "POST", {:values => value}) + end end return reviews + end + + private + def rowsToString(rows) + string = "" + rows.each do |row| + if string != "" + string += "\n" + end + string += "\"#{row.map{ |v| v.gsub('"','\"') }.join('","')}\"" + end + return string end end \ No newline at end of file