Сравнение двух списков строк на основе данных в выбранной ячейке с помощью Smartsheet API
Я хочу сравнить два списка данных строки. Прямо сейчас я хочу видеть, содержат ли два списка тот же самый заголовок в их соответствующих значениях ячейки.
Какие методы с использованием Smartsheet API C# можно использовать для сортировки списка и сравнения каждого элемента select в каждой строке?
У меня уже есть таблица имен столбцов для поиска имени столбца и ссылки на фактический идентификатор столбца. Но я не могу понять, как?
Любой вклад будет полезен, и я извиняюсь, если я звучу глупо, но я обычно не прошу помощи.
У меня есть два листа в Smartsheet. Один лист содержит все данные, которые предоставлены и, как он проходит процесс принятия или отклонения. Если он полностью принят, ему присваивается статус "Перемещено в проект". Когда код выполняется, он помещает все строки с таким статусом в список, который затем будет использоваться для перемещения и сравнения с другим списком.
Перемещенный в список проектов будет сравниваться с нашим активным списком управления проектами.
Я застрял при попытке сравнить значения ячеек через API и, возможно, я просто смотрю на это неправильно. Я попробовал Enum Except для сравнения списка, но он не работает, и я думаю, что мне нужно будет создать вложенный цикл для сортировки и сравнения каждого элемента.
foreach (Row row in rowsToCompare)
{
Cell PMOPName = getPMOCellByColumnName(row, "Project Name");
foreach (Row innerrow in rowsToMove)
{
Cell MainTitle = getCellByColumnName(innerrow, "Title");
if (PMOPName.DisplayValue == MainTitle.DisplayValue)
{
Console.WriteLine("Yes");
}
else
Console.WriteLine("No");
}
}
static Cell getCellByColumnName(Row row, string columnName)
{
return row.Cells.FirstOrDefault(cell => cell.ColumnId ==
columnMap[columnName]);
}
static Cell getPMOCellByColumnName(Row row, string columnName)
{
return row.Cells.FirstOrDefault(cell => cell.ColumnId ==
columnMapPMO[columnName]);
}
}
Всякий раз, когда есть совпадение заголовка и имени проекта, оно должно выводить yes, а если нет - no.
Но вместо этого я получаю необработанное исключение: System.ArgumentNullException: значение не может быть нулевым.
Я указал это на вложенную петлю. Я уверен, что просто сделал что-то глупое.
РЕДАКТИРОВАТЬ: Итак, это определение карты и как она получает данные.
static Dictionary<string, long> columnMap = new Dictionary<string, long>();
static Dictionary<string, long> columnMapPMO = new Dictionary<string,
long();
// Build column map for later reference
foreach (Column column in sheet.Columns)
columnMap.Add(column.Title, (long)column.Id);
foreach (Column column in pmosheet.Columns)
columnMapPMO.Add(column.Title, (long)column.Id);
РЕДАКТИРОВАТЬ 2: Подтверждение с Тимом код работает, но в моем случае он все еще выдает ошибку, поэтому я помещу код, который у меня есть в настоящее время в целом, чтобы увидеть, если возможно, другие функции могут вызывать проблемы.
static void Main(string[] args)
{
SmartsheetClient ss = new SmartsheetBuilder()
// TODO: Set your API access in environment variable
SMARTSHEET_ACCESS_TOKEN or else here
.SetAccessToken(token.AccessToken)
.Build();
var sheet = ss.SheetResources.GetSheet(
sheetId, // long sheetId
null, // IEnumerable<SheetLevelInclusion>
includes
null, // IEnumerable<SheetLevelExclusion>
excludes
null, // IEnumerable<long> rowIds
null, // IEnumerable<int> rowNumbers
null, // IEnumerable<long> columnIds
null, // Nullable<long> pageSize
null // Nullable<long> page
);
var pmosheet = ss.SheetResources.GetSheet(
copyId,
null,
null,
null,
null,
null,
null,
null
);
// Build column map for later reference
foreach (Column column in sheet.Columns)
columnMap.Add(column.Title, (long)column.Id);
foreach (Column column in pmosheet.Columns)
columnMapPMO.Add(column.Title, (long)column.Id);
// Accumulate rows needing update and archive here
List<Row> rowsToMove = new List<Row>();
List<Row> rowsToArchive = new List<Row>();
List<Row> rowsToCompare = new List<Row>();
//Loops through the Ideation Sheet and execute function to evaluate
//each row and add those row to the move list.
foreach (Row row in sheet.Rows)
{
Row rowToMove = evaluateRowAndBuildUpdates(row);
if (rowToMove != null)
{
rowsToMove.Add(rowToMove);
}
}
Console.WriteLine("\n");
foreach (Row row in pmosheet.Rows)
{
Row rowtoCompare = compareRowandCopy(row);
if (rowtoCompare != null)
rowsToCompare.Add(rowtoCompare);
}
Console.WriteLine("\n");
foreach (Row innerrow in rowsToMove)
{
Cell MainTitle = getCellByColumnName(innerrow, "Title");
foreach (Row row in rowsToCompare)
{
Cell PMOPName = getPMOCellByColumnName(row, "Project Name");
if (PMOPName.DisplayValue == MainTitle.DisplayValue)
{
Console.WriteLine("Yes");
break;
}
else
Console.WriteLine("No");
}
}
System.Environment.Exit(1); //End of Program
}
static Row evaluateRowAndBuildUpdates(Row sourceRow)
{
Row rowToUpdate = null;
// Find cell we want to examine
Cell statusCell = getCellByColumnName(sourceRow, "Status");
if (statusCell.DisplayValue == "Moved to Project")
{
Cell remainingCell = getCellByColumnName(sourceRow, "Status");
Cell titleCell = getCellByColumnName(sourceRow, "Title");
if (remainingCell.DisplayValue == "Moved to Project")
{
rowToUpdate = new Row
{
Id = sourceRow.Id,
};
Console.WriteLine("Ideation");
}
Console.WriteLine(titleCell.DisplayValue + " ID: " +
sourceRow.Id.ToString());
}
return rowToUpdate;
}
static Row compareRowandCopy(Row sourceRow)
{
Row rowToCopy = null;
Cell pmoStatusCell = getPMOCellByColumnName(sourceRow, "Project
Name");
if (pmoStatusCell.DisplayValue != null)
{
rowToCopy = new Row
{
Id = sourceRow.Id,
};
}
Console.WriteLine("PMO");
Console.WriteLine(pmoStatusCell.DisplayValue + " ID: " +
sourceRow.Id.ToString());
return rowToCopy;
}
static Cell getCellByColumnName(Row row, string columnName)
{
return row.Cells.FirstOrDefault(cell => cell.ColumnId ==
columnMap[columnName]);
}
static Cell getPMOCellByColumnName(Row row, string columnName)
{
return row.Cells.FirstOrDefault(cell => cell.ColumnId ==
columnMapPMO[columnName]);
}
1 ответ
Хорошо, у меня есть два листа, лист проекта выглядит так: И лист задания, содержащий строки для вставки, выглядит следующим образом: Вот код:
using System;
using System.Collections.Generic;
// Add nuget reference to smartsheet-csharp-sdk (https://www.nuget.org/packages/smartsheet-csharp-sdk/)
using Smartsheet.Api;
using Smartsheet.Api.Models;
using System.Linq;
namespace sdk_csharp_sample
{
class Program
{
static Dictionary<string, long> columnMap = new Dictionary<string, long>();
static Dictionary<string, long> columnMapPMO = new Dictionary<string, long>();
static void Main(string[] args)
{
// Initialize client
SmartsheetClient ss = new SmartsheetBuilder()
.SetHttpClient(new RetryHttpClient())
.Build();
heet insert = ss.SheetResources.GetSheet(...148L, null, null, null, null, null, null, null);
Sheet pmosheet = ss.SheetResources.GetSheet(...556L, null, null, null, null, null, null, null);
// Build column map for later reference
foreach (Column column in insert.Columns)
columnMap.Add(column.Title, (long)column.Id);
foreach (Column column in pmosheet.Columns)
columnMapPMO.Add(column.Title, (long)column.Id);
IList<Row> rowsToCompare = pmosheet.Rows;
IList<Row> rowsToMove = insert.Rows;
foreach (Row innerrow in rowsToMove)
{
Cell MainTitle = getCellByColumnName(innerrow, "Title");
foreach (Row row in rowsToCompare)
{
Cell PMOPName = getPMOCellByColumnName(row, "Project Name");
if (PMOPName.DisplayValue == MainTitle.DisplayValue)
{
Console.WriteLine("Yes");
break;
}
else
Console.WriteLine("No");
}
}
}
static Cell getCellByColumnName(Row row, string columnName)
{
return row.Cells.FirstOrDefault(cell => cell.ColumnId ==
columnMap[columnName]);
}
static Cell getPMOCellByColumnName(Row row, string columnName)
{
return row.Cells.FirstOrDefault(cell => cell.ColumnId ==
columnMapPMO[columnName]);
}
}
}
Я просто изменил порядок циклов так, чтобы добавляемые строки формировали внешний цикл (при условии, что есть проекты, которые могут не иметь соответствующих позиций для вставки, которые не нужно просматривать), и когда я найти подходящего для проектов выхода из внутреннего цикла.
Вывод выглядит так:
Я прошел весь тест, так что, похоже, ваш код делает свое дело. Может быть, упростить ваши примеры ввода, чтобы вы могли убедиться, что вы получаете то, что вы хотите. Это также может сказать нам, если это проблема, связанная с данными.