【问题标题】:Simple Google Spreadsheet Script to copy and paste cells gives error用于复制和粘贴单元格的简单 Google 电子表格脚本会出错
【发布时间】:2013-01-26 02:52:40
【问题描述】:

我在下面有一些相对简单的代码会引发错误::“无法将 NaN 转换为(类)”。

我要做的就是将一些单元格从一个地方复制到另一个地方!

谁能告诉我这段代码有什么问题?

非常感谢。

function myFunction() {

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet 1');   
  var values = sheet.getDataRange().getValues()  

  for( var row = values.length -1; row >= 0; --row )
    if (values[row][5] == 'Here')
     var maxRows = sheet.getMaxRows()
     var startRow = (row)+1
     var numRows = (maxRows)-(row)
     var Range = sheet.getRange(startRow, 3, numRows, 3).getValues()
     sheet.getRange(row, 3, numRows, 3).setValues(Range)     // (row, column, numRows, numColumns)      
  }

因此,正如代码所希望显示的那样,我想将 C:E 范围内的单元格复制到 getMaxRows(),但仅将行 x 复制到 getMaxRows(),其中 x 是在 F 列中找到“Here”的行号加上 1。然后我想将其粘贴到相同的 C:E 列中,但比原来高一行(粘贴到与 F 列中的“此处”相同的行)。

任何帮助将不胜感激。感谢观看。

编辑:错误在这一行:

var Range = sheet.getRange(startRow, 3, numRows, 3).getValues()

在我的工作表中,要复制的单元格可以包括空白单元格甚至整个空白行。这会导致问题吗?

【问题讨论】:

  • 你的意思是newRange 在里面吗?因为该变量从未定义。此外,它是否为您提供了引发该错误的行号?
  • 你好菲尔。感谢您指出了这一点。我已经编辑了问题以删除该未定义的变量。错误仍然显示,因此问题仍然存在!我还添加了错误出现的那一行。非常感谢,文

标签: google-apps-script google-sheets


【解决方案1】:

从你的描述而不是你的代码开始(为什么不在循环和条件中使用 {}?)我建议你试试这个

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet 1');   
  var values = sheet.getDataRange().getValues()  
  var maxRows = sheet.getLastRow()
  var datatoCopy = []   
  for( var row = values.length -1; row >= 0; --row ){
    if (values[row][5] == 'here'){
     var whereToCopy = row+1
     Logger.log(whereToCopy);
     break
     }
     }
   for(row=whereToCopy-1;row<maxRows;++row){
    datatoCopy.push([values[row][2]+'**']);// store column data in an array - remove the ** that I used to see what was copied ;-)
    }
    Logger.log(datatoCopy)
sheet.getRange(whereToCopy, 5, datatoCopy.length, 1).setValues(datatoCopy);// overwrite data to column E
}

根据您的评论,试试这个版本?

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet 1');   
  var values = sheet.getDataRange().getValues()  
  var maxRows = sheet.getLastRow()
  var datatoCopy = []   
  for( var row = values.length -1; row >= 0; --row ){
    if (values[row][5] == 'here'){
     var whereToCopy = row
     Logger.log(whereToCopy);
     break
     }
     }
   for(row=whereToCopy-1;row<maxRows-1;++row){
    var rowData=[]
    rowData.push(values[row+1][2]+'*C*');// I added these 'indicators' to show what happens... delete them when the result is ok ;-)
    rowData.push(values[row+1][3]+'*D*');//
    rowData.push(values[row+1][4]+'*E*');//
    datatoCopy.push(rowData);// store column data in an array - remove the ** that I used to see what was copied ;-)
    }
    Logger.log(datatoCopy)
sheet.getRange(whereToCopy, 3, datatoCopy.length, datatoCopy[0].length).setValues(datatoCopy);// overwrite data to column E
}

【讨论】:

  • 您好,Serge,谢谢您的回答。我实际上想复制一个 3 列范围 C:E,并将其粘贴到相同的列 C:E 中,但比原来高一行。我已经编辑了我的问题以使其更清楚。您的代码是否需要大量编辑才能实现这一点?非常感谢。
  • 我创建了一个测试表here
  • 嗨,Serge,再次感谢您,非常感谢您的回答。该脚本在我第一次运行时效果很好,但是当我第二次或第三次运行它时,它会将数据推到 F 列中的单元格“此处”之外。有什么想法可以阻止这种情况发生吗?问候
  • 嗨,谢尔盖。我一直在想,也许脚本中的变量需要在最后“清除”。这会使脚本在第二次或第三次运行时正常运行吗?如果是这样,任何想法如何做到这一点?非常感谢。
  • 抱歉,回答晚了,我已经测试了on this sheet,但我无法重现您描述的问题...您可以试试吗?并通过文件邮件告诉我会发生什么。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多