Smartsheet-API:在工作表中填充数据和公式

时间:2014-04-08 00:17:58

标签: smartsheet-api smartsheet-api-1.1

CONTEXT

开发人员希望使用智能表API填充现有的智能表工作表。要填充的数据包括数据和公式。

但是,根据API文档(http://www.smartsheet.com/developers/api-documentation),无法使用API​​添加公式。

  

包含公式的单元格,指向其他单元格的链接,系统值或   无法通过API插入或更新甘特图值。

问题

测试验证了这一点。尝试使用智能表API添加简单公式会导致公式转换为不透明文本。检查显示公式是使用单引号字符修改的,它将其呈现为不透明文本而不是公式。

问题

是否有任何方法(通过手动输入除外)强制智能表重新评估插入的不透明文本,以便将不透明文本转换回公式?

如果不可能(除了通过手动输入)是否可以复制具有公式的现有工作表,然后使用智能表API将非公式数据填充到工作表中?

目标

基本目标是找到一种方法将公式数据填充到智能表应用程序中,而无需手动输入公式数据。

1 个答案:

答案 0 :(得分:2)

更新:Smartsheet现在支持通过API添加或更新公式,该公式可以在adding a rowupdating a row的文档中找到。

主要区别在于设置行对象中的formula而不是设置value


原始答案

您说得对,API目前不支持公式。虽然,我们计划在将来添加此功能。

目前,如果您尝试将公式发送到API,它将作为字符串处理,并且单引号将添加到公式的开头。然后,将字符串转换回公式的唯一方法是在Smartsheet UI内部手动删除单引号。

可用选项

如果您始终使用相同的公式,那么您使用模板的建议肯定会有效。该过程如下所示:

  1. 使用您要使用的公式设置模板。
  2. 从模板创建新工作表。
  3. 将额外数据添加到公式将使用的新工作表中。
  4.   

    注意:从未使用过的行无法更新,因为它们不存在。因此,在模板中,您可以通过在要更新的位置放置一个单词来初始化行。例如,您可以在要更新的所有位置添加“PLACEHOLDER”一词。

    我在下面添加了两个示例,一个使用curl,另一个使用我们的Java SDK

    卷曲示例

    从模板创建新工作表。请务必在以下命令中替换YOUR_TOKENYOUR_TEMPLATE_OR_SHEET_ID

    curl https://api.smartsheet.com/1.1/sheets?include=data,attachments,discussions -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" -X POST -d '{"name":"newSheetFromTemplate","fromId":"YOUR_TEMPLATE_OR_SHEET_ID"}'
    

    然后从响应中获取工作表ID并发出命令以获取行ID。

    curl https://api.smartsheet.com/1.1/sheet/YOUR_SHEET_ID -H "Authorization: Bearer YOUR_TOKEN"
    

    最后,从响应中获取行id和列id,并发出命令以更新相应的单元格。我正在使用以下命令更新值为1和2的两个单元格。

    curl https://api.smartsheet.com/1.1/row/YOUR_ROW_ID/cells -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" -X PUT -d '[ {"columnId": YOUR_COLUMN_ID, "value": 1}]'
    curl https://api.smartsheet.com/1.1/row/YOUR_ROW_ID/cells -H "Authorization: Bearer YOUR_TOKEN" -H "Content-Type: application/json" -X PUT -d '[ {"columnId": YOUR_COLUMN_ID, "value": 2}]'
    

    SDK示例

    此示例需要安装我们的Java SDK。还有一个C# SDK以非常类似的方式工作。

    import java.util.EnumSet;
    import java.util.List;
    
    import com.smartsheet.api.Smartsheet;
    import com.smartsheet.api.SmartsheetBuilder;
    import com.smartsheet.api.models.Cell;
    import com.smartsheet.api.models.Column;
    import com.smartsheet.api.models.ObjectInclusion;
    import com.smartsheet.api.models.Row;
    import com.smartsheet.api.models.Sheet;
    import com.smartsheet.api.SmartsheetException;
    
    public class Test {
    
        public static void main(String[] args) throws SmartsheetException {
            // Setup a Smartsheet object
            Smartsheet smartsheet = new SmartsheetBuilder().setAccessToken("YOUR_TOKEN").build();
    
            // Create a copy of a sheet from the template
            Sheet newSheet = new Sheet.CreateFromTemplateOrSheetBuilder().setFromId(YOUR_TEMPLATE_OR_SHEET_ID).setName("newSheetName").build();
            newSheet = smartsheet.sheets().createSheetFromExisting(newSheet, EnumSet.allOf(ObjectInclusion.class));
    
            // Get the columns/rows/data for the sheet we just created
            newSheet = smartsheet.sheets().getSheet(newSheet.getId(), EnumSet.allOf(ObjectInclusion.class));
    
            // Grab the column and rows that will be updated in the new sheet
            Column column1 = newSheet.getColumnByIndex(0);
            Row row1 = newSheet.getRowByRowNumber(1);
            Row row2 = newSheet.getRowByRowNumber(2);
    
            // Setup two cells for the the specified columns
            List<Cell> newCell1 = new Cell.UpdateRowCellsBuilder().addCell(column1.getId(), 1).build();
            List<Cell> newCell2 = new Cell.UpdateRowCellsBuilder().addCell(column1.getId(), 2).build();
    
            // Update the cell for the specified row
            smartsheet.rows().updateCells(row1.getId(), newCell1);
            smartsheet.rows().updateCells(row2.getId(), newCell2);
        }
    }