【问题标题】:Setting a batch of parents/sibblings in one call在一次通话中设置一批父母/兄弟姐妹
【发布时间】:2014-08-13 19:45:52
【问题描述】:

我正在构建一个 Google 脚本,它会自动将 Google 电子表格写入 Smartsheet,但父母/兄弟姐妹已经格式化,不需要手动 indeting,因为我已经在电子表格中通过编号列执行此操作。

我设法写入 Smartsheet,但我似乎无法弄清楚如何发送一批(600 多条)带有父母/兄弟姐妹的行,它们在同一个 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);
}

【问题讨论】:

    标签: google-apps-script smartsheet-api smartsheet-api-1.1


    【解决方案1】:

    您可以通过单个 POST 向 Smartsheet API 插入多行,但该调用中的所有行都将添加到您的工作表中的同一层级。因此,要使用具有父/子关系的行创建工作表,您可以执行以下操作:

    首先,进行一次调用以将所有父级行插入到您的工作表中。

    然后,使用新创建的行的 rowId,对每个父行的所有子行进行额外调用。您需要为每个父行的子行组单独调用。

    【讨论】:

    • 希望我至少可以一次发布不同父母的所有孩子,每一行都包含它的父母。有了这个,我将不得不打 2 Utilities.sleep(1000*60) 因为每分钟 300 次调用,它不会很快,但会工作。
    • @Kriggs - 不确定您是如何实现它的,但我建议您通过指数回退对速率限制错误做出反应,而不是在您认为已达到限制时主动等待。 300 次呼叫/分钟是最坏的情况。有效速率限制可能更高。此外,它是滚动请求计数,使用过去 60 秒内的命中总数而不是限制窗口,即您达到最大值,现在您必须等待 60 秒。希望对您有所帮助。
    • stmcallister - 让它工作,很多头疼但现在可以节省我们很多缩进时间,作为一个建议,在导入工作表时,可以选择一个列来指定父母。 @kyanskeem - 实际上没有达到呼叫/分钟限制,因为整个执行记录需要 200 多秒,每个呼叫需要不少于 0.3 秒,有些需要 1.5 秒,所以我不可能用完 300 60 秒。
    【解决方案2】:

    原始问题的答案是否定的,但按照 stmcallister 的回答做了,它既不漂亮也不快,但有效。

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      • 1970-01-01
      相关资源
      最近更新 更多