using Newtonsoft.Json.Linq; using System.Collections.Generic; public static class GoogleSheetDiffHelper { public static List<(string Sheet, string Field, int RowIndex, string OldValue, string NewValue)> CompareJsonDiff(string oldJson, string newJson) { var diffs = new List<(string, string, int, string, string)>(); if (string.IsNullOrEmpty(oldJson) || string.IsNullOrEmpty(newJson)) return diffs; var oldObj = JObject.Parse(oldJson); var newObj = JObject.Parse(newJson); foreach (var sheet in newObj) { var sheetName = sheet.Key; if (!oldObj.TryGetValue(sheetName, out var oldSheetToken)) continue; var oldArray = oldSheetToken as JArray; var newArray = sheet.Value as JArray; // Row-by-row 비교 (1번 줄부터 데이터 시작) for (int i = 1; i < newArray.Count; i++) { if (i >= oldArray.Count) break; var newRow = (JObject)newArray[i]; var oldRow = (JObject)oldArray[i]; foreach (var prop in newRow.Properties()) { var field = prop.Name; string newValue = prop.Value.ToString(); string oldValue = oldRow.TryGetValue(field, out var oldVal) ? oldVal.ToString() : ""; if (oldValue != newValue) { diffs.Add((sheetName, field, i, oldValue, newValue)); } } } } return diffs; } public static string GenerateDiff(string oldJson, string newJson) { var diffs = CompareJsonDiff(oldJson, newJson); if (diffs.Count == 0) return "No differences found."; var sb = new System.Text.StringBuilder(); sb.AppendLine("[GoogleSheetManager] 변경된 필드들:"); foreach (var (sheet, field, rowIndex, oldVal, newVal) in diffs) { sb.AppendLine($"{sheet} / Row {rowIndex} / {field} : '{oldVal}' → '{newVal}'"); } return sb.ToString(); } }