我有一个在Google工作表后台运行的宏脚本,当“公式”选项卡中的行数超过10行时,它会将包含公式的选项卡存档(复制和粘贴值)到不包含公式的新存档选项卡。这使得工作表不会随着所有内置公式的行数增加而减慢。
宏几天前坏了,什么都没变,除了我在脚本编辑器中看到的这个新错误。
下面是返回我们正在存档的工作表的最后一行(带公式)的代码。错误信息告诉我这部分代码坏了。
var Direction=SpreadsheetApp.Direction;
var DailySLast =dailySheet.getRange("A"+(dailySheet.getLastRow()+1)).getNextDataCell(Direction.UP).getRow();
下面是指向的错误消息。getNextDataCell部分
Exception: Invalid argument
myFunction @ Code.gs:8
知道为什么会这样吗?
下面是整个功能
function myFunction() {
// Get handles to Daily and Archive sheets
var dailySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Scorecard');
var appendSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('[Archive] Scorecard');
//get last row of the daily sheet
var Direction=SpreadsheetApp.Direction;
var DailySLast =dailySheet.getRange("A"+(dailySheet.getLastRow()+1)).getNextDataCell(Direction.UP).getRow();
//Range of cells to be copied
var CopyRange = "Scorecard!9:" + DailySLast;
//Range of cells to be deleted
var DelRange = "Scorecard!9:" + 2000;
//get last row of the archive sheet
var ArchiveSLast =appendSheet.getRange("A"+(appendSheet.getLastRow()+1)).getNextDataCell(Direction.UP).getRow();
//copying destination range
var destrange1 = "[Archive] Scorecard!" + (ArchiveSLast + 1) + ":" + (ArchiveSLast + DailySLast-8);
var destrange= dailySheet.getRange(destrange1);
// Clear the contents only if Underwriting sheet has more than 10 rows of data
if(DailySLast>10) {
//copying the data
var sourceDataValues = dailySheet.getRange(CopyRange).copyTo(destrange,SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
// Get the formulas from the sheet
var formulas = dailySheet.getRange(DelRange).getFormulas();
// Delete the data from the daily sheet
dailySheet.getRange(DelRange).clearContent();
//Put the formulas back in the sheet
dailySheet.getRange(DelRange).setFormulas(formulas)};
//Browser.msgBox(DailySLast, Browser.Buttons.OK_CANCEL);
}
function testquestion() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet1');
const rg = sh.getRange(sh.getLastRow()+1,1);
let r = rg.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(r),'Test');
}
如果电子表格底部没有可用的行,我会得到相同的结果
Execution log
3:44:46 PM Notice Execution started
3:44:46 PM Error
Exception: Invalid argument
testquestion @ ag1.gs:5
在本例中,getLastRow()1不存在,因为没有更多的行。
这样的事情可能会为您解决问题:
function testquestion() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet1');
//add this section to prevent error
let lr=sh.getLastRow();
let mr=sh.getMaxRows();
if(lr==mr) {
sh.insertRowAfter(mr);
}
//end of section
const rg = sh.getRange(sh.getLastRow()+1,1);
let r = rg.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(r),'Test');
}
更新:
function myFunction() {
// Get handles to Daily and Archive sheets
var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Scorecard');
var appendSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('[Archive] Scorecard');
//add this section to prevent error
let lr = sh.getLastRow();
let mr = sh.getMaxRows();
if (lr == mr) {
sh.insertRowAfter(mr);
}
//end of section
//get last row of the daily sheet
var Direction = SpreadsheetApp.Direction;
var DailySLast = sh.getRange("A" + (sh.getLastRow() + 1)).getNextDataCell(Direction.UP).getRow();
//Range of cells to be copied
var CopyRange = "Scorecard!9:" + DailySLast;
//Range of cells to be deleted
var DelRange = "Scorecard!9:" + 2000;
//get last row of the archive sheet
var ArchiveSLast = appendSheet.getRange("A" + (appendSheet.getLastRow() + 1)).getNextDataCell(Direction.UP).getRow();
//copying destination range
var destrange1 = "[Archive] Scorecard!" + (ArchiveSLast + 1) + ":" + (ArchiveSLast + DailySLast - 8);
var destrange = sh.getRange(destrange1);
// Clear the contents only if Underwriting sheet has more than 10 rows of data
if (DailySLast > 10) {
//copying the data
var sourceDataValues = sh.getRange(CopyRange).copyTo(destrange, SpreadsheetApp.CopyPasteType.PASTE_VALUES, false);
// Get the formulas from the sheet
var formulas = sh.getRange(DelRange).getFormulas();
// Delete the data from the daily sheet
sh.getRange(DelRange).clearContent();
//Put the formulas back in the sheet
sh.getRange(DelRange).setFormulas(formulas)
};
问题内容: 我需要列表的最后9个数字,而且我敢肯定有一种切片方法,但是我似乎无法理解。我可以这样获得前9个: 问题答案: 您可以在切片运算符中使用负整数。这是使用python CLI解释器的示例: 重要的是
问题内容: 什么是最好,最简单的方法?我的查询当前是: 但是,这显示前10行,而不显示最后10行。 编辑:我想要最后10行(这是,DESC做到这一点)但是,我希望它们以升序返回。 问题答案: 颠倒顺序(因此获得最后10个而不是前10个),请使用代替 编辑 根据您的评论:
我正试图按照google官方文档,在Python3中读取和写入不同表单的值。尽管我能够使用在下面提到的代码块中: 我试图从这里使用示例代码编写值: 我面临的问题是,我无法从官方文档中保留最新的表名或id,因为最新的api修订版正在随机生成gid(我们可能不知道表gid是什么)。是否有任何方法可以使用google sheet api v4引用工作表列表或电子表格最新修订的工作表名称或id?
问题内容: 我有一个包含800,000个没有主键的条目的表。我不允许添加主键,我无法按 TOP 1 .... ORDER BY DESC进行 排序, 因为完成此任务需要几个小时 。因此,我尝试了以下方法: 当然,这是行不通的。 无论如何要使用此代码或更好的代码来检索表中的最后一行? 问题答案: 我假设当您说“最后一行”时,您的意思是“最后创建的行”。 即使您具有主键,使用它来确定行的创建顺序仍然不
问题内容: 我有一个3D张量形状,其中第二维(即时间步长)未知。我使用以下代码段来处理此类输入: 实际上,以一些实际数字运行此代码后,我得到了一些合理的结果: 输出为: 有没有一种方法可以通过动态RNN的 最后一个相关输出 获得形状的3-D张量?谢谢! 问题答案: 这就是collect_nd的目的! 在您的情况下: 现在是维的张量。
问题内容: 我正在使用多视图索引来插入新闻详细信息。在第一个视图中,用户可以输入新闻的详细信息,然后单击下一步按钮将其插入db。第二个视图中,用户可以添加新闻的图像(仅允许3张图像), 我遇到的问题是,第一个视图将数据插入具有主键newsID的表dbo.newsdetail中,而第二个视图应使用刚刚添加到newsimages表中的新闻的newsId添加受尊重的图像。我只是不知道如何获取在第一个视图