【问题标题】:Deleting Cells in Google Sheets without removing a whole row删除 Google 表格中的单元格而不删除整行
【发布时间】:2017-09-08 08:50:38
【问题描述】:

如果“删除”在该行的第 4 个单元格中,我有如下代码当前删除整行。是否可以只删除左侧的 3 个单元格以及我在其中写入“删除”的单元格,而不是整行(例如,我不想删除单元格 B16 中的其他内容?

我找不到 .deleteCell 函数。有没有其他方法可以做到这一点?

function deleteRows() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();

  var rowsDeleted = 0;
  for (var i = 0; i <= numRows - 1; i++) {
    var row = values[i];
    if (row[4] == 'delete') { // This searches all cells in columns A (change to row[1] for columns B and so on) and deletes row if cell is empty or has value 'delete'.
      sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
      rowsDeleted++;
    }
  }
};

【问题讨论】:

  • 你的意思是清空他们的内容而不是删除单元格吗?
  • 我想删除单元格。谢谢!
  • 那么您要删除的单元格下方的所有单元格都向上移动一个单元格吗?您必须使用 Google Apps 脚本手动编程。没有内置函数。
  • 你怎么能只删除三个单元格而让行的其余部分保持打开状态?如果要删除,则删除该行或列中的所有内容。但是你可以简单地清除一些单元格。
  • @SimonBaars 是的,完全正确。删除并向上移动。这是一件容易编程的事情吗?

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


【解决方案1】:

使用上移或左移删除

这将删除一个单元格并根据 shift 参数将数据向上或向左移动。

function delCellAndShift(row,column,shift) 
{
  if(row && column)
  {
    var shift=(typeof(shift)!='undefined')?shift:'left';
    var ss=SpreadsheetApp.getActive();
    var sh=ss.getActiveSheet();
    var rg=sh.getDataRange()
    var vA=rg.getValues();
    if(shift=='left')
    {
      var tA=vA[row-1];
      tA.splice(column-1,1);
      tA.push('');
      vA[row-1]=tA;
      rg.setValues(vA);
    }
    if(shift=='up')
    {
      var vB=Object.keys(vA[0]).map(function (c) { return vA.map(function (r) { return r[c]; }); });
      var tA=vB[column-1];
      tA.splice(row-1,1);
      tA.push('');
      vB[column-1]=tA;
      vA=Object.keys(vB[0]).map(function (c) { return vB.map(function (r) { return r[c]; }); });
      rg.setValues(vA);
    }
  }
  else
  {
    var s='Invalid Inputs for delCellAndShift.<br /><input type="button" value="Close" onClick="google.script.host.close();" />';
    var ui=HtmlService.createHtmlOutput(s);
    SpreadsheetApp.getUi().showModalDialog(us, 'Invalid Inputs')
  }
}

我使用以下函数对其进行了测试,以设置我的数据并运行主函数。

function testDelCell()
{
  delCellAndShift(3,7,'up');
}

function testsetupfordelcell()
{
    var rs=10;
    var cs=10;
    var ss=SpreadsheetApp.getActive();
    var sh=ss.getActiveSheet();
    var rg=sh.getRange(1,1,rs,cs);
    var vA=rg.getValues();
    for(var i=0;i<rs;i++)
    {
      for(var j=0;j<cs;j++)
      {
        vA[i][j]=Utilities.formatString('%s,%s',i,j)
      }
    }
    rg.setValues(vA);
}

这是它向左移动的示例:

这是它向上移动的示例:

【讨论】:

    【解决方案2】:

    所以问题是:

    如何将给定单元格下方的所有单元格向上移动一排(覆盖给定单元格值)?

    执行此操作的代码是:

    function deleteCell(sheet, cellx, celly){
        var wholeSheet = SpreadsheetApp.openById(sheet).getRange("A1:F").getValues();
        for(var i = celly; i<wholeSheet.length; i++){
            wholeSheet[cellx][i] = wholeSheet[cellx][i+1];
        }
        SpreadsheetApp.openById(sheet).setValues(wholeSheet);
    }
    

    【讨论】:

    • 无法缝合以使其正常工作!我已经移动了 x 和 y。问题似乎在第 2 行。此代码是否与特定列有关,即仅在其旁边出现“删除”的行。
    • 糟糕,我发现我确实犯了一个错误:我忘记了范围。请再试一次。第 2 行中的“F”应该是工作表中的最后一列(例如,如果工作表有 3 列,则该“F”应该是“C”)。
    • 如果移位的单元格包含任何公式,它们将丢失,因为setValues而被数字替换。格式也不会上移。使用copyTo 方法来避免这两个问题。 (抄送:@tbowden)
    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多