-1

I have a smartsheet with a bunch of link attachments. I'd like to replace the beginning of the links with a different substring. I am new to smartsheet and have not been able to find much sample code.

Sheet setup,

SmartsheetClient smartsheet = new SmartsheetBuilder().SetAccessToken(accessToken).Build();

PaginatedResult<Sheet> sheets = smartsheet.SheetResources.ListSheets(
    null,               // IEnumerable<SheetInclusion> includes
    null,               // PaginationParameters
    null                // Nullable<DateTime> modifiedSince = null
);

long sheetId = (long)sheets.Data[1].Id; //get first sheet's ID

//get sheet associated with sheetId
Sheet sheet = smartsheet.SheetResources.GetSheet(sheetId, null, null, null, null, null, null, null);

Here I'm trying to create of list of rows containing links that have to be changed,

List<Row> rowsToUpdate = new List<Row>();

foreach (var row in sheet.Rows)
{
    Row rowToUpdate = null;
    var cellsToUpdate = new List<Cell>();
    var at = row.Attachments;

    string toReplace = "http://blahblah/blah";
    string newValue = "https://hello/";

    foreach(var attachment in row.Attachments)
    {
        var url = attachment.Url;
        var id = attachment.Id;
        if (url!=null && url.Contains(toReplace)){
            var newUrl = url.Replace(toReplace, newValue);
        }
    }

    //create new cell that will contain updated links
    var cellToUpdate = new Cell {
    ColumnId = , //is it possible to get Attachments column Id? 
    Value = //add updated links here?
    };

    cellsToUpdate.Add(cellToUpdate);

    //this will be added to the list rowsToUpdate
    rowToUpdate = new Row {
    Id = row.Id,
    Cells = cellsToUpdate
    };
}


smartsheet.SheetResources.RowResources.UpdateRows(sheet.Id.Value, rowsToUpdate);           

I have tried getting the Attachments column Id but this method did not work because I think it's a primary column(?)

var columns = smartsheet.SheetResources.ColumnResources.ListColumns(sheetId, null, null).Data;
var attachmentCol = columns[0].Title;

Thank you for your help.

bibi
  • 1

1 Answers1

2

Attachments on a row are not designated as a column, rather they are a separate row attribute. When you call GetSheet you will want to include attachments in the response:

Sheet sheet = smartsheet.SheetResources.GetSheet(sheetId, new List<SheetLevelInclusion> { SheetLevelInclusion.ATTACHMENTS }, 
                null, null, null, null, null, null);

To update a URL you may have to delete the attachment:

smartsheet.SheetResources.AttachmentResources.DeleteAttachment(
  9283173393803140,           // long sheetId
  7169782752536452            // long attachmentId
);

and then re-add your modified attachment:

Attachment attachmentSpecification = new Attachment
{
  Url = "http://www.google.com",
  AttachmentType = AttachmentType.LINK,
  Name = "Search Engine"
};

// Attach URL to row
Attachment updatedAttachment = smartsheet.SheetResources.RowResources.AttachmentResources.AttachUrl(
  9283173393803140,           // long sheetId
  0123456789012345,           // long rowId
  attachmentSpecification
);
timwells
  • 341
  • 1
  • 4