如何删除表单输入数据中的旧行
How to Delete older rows on Form input data
我在 Google 工作簿中有 2 张纸。一个表单向Sheet2输入数据,Sheet1上的一个单元格显示Sheet2.Sheet2.
最后一行col B中单元格的值
Sheet2:
1 Timestamp | UUID:
2 SomeDate1 | 0d6d7761-8540-1c5a-072b-f32868eb7f9b
3 SomeDate2 | d6b0df12-8dc9-eeff-5eef-ad064868fb31
4 SomeDate3 | a64ac46a-bb53-f540-f526-01cb48dac8f2
5 SomeDate4 | 826b3c6d-45cc-1b11-f2cd-e2a91eba091b
6 SomeDate5 | 00965bc4-77a1-aa87-52cd-ba11f472aa32
Sheet 1:
1 UUID: | =INDEX(FILTER(Sheet2!B1:B,NOT(ISBLANK(Sheet2!B1:B))),COUNTA(Sheet2!B1:B))
(which shows correctly as 00965bc4-77a1-aa87-52cd-ba11f472aa32)
当表单提交向 Sheet2 添加新行时,我需要以某种方式自动删除旧行。
在 StackExchange 上阅读了几页类似的问题后,我了解到脚本无法删除表单输入数据,但解决方法是使用时间驱动的触发器。 (How to delete row when a cell is modified?)
所以,我找到了这个脚本并添加了它,并将其命名为DeleteOldRows.gs:
function acraCleanup() {
var rowsToKeep = 2; //NUMBER OF ROWS TO KEEP
var rows = SpreadsheetApp.getActiveSheet().getLastRow();
var numToDelete = rows - rowsToKeep -1;
SpreadsheetApp.getActiveSheet().deleteRows(2, numToDelete);
}
然后我设置一个定时器触发器,运行那个脚本。
计时器执行日志显示错误“异常:那些行超出范围。在 acraCleanup(DeleteOldRows:5:33)”这将是“deleteRows(2, numToDelete)”
是脚本不对,还是表单输入数据导致的错误?
此外,我在工作簿中还有其他工作表和其他数据,我需要确保脚本只删除 Sheet2 上的旧行,但我不确定如何指定.我尝试将“getActiveSheet()”替换为“getSheetByName('Sheet2')”,但错误提示“getSheetByName 不是一个函数”。与“getSheet('Sheet2')”相同。
function deleteAllOldRows() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Form Responses 9');
const lr = sh.getLastRow();
if(lr - 2)sh.deleteRows(2,lr-2);
}
我不会按照你设置的方式处理这个问题。与其一直使用脚本 运行,我会限定您的表单范围以插入您在提交时收到的值,以不断覆盖同一行。
但是,如果您坚持按照您确定范围的方式进行操作,这将不断删除 1 到 3 或更多行之间的任何行,同时保留最后一行。
/**
* @OnlyCurrentDoc
*/
function acraCleanup() {
const rowsToKeep = 1; //NUMBER OF ROWS TO KEEP
const nameOfSheet = "Sheet2";
const theWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(nameOfSheet);
var rows = theWS.getLastRow();
var numToDelete = rows - rowsToKeep - 1;
theWS.deleteRows(2, numToDelete);
}
此外,您在 getActiveSheet()
上收到错误的原因是您没有指定 spreadsheet 文件。说实话,Google 应该摆脱这个,因为语言有点混乱,而且它不会增加太多的易用性。要正确识别 sheet,您需要:SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2")
我在 Google 工作簿中有 2 张纸。一个表单向Sheet2输入数据,Sheet1上的一个单元格显示Sheet2.Sheet2.
最后一行col B中单元格的值Sheet2:
1 Timestamp | UUID:
2 SomeDate1 | 0d6d7761-8540-1c5a-072b-f32868eb7f9b
3 SomeDate2 | d6b0df12-8dc9-eeff-5eef-ad064868fb31
4 SomeDate3 | a64ac46a-bb53-f540-f526-01cb48dac8f2
5 SomeDate4 | 826b3c6d-45cc-1b11-f2cd-e2a91eba091b
6 SomeDate5 | 00965bc4-77a1-aa87-52cd-ba11f472aa32
Sheet 1:
1 UUID: | =INDEX(FILTER(Sheet2!B1:B,NOT(ISBLANK(Sheet2!B1:B))),COUNTA(Sheet2!B1:B))
(which shows correctly as 00965bc4-77a1-aa87-52cd-ba11f472aa32)
当表单提交向 Sheet2 添加新行时,我需要以某种方式自动删除旧行。
在 StackExchange 上阅读了几页类似的问题后,我了解到脚本无法删除表单输入数据,但解决方法是使用时间驱动的触发器。 (How to delete row when a cell is modified?)
所以,我找到了这个脚本并添加了它,并将其命名为DeleteOldRows.gs:
function acraCleanup() {
var rowsToKeep = 2; //NUMBER OF ROWS TO KEEP
var rows = SpreadsheetApp.getActiveSheet().getLastRow();
var numToDelete = rows - rowsToKeep -1;
SpreadsheetApp.getActiveSheet().deleteRows(2, numToDelete);
}
然后我设置一个定时器触发器,运行那个脚本。
计时器执行日志显示错误“异常:那些行超出范围。在 acraCleanup(DeleteOldRows:5:33)”这将是“deleteRows(2, numToDelete)”
是脚本不对,还是表单输入数据导致的错误?
此外,我在工作簿中还有其他工作表和其他数据,我需要确保脚本只删除 Sheet2 上的旧行,但我不确定如何指定.我尝试将“getActiveSheet()”替换为“getSheetByName('Sheet2')”,但错误提示“getSheetByName 不是一个函数”。与“getSheet('Sheet2')”相同。
function deleteAllOldRows() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Form Responses 9');
const lr = sh.getLastRow();
if(lr - 2)sh.deleteRows(2,lr-2);
}
我不会按照你设置的方式处理这个问题。与其一直使用脚本 运行,我会限定您的表单范围以插入您在提交时收到的值,以不断覆盖同一行。
但是,如果您坚持按照您确定范围的方式进行操作,这将不断删除 1 到 3 或更多行之间的任何行,同时保留最后一行。
/**
* @OnlyCurrentDoc
*/
function acraCleanup() {
const rowsToKeep = 1; //NUMBER OF ROWS TO KEEP
const nameOfSheet = "Sheet2";
const theWS = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(nameOfSheet);
var rows = theWS.getLastRow();
var numToDelete = rows - rowsToKeep - 1;
theWS.deleteRows(2, numToDelete);
}
此外,您在 getActiveSheet()
上收到错误的原因是您没有指定 spreadsheet 文件。说实话,Google 应该摆脱这个,因为语言有点混乱,而且它不会增加太多的易用性。要正确识别 sheet,您需要:SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2")