CONTEXT
开发人员希望使用智能表API填充现有的智能表工作表。要填充的数据包括数据和公式。
但是,根据API文档(http://www.smartsheet.com/developers/api-documentation),无法使用API添加公式。
包含公式的单元格,指向其他单元格的链接,系统值或 无法通过API插入或更新甘特图值。
问题
测试验证了这一点。尝试使用智能表API添加简单公式会导致公式转换为不透明文本。检查显示公式是使用单引号字符修改的,它将其呈现为不透明文本而不是公式。
问题
是否有任何方法(通过手动输入除外)强制智能表重新评估插入的不透明文本,以便将不透明文本转换回公式?
如果不可能(除了通过手动输入)是否可以复制具有公式的现有工作表,然后使用智能表API将非公式数据填充到工作表中?
目标
基本目标是找到一种方法将公式数据填充到智能表应用程序中,而无需手动输入公式数据。
答案 0 :(得分:2)
更新:Smartsheet现在支持通过API添加或更新公式,该公式可以在adding a row和updating a row的文档中找到。
主要区别在于设置行对象中的formula
而不是设置value
。
原始答案
您说得对,API目前不支持公式。虽然,我们计划在将来添加此功能。
目前,如果您尝试将公式发送到API,它将作为字符串处理,并且单引号将添加到公式的开头。然后,将字符串转换回公式的唯一方法是在Smartsheet UI内部手动删除单引号。
可用选项
如果您始终使用相同的公式,那么您使用模板的建议肯定会有效。该过程如下所示:
注意:从未使用过的行无法更新,因为它们不存在。因此,在模板中,您可以通过在要更新的位置放置一个单词来初始化行。例如,您可以在要更新的所有位置添加“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}]'
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);
}
}