将数据移至列中的第一个可用单元格(而非行)

时间:2019-05-15 16:04:13

标签: javascript google-apps-script google-sheets

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

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

在Sheet1上包含数据的总范围= A11:W61 需要上移数据的范围= A11:O61, R11:S61, V11:W61 公式无法移动的范围= P11:Q61, T11:U61

我已经搜索了可能的内容,但是我要么无法正确表达自己的困境,要么答案超出了我的技术水平,我无法让它们对我有用。非常感谢您的协助!

1 个答案:

答案 0 :(得分:0)

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

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