【问题标题】:Yet another how do I copy a row from one sheet to another ?还有一个如何将一行从一张纸复制到另一张纸上?
【发布时间】:2012-11-19 05:27:29
【问题描述】:

由于某种原因,此代码不会进行复制。请问我做错了什么?

    var targetSheetName="My Target"
    var targetSheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName(targetSheetName);      
    var sourceRange = SpreadsheetApp.getActiveSheet().getDataRange();    
    sourceRange.copyTo(targetSheet.getRange(targetSheet.getMaxRows()+1, 1));

我也试过 var sourceRange = SpreadsheetApp.getActiveSheet().getDataRange().getRow();分配数据,因为我不清楚 getDataRange() 正在获取什么范围的数据,所以我认为它可能正在获取整个活动工作表,因此在尝试复制一行时可能会失败。底线是我尝试了各种各样的东西,但似乎没有任何效果。

我在一个又一个例子中查看了一个又一个例子,所有这些例子都彼此如此不同,我不断遇到障碍,试图将它们所拥有的东西转化为我需要的东西。以上是我最终确定并调整以供使用,但我仍然卡住了。

提前致谢。

【问题讨论】:

  • getRange(targetSheet.getMaxRows()+1,1) 将失败,因为它试图获取不存在且不存在的行。这很容易纠正,但首先:你到底想复制什么? (所有行?一行?如果有,是哪一行 - 最后一行?您是否乐意只复制值,还是还需要复制公式和/或格式?)
  • 要复制 1 行 - 然后从源工作表中删除。我想可能更多的是移动/附加。我想复制活动行,代码在 onEdit() 内。也可以复制格式,但我想我可以没有它。
  • 顺便说一句...我不明白你为什么说“getRange(targetSheet.getMaxRows()+1,1) 会失败,因为它试图获得一个没有的行并且不可能存在。”即使工作表为空/空白,也始终存在“MaxRows”。然后 MaxRows 将为零。给它加 1 瞧,我们有 getRange(1,1);文档说:方法 getRange(row, column, optNumRows, optNumColumns) 获取工作表单元格的范围。如果给定的方法参数无效,用户将看到一条错误消息。这个方法中的所有参数都需要大于0。好吧,所有参数都大于0,所以我比较糊涂。
  • 是的,getMaxRows 总是有一个值(顺便说一句,它永远不能为零,一张工作表必须至少有一行)。该值本质上是工作表中的总行数。所以我假设如果你试图在工作表的最后一行之后的一行上获得一个范围,它会失败 - 但我错了,它没有,它实际上增加了 50 行来容纳没有的行t 以前存在。 (我认为这不太理想)

标签: google-sheets google-spreadsheet-api


【解决方案1】:

要复制 1 行 - 然后从源工作表中删除。大概 我想更多的是moveto/append。我想复制活动行

var ss = SpreadsheetApp.getActiveSpreadsheet();
var targetSheetName = "My Target";
var targetSheet = ss.getSheetByName(targetSheetName);
var sourceSheet = ss.getActiveSheet();      
var sourceRow = sourceSheet.getActiveRange().getRow();
var targetRow = targetSheet.getLastRow() + 1;
if (targetRow > targetSheet.getMaxRows()) targetSheet.insertRowAfter(targetRow - 1);
sourceSheet.getRange(sourceRow, 1, 1, sourceSheet.getLastColumn()).copyTo(targetSheet.getRange(targetRow, 1));   
sourceSheet.deleteRow(sourceRow);

【讨论】:

  • 谢谢。看起来不错。我会检查一下。我确定它有效。
  • sourceRange 永远不会被设置,因此删除不起作用。我实现您的代码与上面的代码有点不同,并设法让它在没有删除的情况下工作。我最终使用了我认为可以删除的“moveto”功能,但它所做的只是清除,留下空白行。所以现在我必须回去搜索空行并删除它们。事实证明这是一个问题。我在这里发布了另一个问题:stackoverflow.com/questions/13439166/… 感谢您的帮助!
  • 抱歉打错了 - 我有sourceRange.deleteRow(sourceRow);,应该是sourceSheet.deleteRow(sourceRow); - 感谢您指出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 2019-09-03
相关资源
最近更新 更多