我正在构建一个自动将Google电子表格写入Smartsheet的Google脚本,但是父母/ sibbling已经格式化,不需要手动缩进,因为我必须在电子表格中执行此操作,通过编号列。
我设法写入了Smartsheet,但我似乎无法弄清楚如何发送一组(600+)具有父/ ssbling设置的行,这些行在同一个urlFetch调用中。
应该解决我的问题的一些问题:
是否可以确定/指定我要包含的“rowId”?
提供行时是否可以设置“parentRowNumber”?
在不知道“rowId”的情况下,是否有可能以任何其他方式批量插入父级行?
由于我还没有找到[google-apps-script] + [smartsheet-api],这里是如何插入一行(工作代码):
function adcionarLinhaSmartSheet(){
//Static for testing
var rows = [];
rows[0] = {};
rows[0].cells = [];
rows[0].cells[0] = {};
rows[0].cells[0].columnId = "[ROW_ID]";
rows[0].cells[0].value = 14;
rows[0].cells[0].strict = false;
var payload = {"toBottom":true, "rows":rows};
var dadosEnviar = {headers:{Authorization:"Bearer [ACCESS_TOKEN]", "content-type":"application/json"}, "Method":"post", "payload":JSON.stringify(payload)};
var planilhaSmart = UrlFetchApp.fetch("https://api.smartsheet.com/1.1/sheet/[SHEET_ID]/rows", dadosEnviar);
}
答案 0 :(得分:1)
您可以使用单个POST向Smartsheet API插入多行,但该调用中的所有行都将添加到工作表中的相同层次结构级别。因此,要使用具有父/子关系的行创建工作表,您可以执行以下操作:
首先,进行一次调用,将所有父级别行插入工作表。
然后,使用新创建的行的rowIds,对每个父项的POST所有子行进行其他调用。您需要为每个父行的子行组进行单独调用。
答案 1 :(得分:0)
原始问题的答案是否定的,但是当mcallister回答时,它不是很漂亮也不快,而是有效。
function preencherSmartSheet(){
var v_sheetId = ##########; //Id planilha, definida no cronograma
var dadosOrc = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Orçamento").getRange("A3:K").getValues();
var rows = [], v_maxNivel = 0, v_linhasIds = [], calls = 0, payload, tempId;
//Enviado ao smartsheet
var dadosEnviar = accessToken; // Definido na aba Smartsheet API.gs
dadosEnviar.Method = "post"; //post = incluir
//Pega os dados da planilha Smartsheet
var planilhaSmart = JSON.parse(UrlFetchApp.fetch("https://api.smartsheet.com/1.1/sheet/"+v_sheetId, accessToken));
calls++;
//Verifica qual a coluna das tarefas
var idColuna = [];
for(i in planilhaSmart.columns){
if(planilhaSmart.columns[i].title == "Nome da tarefa"){
idColuna[1] = planilhaSmart.columns[i].id;
}else if(planilhaSmart.columns[i].title == "n°"){
idColuna[0] = planilhaSmart.columns[i].id;
}
}
//verifica maior nivel para começar
for(i in dadosOrc){
if(dadosOrc[i][10] > v_maxNivel){
v_maxNivel = dadosOrc[i][10];
}
}
//Formata as linhas em Objeto JSON
for(v_nivelAtual = v_maxNivel; v_nivelAtual >= 0; v_nivelAtual--){
for(i = 0; i < dadosOrc.length; i++){
if(dadosOrc[i][10] == v_nivelAtual){
if(v_nivelAtual == v_maxNivel){
for(; i < dadosOrc.length; i++){
if(dadosOrc[i][10] == v_nivelAtual){
rows.push({"cells":[{"columnId" : idColuna[0].toString(), "strict" : false, "value" : i},
{"columnId" : idColuna[1].toString(), "strict" : true, "value" : dadosOrc[i][0].toString()}]});
}
}
}else{
rows = [];
tempId = i;
for(; i < dadosOrc.length && dadosOrc[i][10] <= v_nivelAtual; i++){
if(dadosOrc[i][10] == v_nivelAtual){
rows.push({"cells":[{"columnId" : idColuna[0].toString(), "strict" : false, "value" : i},
{"columnId" : idColuna[1].toString(), "strict" : true, "value" : dadosOrc[i][0].toString()}]});
}
}
}
if(v_nivelAtual < v_maxNivel){
payload = {"toBottom":true, "rows":rows, "parentId" : dadosOrc[tempId][1].toString()};
}else{
payload = {"toBottom":true, "rows":rows};
}
dadosEnviar.payload = JSON.stringify(payload);
UrlFetchApp.fetch("https://api.smartsheet.com/1.1/sheet/"+v_sheetId+"/rows", dadosEnviar);
calls++;
}
}
planilhaSmart = JSON.parse(UrlFetchApp.fetch("https://api.smartsheet.com/1.1/sheet/"+v_sheetId, {headers:cabecalhoSmartsheet}));
calls++;
//Array com os id's da linhas pais, indice do array = linha do pai
for(i in planilhaSmart.rows){
v_linhasIds[planilhaSmart.rows[i].cells[0].value] = planilhaSmart.rows[i].id;
}
//Coloca no item 1 do array de dados do orçamento o id da linha pai das mesmas
for(i in dadosOrc){
if((dadosOrc[i][10]*1) == ((v_nivelAtual*1) - 1)){
for(ii = i; ii >= 0; ii--){
if(v_linhasIds[ii]){
dadosOrc[i][1] = v_linhasIds[ii]
ii = 0;
}
}
}
}
}
Logger.log(calls);
}