public void UpdateSheetFromGameFile(string gameFileRootPath) { string gameFilePath = gameFileRootPath + Path.DirectorySeparatorChar + "Achievement.bytes"; //Getting all current entries Dictionary <string, AchievementEntry> achievementEntries = new Dictionary <string, AchievementEntry>(); Console.WriteLine("Getting Achievement Spreadsheet content"); GoogleSheetConnector gsc = GoogleSheetConnector.GetInstance(); string talkSpreadsheetId = gsc.SpreadsheetIDs["Achievement"]; SpreadsheetsResource.ValuesResource.GetRequest request = gsc.Service.Spreadsheets.Values.Get(talkSpreadsheetId, SheetRange); ValueRange response = request.Execute(); List <IList <object> > values = (List <IList <object> >)response.Values; int rowC = 1; if (values != null && values.Count > 0) { foreach (var row in values) { AchievementEntry ae = new AchievementEntry(row); ae.row = rowC; achievementEntries[ae.ID] = ae; rowC++; } } //UpdatingRequests var updateRequests = new List <Request>(); Console.WriteLine("Comparing with games version and calculating updates..."); //Parse every line in the game file System.IO.StreamReader reader = new System.IO.StreamReader(gameFilePath); string line; while ((line = reader.ReadLine()) != null) { //Splitting string[] data = line.Split('\t'); //Parsing data string ID = data[0]; string ShortOriginalText = data[1]; string LongOriginalText = data[2]; string D = data[3]; string StandardizedTerm_Short = StandardizedTermManager.GetInstance().GetTermLocatorText(ShortOriginalText); string StandardizedTerm_Long = StandardizedTermManager.GetInstance().GetTermLocatorText(LongOriginalText); if (achievementEntries.ContainsKey(ID)) { //Compare and update AchievementEntry existingEntry = achievementEntries[ID]; bool needsUpdate = false; if (!string.IsNullOrEmpty(ShortOriginalText) && existingEntry.ShortOriginalText != ShortOriginalText) { existingEntry.ShortOriginalText = ShortOriginalText; existingEntry.ShortTextChanged = true; needsUpdate = true; } if (!string.IsNullOrEmpty(LongOriginalText) && existingEntry.LongOriginalText != LongOriginalText) { existingEntry.LongOriginalText = LongOriginalText; existingEntry.LongTextChanged = true; needsUpdate = true; } if (!string.IsNullOrEmpty(StandardizedTerm_Short) && existingEntry.StandardizedTerm_Short != StandardizedTerm_Short) { existingEntry.StandardizedTerm_Short = StandardizedTerm_Short; needsUpdate = true; } if (!string.IsNullOrEmpty(StandardizedTerm_Long) && existingEntry.StandardizedTerm_Long != StandardizedTerm_Long) { existingEntry.StandardizedTerm_Long = StandardizedTerm_Long; needsUpdate = true; } if (existingEntry.D != D) { existingEntry.D = D; needsUpdate = true; } if (needsUpdate) { updateRequests.Add(existingEntry.ToGoogleSheetUpdateRequest()); } } else { //New one AchievementEntry newEntry = new AchievementEntry(); newEntry.ID = ID; newEntry.ShortOriginalText = ShortOriginalText; newEntry.ShortText = TranslationManager.GetInstance().Translate(StandardizedTerm_Short); newEntry.ShortTextChanged = true; newEntry.LongOriginalText = LongOriginalText; newEntry.LongText = TranslationManager.GetInstance().Translate(StandardizedTerm_Long); newEntry.D = D; newEntry.LongTextChanged = true; newEntry.MLTranslated = true; newEntry.StandardizedTerm_Short = StandardizedTerm_Short; newEntry.StandardizedTerm_Long = StandardizedTerm_Long; updateRequests.Add(newEntry.ToGoogleSheetUpdateRequest()); } } Console.WriteLine("Updating spreadsheet..."); BatchUpdateSpreadsheetRequest batchUpdate = new BatchUpdateSpreadsheetRequest(); batchUpdate.Requests = new List <Request>(); int reqHandled = 0; //updateRequests.RemoveRange(2, updateRequests.Count - 2); foreach (var req in updateRequests) { batchUpdate.Requests.Add(req); reqHandled++; if (batchUpdate.Requests.Count >= 500 || reqHandled >= updateRequests.Count) { var updateRequest = gsc.Service.Spreadsheets.BatchUpdate(batchUpdate, talkSpreadsheetId); updateRequest.Execute(); //Resetting batch update batchUpdate = new BatchUpdateSpreadsheetRequest(); batchUpdate.Requests = new List <Request>(); } } Console.WriteLine("Done!"); }