按 header 值删除列将删除所有列

deleting column by header value deletes all columns

我的代码有(至少)2 个问题。谁能提供建议?我正在努力学习 JavaScript 所以我真的更喜欢提示而不是完整的代码。我的目标是将 sheet Main 复制到一个名为 achievement 的新 sheet 中,并删除第一行中没有单词 achievement 的所有列。

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

    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');
    }
    
  • values的内容是一个二维数组,一个行数组,每一行都是一个单元格(或列)数组。您选择的循环范围与此数据的结构不匹配:

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

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

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

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

    说到删除列,考虑一下:

    cp.deleteColumn(n);
    

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

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

    否则,请尝试单步执行调试器中的每一行,验证分布的更改sheet。看起来你的新 sheet 应该由 main.copyTo(cp); 填充,所以先检查一下。

    祝你好运!

    试试这个方法:

     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.   
    
            }
    

    如果你需要,我可以提供工作代码。

    希望对您有所帮助!