首页 > 解决方案 > 将数据移动到列中的第一个可用单元格(不是行)

问题描述

我有一张表来监控库存。我在工作表中有一个脚本,用于复制带有数据的行的值并粘贴到另一张工作表上的第一个可用行,然后清除内容。这会在原始工作表上的数据中留下漏洞。我想将我的所有数据合并到一列中的第一个可用单元格,这样数据行之间就永远不会有空行。不幸的是,我不能对另一张工作表做同样的事情,因为我的行中有某些列有需要保留的公式(求和公式来计算重量等)。如果我抓住整行,它会弄乱我的公式或公式弄乱脚本(行不可用,因为它包含一个值)。所以基本上我所拥有的是:

Sheet1 name = 'CURRENT MONTH' 
Sheet2 name = 'SHIPPED INVENTORY'

Sheet1 上具有数据的总范围 = A11:W61 具有需要向上移动的数据的范围 =A11:O61, R11:S61, V11:W61 具有不能移动的公式的范围 =P11:Q61, T11:U61

我已经搜索了我能找到的东西,但要么我无法正确表达我的困境,要么答案超出了我的技能水平,我无法让它们为我工作。非常感谢任何帮助!

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


在没有看到您如何将信息从一张表移动到另一张表的情况下,此代码将整行复制到库存表的第一行:

function myFunction ()
{
  ...

  var ss = SpreadsheetApp.getActiveSpreadsheet ();
  var month_sheet = ss.getSheetByName ("CURRENT MONTH");
  var shipped_sheet = ss.getSheetByName ("SHIPPED INVENTORY");

  var month_values = month_sheet.getDataRange ().getValues ();
  for (var i = 11; i < month_values.length && i <= 61; i++)
  {
    if (test_value) // This is a row you want to move to the other sheet
    {

      // Create a row in the SHIPPED INVENTORY sheet,
      // and copy the full row into it
      shipped_sheet.insertRowAfter (1); // Assuming a header row
      var shipped_row_1= shipped_sheet.getRange (2, 1); // Get second row in file
      var month_range = month_sheet.getRange ((i + 1), 1, 1, month_sheet.getMaxColumns ());
      month_range.copyTo (shipped_row_1);

      // Now move everything else up
      moveRangeUp (month_sheet, "A", i, "O61");
      moveRangeUp (month_sheet, "R", i, "S61");
      moveRangeUp (month_sheet, "V", i, "W61");
      i--; // Since everything moved up, check this row's new information
    }
  }

  ...          
}

function moveRangeUp (sheet, first_col, row, last_col_row)
{
  var from_a1Notation = first_col + (i + 1) + ":" + last_col_row;
  var to_a1Notation = first_col + (i);
  var copy_range = sheet.getRange (from_a1Notation);
  var to_range = sheet.getRange (to_a1Notation);
  copy_range.copyTo (to_range);

  // After shift up, delete last row of data, since it is also moved up
  // Always assuming that the last row is row 61
  var delete_a1Notation (first_col + "61:" + last_col_row);
  var delete_range = sheet.getRange (delete_a1Notation);
  var delete_range.clear ();
}

推荐阅读