Smartsheet C# SDK Родитель-ребенок

В Smartsheet C# SDK полезен row.ParentRowId, но я не вижу средства для определения уровня иерархии данной строки? Например, если у меня есть что-то вроде...

  • название проекта
    • Секция 1
      • Задание 1
      • Задача 2
    • Раздел 2
      • Задача 3
      • Задача 4

В проекте Microsoft есть поле "Outline level", которое будет иметь "1" для имени проекта, "2" для раздела 1 и раздела 2 и "3" для каждой из задач в моем примере.

Я не вижу, как определить (или изменить) "уровень структуры" строки, используя SDK Smartsheet.

Спасибо,

2 ответа

В API Smartsheet тот факт, что строка является дочерней строкой другой строки, определяется наличием атрибута parentId в объекте Row. Если присутствует, это свойство объекта Row указывает значение идентификатора родительской строки.

Что касается C# SDK, этот атрибут предоставляется как свойство ParentId объекта Row (обратите внимание на заглавную букву " ParentId "). Использование C# SDK:

  • Если свойство ParentId равно NULL для объекта Row в ответе, это означает, что Row является строкой верхнего уровня (т. Е. Не является дочерним элементом какой-либо другой строки).
  • Если свойство ParentId объекта Row НЕ равно NULL, это означает, что Row является дочерним элементом строки, Id которой соответствует значению ParentId.

В следующем фрагменте кода используется SDK C# для идентификации иерархии строк путем изучения значения ParentId для каждой строки в листе.

// Set the Access Token.
Token token = new Token();
token.AccessToken = YOUR_ACCESS_TOKEN;

// Use the Smartsheet Builder to create a Smartsheet.
SmartsheetClient smartsheet = new SmartsheetBuilder().SetAccessToken(token.AccessToken).Build();

// Get Sheet.
long sheetId = YOUR_SHEET_ID;
Sheet sheet = smartsheet.SheetResources.GetSheet(sheetId, null, null, null, null, null, null, null);

// Identify Row hierarchy by examining the ParentId property of each row.
foreach (Row row in sheet.Rows)
{
    if (row.ParentId != null)
    {
        Response.Write("Row #" + row.RowNumber.ToString() + " (Id=" + row.Id.ToString() + ") is a child of Row Id " + row.ParentId.ToString() + "<br/><br/>");
    }
    else
    {
        Response.Write("Row #" + row.RowNumber.ToString() + " (Id=" + row.Id.ToString() + ") is a top-level row.<br/><br/>");
    }
}

API Smartsheet в настоящее время не предоставляет свойство, аналогичное "уровню структуры", но вы должны иметь возможность получить "уровень структуры" каждой строки, используя свойство ParentId, как описано выше.

Вы изменяете "уровень структуры" (т. Е. Отступ) строки, используя API Smartsheet, используя атрибуты строки спецификатора местоположения, описанные здесь в документации API: http://smartsheet-platform.github.io/api-docs/.

Используя C# SDK, вы бы указали некоторую комбинацию атрибутов строки спецификатора местоположения при вызове Row.AddRowBuilder(…) функция, чтобы описать, где строка должна быть размещена на листе, относительно других уже существующих строк. В документации, на которую я ссылался выше, описаны результаты размещения, которые вы получите, установив различные комбинации атрибутов указателя местоположения для строки.

Например, следующий скрипт добавляет новую строку в качестве первой дочерней строки под указанной родительской строкой:

// Set the Access Token.
Token token = new Token();
token.AccessToken = YOUR_ACCESS_TOKEN;

// Use the Smartsheet Builder to create a Smartsheet.
SmartsheetClient smartsheet = new SmartsheetBuilder().SetAccessToken(token.AccessToken).Build();

// Get Sheet.
long sheetId = YOUR_SHEET_ID;
Sheet sheet = smartsheet.SheetResources.GetSheet(sheetId, null, null, null, null, null, null, null);

// Identify Row hierarchy by examining the ParentId property of each row.
foreach (Row row in sheet.Rows)
{
    if (row.ParentId != null)
    {
        Response.Write("Row #" + row.RowNumber.ToString() + " (Id=" + row.Id.ToString() + ") is a child of Row Id " + row.ParentId.ToString() + "<br/><br/>");
    }
    else
    {
        Response.Write("Row #" + row.RowNumber.ToString() + " (Id=" + row.Id.ToString() + ") is a top-level row.<br/><br/>");
    }
}

/************************************************
 * Add new row.
/************************************************/

// Specify cell values for the row.
Cell[] cells = new Cell[] { new Cell.AddCellBuilder(2069395137685380, "New Task").Build(), new Cell.AddCellBuilder(4743407416436612, "Added via API").SetStrict(false).Build() };

// Specify the Id of the parent row.
long parentId = 1085142354683780;

// Specify contents and placement of new row.
// Use the 5 parameters of the "AddRowBuilder" function to specify row's placement: toTop, toBottom, parentId, siblingId, above
// Specifying parentId only will add the new row as the first child row under the specified parent row.
Row newRow = new Row.AddRowBuilder(null, null, parentId, null, null).SetCells(cells).Build();

// Add row to sheet.
smartsheet.SheetResources.RowResources.AddRows(sheetId, new Row[] { newRow });

Вот что я сделал, чтобы отслеживать наши отступы. Каждый отступ - это уровень. Таким образом, на моем изображении строка 2 будет иметь уровень 2, а строка 7 будет иметь уровень 3. Строка 8 будет иметь уровень 2, а ее родительский номер строки будет равен 7 (строка 7).

foreach (var detailRow in detailSheet.Rows)
{
     long rowId = (detailRow.Id.HasValue) ? detailRow.Id.Value : 0;
     long parentId = (detailRow.ParentId.HasValue) ? detailRow.ParentId.Value : 0;

     int parentRowNumber = 0;
     int level = 0;

     if (parentId != 0)
     {
         foreach (RowLevel lvl in rowLevelList)
         {
             if (lvl.RowId != parentId) continue;

             parentRowNumber = lvl.Row;
             level = lvl.Level + 1;
             break;
         }
     }

     RowLevel rowLevel = new RowLevel();
     rowLevel.RowId = rowId;
     rowLevel.ParentId = parentId;
     rowLevel.Row = detailRow.RowNumber.Value;
     rowLevel.ParentRowNumber = parentRowNumber;
     rowLevel.Level = level;
     rowLevelList.Add(rowLevel);

     System.Diagnostics.Debug.WriteLine("Row: " + detailRow.RowNumber);
     System.Diagnostics.Debug.WriteLine("Row Id: " + rowId);
     System.Diagnostics.Debug.WriteLine("Parent Id: " + parentId);
     System.Diagnostics.Debug.WriteLine("Parent Row Number: " + parentRowNumber);
     System.Diagnostics.Debug.WriteLine("Level: " + level);
     System.Diagnostics.Debug.WriteLine("");
}

Небольшой класс для отслеживания уровней и номеров родительских строк

private class RowLevel
{
   public int Row = 0;
   public int Level = 0;
   public int ParentRowNumber = 0;
   public long ParentId = 0;
   public long RowId = 0;
}

Надеюсь это поможет!

Другие вопросы по тегам