Google apps script 在Google Sheets中归档行时如何添加新行

Google apps script 在Google Sheets中归档行时如何添加新行,google-apps-script,google-sheets,archive,Google Apps Script,Google Sheets,Archive,我目前在我的谷歌工作表中有工作代码。当在下拉菜单中标记为“存档”时,代码将工作表中的某些行移到另一个工作表上 我的问题是,当这种情况发生时,整行都会被删除。我只需要归档C:O列(C2:O)中的信息。这会产生另一个问题,当它删除该行时,其他行会向上移动,从而删除我为输入创建的设置数量的行 我需要它自动将归档行替换为另一行,该行具有所有相同的条件格式和功能,这样它就不会中断工作表的其余部分,也不需要进入并手动创建更多行 请帮忙,非常感谢 谷歌应用程序脚本中使用的当前代码附在下面 function m

我目前在我的谷歌工作表中有工作代码。当在下拉菜单中标记为“存档”时,代码将工作表中的某些行移到另一个工作表上

我的问题是,当这种情况发生时,整行都会被删除。我只需要归档C:O列(C2:O)中的信息。这会产生另一个问题,当它删除该行时,其他行会向上移动,从而删除我为输入创建的设置数量的行

我需要它自动将归档行替换为另一行,该行具有所有相同的条件格式和功能,这样它就不会中断工作表的其余部分,也不需要进入并手动创建更多行

请帮忙,非常感谢

谷歌应用程序脚本中使用的当前代码附在下面

function myFunction() {
 // moves a row from a sheet to another when a magic value is entered in a column
 // adjust the following variables to fit your needs
 // see https://productforums.google.com/d/topic/docs/ehoCZjFPBao/discussion
 var sheetNameToWatch = 'Campaigns';
 var columnNumberToWatch = 6;
 // column A = 1, B = 2, etc…
 var valueToWatch = 'Archive';
 var sheetNameToMoveTheRowTo = 'Archive';
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = SpreadsheetApp.getActiveSheet();
 var range = sheet.getActiveCell();
 if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {
   var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
   var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
   sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
   sheet.deleteRow(range.getRow());
 }
}

如果要在不删除行的情况下清除值,则需要通过以下方式更改方法:

  • 获取包含要存档的数据的范围
  • 要填充归档表,请使用
    copyTo()
    而不是
    moveTo()
  • 获取仅包含要清除的单元格的范围
  • 用于清除该范围
这是您的函数的重新实现。我已经将可配置位提取到全局变量中,这使得调整它们更容易

var SOURCE_SHEET_NAME = 'Campaigns';
var TARGET_SHEET_NAME = 'Archive Campaigns';

// The cell value that will trigger the archiving action.
var ARCHIVE_VALUE = 'Archive';

// The column number where you expect the ARCHIVE_VALUE to appear.
var ARCHIVE_COLUMN_NUMBER = 4;

// The starting and ending columns for the range of cells to archive.
var ARCHIVE_START_COLUMN = 1;
var ARCHIVE_END_COLUMN = 15;

// The starting and ending columns for the range of cells to clear.
var CLEAR_START_COLUMN = 1;
var CLEAR_END_COLUMN = 10;

function archiveRow() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var activeCellRange = sheet.getActiveCell();

  if (sheet.getName() != SHEET_NAME ||
      activeCellRange.getColumn() != ARCHIVE_COLUMN_NUMBER ||
      activeCellRange.getValue() != ARCHIVE_VALUE) {
    return;
  }

  var activeCellRow = activeCellRange.getRow();

  // Get the range for the data to archive.
  var archiveNumColumns = ARCHIVE_END_COLUMN - ARCHIVE_START_COLUMN + 1;
  var archiveRowRange = sheet.getRange(activeCellRow, ARCHIVE_START_COLUMN, 1, archiveNumColumns)

  // Get the range for the archive destination.
  var targetSheet = ss.getSheetByName(TARGET_SHEET_NAME);
  var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1, 1, archiveNumColumns);

  // Copy the data to the target range.
  archiveRowRange.copyTo(targetRange);

  // Get the range for the data to clear.
  var clearNumColumns = CLEAR_END_COLUMN - CLEAR_START_COLUMN + 1;
  var clearRowRange = sheet.getRange(activeCellRow, CLEAR_START_COLUMN, 1, clearNumColumns);

  // Clear the row.
  clearRowRange.clearContent();
}

您只需要使用copyTo()[1]函数,而不需要使用moveTo()[2]函数来剪切和粘贴源行。此外,如果您只想保留具有相同格式和函数集的行单元格,则需要删除deleteRow函数。您只需更改以下内容:

sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
sheet.deleteRow(range.getRow());
为此:

sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).copyTo(targetRange);
此外,如果只想将值而不是公式从单元格复制到目标工作表,请使用copyTo函数和选项[3],如下所示:

sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).copyTo(targetRange, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
[1]

[2]


[3]

这是一个可查看的工作表链接,您的链接不是公开的。谢谢。只是改变了它太棒了,所以它起作用了谢谢你,楚克斯。但是现在我怎么才能让它只拉柱C:O?我不希望它中断或从列A或B中提取信息。如果要存档/清除行的子集,请适当更改调用。我已经更新了代码片段,从第3列(又名C列)开始。为了更简单地执行此操作,请使用。我在下面添加了一个全新的答案。我没有意识到@符号不会在帖子中抓住你的用户名。仅供参考,在跟进你的问题时,你应该编辑问题,而不是提交答案。谢谢你Andres Duarte