3

语境

开发人员希望使用 smartsheet API 填充现有的 smartsheet 工作表。要填充的数据由数据和公式组成。

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

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

问题

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

问题

有没有办法(除了通过手动输入)强制 smartsheet 重新评估插入的不透明文本,以便将不透明文本转换回公式?

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

目标

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

4

1 回答 1

2

更新:Smartsheet 现在支持通过 API 添加或更新公式,该 API 可以在文档中找到,用于添加行更新行

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


原始答案

您是对的,API 目前不支持公式。虽然,我们确实计划在未来添加此功能。

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

可用选项

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

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

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

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

卷曲示例

从模板创建一个新工作表。确保在下面的命令中替换YOUR_TOKEN和。YOUR_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}]'

开发工具包示例

这个例子需要安装我们的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);
    }
}
于 2014-04-08T18:30:34.113 回答