如何通过Smartsheet API高效获取所有工作表行的附件?
Smartsheet API 附件获取优化问题
核心疑问
是否无需逐行操作、无需先调用2次API获取attachment id再调用1次获取附件,就能直接获取附件列表?
我正在编写脚本通过Smartsheet API获取全部/指定工作表中的目标附件。当前实现效率极低,因为需要遍历数千行检查是否存在附件。以下两行代码返回的对象或对象列表虽包含Attachments属性,但该属性始终为空:
// 获取所有工作表资源 PaginatedResult<Sheet> sheets = smartsheet.SheetResources.ListSheets(null, null, null); var includeAttachments = new List<SheetLevelInclusion> { SheetLevelInclusion.ATTACHMENTS }; var sheet = smartsheet.SheetResources.GetSheet(sheetId, includeAttachments, null, null, null, null, null, null);
每个方法都提供了IEnumerable<SheetLevelInclusion>参数,但我不确定能否利用该参数实现需求。
以下是完整的参考代码,其中包含尚未实现的FilterSheets方法。我也接受Python语言的解决方案:
private List<SMTPAttachment> GetAttachments(SmartsheetClient smartsheet) { var includeAttachments = new List<SheetLevelInclusion> { SheetLevelInclusion.ATTACHMENTS }; // 获取所有工作表资源 PaginatedResult<Sheet> sheets = smartsheet.SheetResources.ListSheets(null, null, null); // 过滤掉不含目标附件的工作表 var filteredSheets = FilterSheets(sheets); // 初始化存储数据的对象 var attachments = new List<SMTPAttachment>(); // 遍历每个筛选后的工作表 foreach (var tempSheet in filteredSheets) { var sheetId = (long)tempSheet.Id; var sheet = smartsheet.SheetResources.GetSheet(sheetId, includeAttachments, null, null, null, null, null, null); // 遍历工作表的每一行 foreach (Row row in sheet.Rows) { long rowId = (long)row.Id; var paging = new PaginationParameters(true, 1, 1); var smtpAttachment = new SMTPAttachment(); PaginatedResult<Attachment> updatedAttachment = smartsheet.SheetResources.RowResources.AttachmentResources.ListAttachments( sheetId, rowId, paging ); if (updatedAttachment.Data.Count != 0) { var attachmentInfo = updatedAttachment.Data.FirstOrDefault(); if (attachmentInfo != null) { // 最终获取附件 var attachment = smartsheet.SheetResources.AttachmentResources.GetAttachment(sheetId, (long)attachmentInfo.Id); smtpAttachment.Attachment = attachment; smtpAttachment.Name = attachment.Name; smtpAttachment.Url = attachment.Url; smtpAttachment.MimeType = attachment.MimeType; attachments.Add(smtpAttachment); Console.WriteLine("Attaching file : " + attachment.Name); } } else { Console.WriteLine("No Data for row: " + rowId); } } } return attachments; } private List<Sheet> FilterSheets(PaginatedResult<Sheet> sheets) { /// TODO: 实现过滤逻辑 var filteredSheets = sheets.Data.ToList().Where(sheet => sheet.Id == sheet.Id).ToList(); return filteredSheets; }
内容的提问来源于stack exchange,提问作者Samuel Zrna
相关产品推荐
相关产品推荐

