当前脚本,基于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显示了如何获取值,但它只是将它们存储在日志中,而不是实际将它们放在某处。
今晚我会继续谷歌搜索,并尝试将事情拼凑在一起。任何正确方向的帮助将不胜感激!
答案 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()
。