Google apps script 在不删除原始行的情况下将值移动到不同的Google工作表

Google apps script 在不删除原始行的情况下将值移动到不同的Google工作表,google-apps-script,google-sheets,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.s

当前脚本,基于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会清除我刚从所有项目中移动的范围,看起来它在原始脚本中就是这样做的。我需要重新调用原始范围吗

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

编辑以添加:

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

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

别担心,裁判!,它在整张纸上工作

我有一个电子表格,其中“所有项目”让你为你想做的项目(比如项目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();
  }
}
我从他那里得到了剧本

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

我想我应该使用清楚(选项)的东西,但这似乎也不起作用

似乎是一个更新版本,但它根据另一个变量移动数据,我似乎无法解决所有问题。它还会删除该行,并且不会获取值

取决于人们选择行和列,而不是OneEdit,因此所有的事情似乎都不同。我试过这个:

    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);
   } 
} 
尽管我可以看到它只会移动几列而不是所有的内容,但我还是希望能有一个开始

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

显示如何获取值,但它只是将它们存储在日志中,而不是实际将它们放在某个地方


今晚我会继续用谷歌搜索,试着把事情拼凑起来。任何方向正确的帮助都将不胜感激

我想你可以用公式来做这些。我用过滤器做过类似的事情

创建视图项目图纸。在该选项卡中,您有一个具有内容验证的单元格,该单元格从第一张图纸中获取项目名称(或龙名称),然后您可以使用过滤器填充视图项目图纸单元格,该过滤器将根据您在该单元格中选择的项目获取内容

例如,在Project1工作表(dragon name)的单元格C4中,您可以通过验证从
的“所有项目”中获取值!D3:D

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

正在获取ID(
'Project1'!c6
):

有了正确使用的过滤器和一些“选择框”(带有验证的单元格),您就可以随心所欲了。相信我,这比为每个项目创建新标签要好

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

Obs:将图纸项目1重命名为“查看项目”

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


希望这有帮助

您的代码有3个问题:

1-无法移动合并的单元格,如果选择要移动的单元格,将出现错误,因此numcolumn应为:

var numColumns=s.getLastColumn()-1

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

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

3-第1列已合并,您不能移动该列,从第2列开始:

s.getRange(行,2,1,numColumns).moveTo(目标)


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

所有项目中的数据填充最终将成为十个项目工作表,您可以重用它们。我懒得继续做床单,所以我希望把它存档。我将编辑我的帖子,澄清我是如何使用这张表的,对不起。我不认为这对我有帮助,但是谢谢@乌尔菲,你不会一直做的。您将只选择龙的名称,所有内容将相应地更改。这比寻找正确的工作表要快。除此之外,您还必须为第一页中的每一列更改更改您的代码,您将看到应该考虑这种情况下的公式。谢谢!我回家后会试试这个。只是想澄清一下,你在使用哪个版本
= filter( 'All Projects'!E3:E; 'All Projects'!D3:D = $C$4)