按标题值删除列会删除所有列

时间:2015-05-13 03:13:21

标签: google-apps-script google-sheets google-spreadsheet-api

我的代码有(至少)2个问题。有人可以提供建议吗?我正在尝试学习JavaScript,所以我更喜欢提示,而不是完成代码。我的目标是将表单Main复制到名为achievement的新工作表中,并删除第一行中没有单词achievement的所有列。

  • 它不会将表格中的值复制到工作表中(我在成就中留下了一个空白的文档。  
  • 当我手动粘贴数据时,代码会删除每一列(而不是不包含单词成就的列)

    function myFunction() {
      SpreadsheetApp.getUi().alert('STARTED');
      var search_term='achievement';
      var main=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Main');
      var cp=SpreadsheetApp.getActiveSpreadsheet().insertSheet(search_term);
      SpreadsheetApp.getUi().alert(main.getName()+':'+cp.getName());
      main.copyTo(cp);
    
      var values = cp.getDataRange().getValues();
    
      var cell='';
      try{  
        //n=1 skip first col because it has titles as well as the first row
      for(n=1;n<values.length;++n){
        cell = values[0][n] ; // 0 is the index of the first row.
        if(!cell.indexOf('achievement')>-1)
        {
          cp.deleteColumn(n);
          values = cp.getDataRange().getValues();
          n=1
        }
      }
      }catch(e)
      {
        SpreadsheetApp.getUi().alert(e+'val:col:'+cell+':'+n);
      }
      SpreadsheetApp.getUi().alert('DONE');
    }
    
  • 2 个答案:

    答案 0 :(得分:0)

    values的内容是一个二维数组,一个行数组,每个行都是一个单元格(或列)数组。您选择的循环范围与此数据的结构不匹配:

    for(n=1;n<values.length;++n){
    

    下一行的代码相当于双重否定:

    if(!cell.indexOf('achievement')>-1)
    

    ...所以它会删除错误的列。请记住,当目标字符串不存在时,indexOf()将返回-1

    说到删除列,请考虑以下事项:

    cp.deleteColumn(n);
    

    您正在查看预先获取的数据,以确定要删除的列,并从电子表格中删除它们。删除列时,已删除列右侧的所有列都将获得新的列索引。换句话说,预取数组和电子表格列之间的+/- 1关系会发生变化。

    你可以通过循环而不是向上来避免这种情况。

    否则,请尝试逐步调试调试器中的每一行,验证电子表格中的更改。您的新工作表看起来应该由main.copyTo(cp);填充,因此请先检查一下。

    祝你好运!

    答案 1 :(得分:0)

    尝试这种方式:

     function testFunction()
        {
        var search_term = 'achievement';
        var mainsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Main');
         //make a copy of the main sheet and set a name.
        var values = mainsheet.getDataRange().getValues();
        var columns = mainsheet.getDataRange().getNumColumns();
    //Check for each cell value and take the column numbers to an array.
    
          // Instead of deleting each column from the sheet evrytime in the loop, try modifying the array and then update the sheet with those values one time.   
    
            }
    

    如果你愿意,我可以提供工作代码。

    希望有所帮助!