将值移至不同的Google表格而不删除原始行

时间:2015-05-21 13:36:50

标签: google-apps-script google-sheets

当前脚本,基于Kriggs的建议:

function onEdit(event) {
  // assumes source data in sheet named All Projects
  // target sheet of move to named History
  // test column with yes/no is col 18 or R
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "All Projects" && r.getColumn() == 18 && r.getValue() == "Yes") {
    var row = r.getRow();
    var numColumns = s.getLastColumn() - 1;
    var targetSheet = ss.getSheetByName("History");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1, 1, numColumns);
    s.getRange(row, 1, 1, numColumns).copyTo(target);
    range.clearContent();
  }
}

当我将s.getRange设置为2时,它正在跳过一列,一切都已关闭。我把它重新设置为1(在取消单元格之后)并且有效。

然而,它并没有清除。我认为range.clearContent会清除我刚刚从All Projects移动的范围,它看起来就像在原始脚本中那样。我是否需要再次调用原始范围?

此外,这是复制公式,而不仅仅是结果。我将更改这些单元格引用的数据(例如,“历史记录”选项卡中的单元格N4和O4),我希望这些数据保持锁定状态。

编辑添加:

澄清我是如何使用这张表格的:目的是让人们(或我,真的)能够跟踪项目。所有项目中的每一行都将填充其相应编号的项目表。所以我可以在旅途中拥有多达10个项目,并查看每个项目所需的价格和基因。项目完成后,我希望能够存档信息(因此我可以为完成它而感到自豪),然后清除项目线以在那里开设另一个项目。

我知道这个问题已被问过几次了,我确实读完了这些答案,但他们都删除了最后的源行。它们似乎只是将数据移动而不是值。

Here is a dummy version of my sheet.不要担心#REF !,它可以在整张表中使用。

我有一个电子表格,其中“所有项目”允许您选择要执行的项目的选项(比如项目1),然后填充项目1表。当项目1在所有项目表中被标记为“已完成”时,我想让它自动移动到历史记录表,或者有一个用户可以使用的菜单。

在我的脑海中,我觉得菜单会减​​慢纸张的速度吗?它不是一个非常大或复杂的表,所以它可能无关紧要。

当我第一次粘贴并定制它以使用我的数据时,这是有效的,但现在我根本无法让它工作。我确实删除了一列,但是当我看到第18列时,我没有看到如何将第S列中的“是”更改为R会破坏它。

function onEdit(event) {
  // assumes source data in sheet named Needed
  // target sheet of move to named Acquired
  // test column with yes/no is col 18 or R
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = event.source.getActiveSheet();
  var r = event.source.getActiveRange();

  if(s.getName() == "All Projects" && r.getColumn() == 18 && r.getValue() == "Yes") {
    var row = r.getRow();
    var numColumns = s.getLastColumn();
    var targetSheet = ss.getSheetByName("History");
    var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    s.getRange(row, 1, 1, numColumns).moveTo(target);
    range.clearContent();
  }
}

here获得脚本。

当这个工作时,我看到这会删除该行。我试图使用clearContent命令,因为它应该保持格式不变,但它只是清除了包括我的数据验证在内的所有内容。

我认为我应该使用清晰(选项)的东西,但这似乎也不起作用。

This似乎是一个更新版本,但它根据另一个变量移动数据,我似乎无法解开所有问题。它也删除了行,并没有抓取值。

This取决于人们选择行和列,而不是onEdit所以所有的东西似乎都不同。我试过这个:

    function approveRequests() {
 var ss = SpreadsheetApp.getActiveSpreadsheet()
     sheet = ss.getActiveSheet(),
     sheetName = sheet.getName(),
     data = sheet.getDataRange().getValues();
 var r = sheet.getActiveRange();

 if (sheetName == "All Projects"&& r.getColumn() == 19 && r.getValue() == "Yes") {
  var range = sheet.getActiveRange(),
      startRow = range.getRowIndex(),
      numRows = range.getNumRows(),
      numCols = range.getNumColumns()
    var values = range.getValues(),
        nextSheet = ss.getSheetByName("History"),
        lastRow = nextSheet.getLastRow();
    nextSheet.getRange(lastRow+1,1,numRows,3).setValues(values);
    sheet.deleteRows(startRow,numRows);
   } 
} 

即使我可以看到它只会移动几列而不是一切,但我希望能有一个开始。

我还需要移动输入的值,而不是公式的结果。

This显示了如何获取值,但它只是将它们存储在日志中,而不是实际将它们放在某处。

今晚我会继续谷歌搜索,并尝试将事情拼凑在一起。任何正确方向的帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

我认为你可以使用公式。我做过与 FILTERS 非常类似的事情。

创建 VIEW PROJECT 表。在该选项卡中,您有一个带有内容验证的单元格,它从第一个工作表中获取项目名称(或龙名称),然后您可以使用过滤器填充您的VIEW PROJECT工作表单元格,这些过滤器将根据您在该项目中选择的项目获取内容细胞

例如,在 Project1 表单(龙名称)的单元格 C4 中,您进行了验证以获取'All Projects'!D3:D

中的值

然后,在其他对应的单元格中,您使用过滤器,例如:

获取身份证('Project1'!c6):

= filter( 'All Projects'!E3:E; 'All Projects'!D3:D = $C$4)

正确使用过滤器和一些“选择框”(带验证的单元格),您可以执行您想要的操作。相信我,它比为每个项目创建新标签更好。

Google应用程序脚本非常棒,但公式也非常强大。

Obs:将工作表Project1重命名为“View Project”

Obs2:在第一张工作表中,有许多合并的单元格使某些事情变得困难。由于它们只是为了布局问题而合并,我建议取消它们并删除边界。

希望有所帮助

答案 1 :(得分:0)

您的代码有3个问题:

1 - 你无法移动合并的单元格,如果你选择那些移动你将得到一个错误,所以numColumns应该是:

var numColumns = s.getLastColumn() - 1;

2 - 目标范围必须与复制的范围相同,因此请包括以下列:

var target = targetSheet.getRange(targetSheet.getLastRow() + 1, 1, 1, numColumns);

3-列1已合并,您无法移动它,从第2列开始:

s.getRange(row, 2, 1, numColumns).moveTo(target);

如果您只想移动数据但保留格式,请使用copyTo()clearContents()