我陷入了一个非常烦人的情况,我有一个用于谷歌表格的脚本,我们在工作簿中的其他几张表格中有两张表格,该脚本会将一张表格“Pedidos”作为 Excel 文件通过电子邮件发送,然后删除行在“Pedidos”和“Test”中,在“Test”中它删除标题下方的所有行,而“Pedidos”它应该删除A列和标题之后的所有行,我这样做是因为在“Pedidos”的A列中我有一个我不想删除的公式,因此它保留在 A 列的所有单元格中以供将来使用。该脚本设置为周二至周五晚上 8:30 运行。一切正常,除了当我运行它时,它会继续并删除“Pedidos”表中的上述 A 列,其中公式应该保留。任何帮助将不胜感激!这是我正在使用的脚本:
function sendExcelAndDeleteRows() {
var spreadsheetId = "####"; //
var emailAddress = "###"; //
var subject = "Excel Sheet - Pedidos";
var message = "Please find attached the Excel sheet for Pedidos.";
// Export Pedidos sheet to Excel format
var pedidosSheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName("Pedidos");
var pedidosDataRange = pedidosSheet.getDataRange();
var pedidosValues = pedidosDataRange.getValues();
var pedidosHeader = pedidosValues[0];
var pedidosNewRange = pedidosSheet.getRange(1, 2, 1, pedidosHeader.length - 1);
pedidosNewRange.setValues([pedidosHeader.slice(1)]);
var dateToday = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd");
var pedidosFileName = "Pedidos_" + dateToday + ".xlsx";
var pedidosFile = DriveApp.createFile(pedidosFileName, pedidosDataRange.getValues(), MimeType.MICROSOFT_EXCEL);
MailApp.sendEmail(emailAddress, subject, message, {attachments: [pedidosFile]});
// Delete rows after row 1 in Test sheet
var testSheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName("Test");
testSheet.deleteRows(2, testSheet.getLastRow() - 1);
// Delete rows after column A in Pedidos sheet
var lastColumn = pedidosSheet.getLastColumn();
var lastRow = pedidosSheet.getLastRow();
if (lastColumn > 1) {
pedidosSheet.deleteColumns(2, lastColumn - 1);
}
pedidosSheet.deleteRows(2, lastRow - 1);
// Delete the temporary file
pedidosFile.setTrashed(true);
}
function createTrigger() {
ScriptApp.newTrigger('sendExcelAndDeleteRows')
.timeBased()
.onWeekDay(ScriptApp.WeekDay.TUESDAY, ScriptApp.WeekDay.WEDNESDAY, ScriptApp.WeekDay.THURSDAY, ScriptApp.WeekDay.FRIDAY)
.atHour(20)
.nearMinute(30)
.create();
}
您可以直接清除第 1 行和 A 列之后的数据范围的内容,而不是尝试删除列和行:
function sendExcelAndDeleteRows() {
var spreadsheetId = "####"; //
var emailAddress = "###"; //
var subject = "Excel Sheet - Pedidos";
var message = "Please find attached the Excel sheet for Pedidos.";
// Export Pedidos sheet to Excel format
var pedidosSheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName("Pedidos");
var pedidosDataRange = pedidosSheet.getDataRange();
var pedidosValues = pedidosDataRange.getValues();
var pedidosHeader = pedidosValues[0];
var pedidosNewRange = pedidosSheet.getRange(1, 2, 1, pedidosHeader.length - 1);
pedidosNewRange.setValues([pedidosHeader.slice(1)]);
var dateToday = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy-MM-dd");
var pedidosFileName = "Pedidos_" + dateToday + ".xlsx";
var pedidosFile = DriveApp.createFile(pedidosFileName, pedidosDataRange.getValues(), MimeType.MICROSOFT_EXCEL);
MailApp.sendEmail(emailAddress, subject, message, {attachments: [pedidosFile]});
// Delete rows after row 1 in Test sheet
var testSheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName("Test");
testSheet.deleteRows(2, testSheet.getLastRow() - 1);
// Get the last rows in the data range of Pedidos sheet
var lastColumn = pedidosDataRange.getLastColumn();
var lastRow = pedidosDataRange.getLastRow();
// Clear range after column A & row 1
pedidosSheet.getRange(2,2,lastRow,lastColumn).clearContent()
// Delete the temporary file
pedidosFile.setTrashed(true);
}
function createTrigger() {
ScriptApp.newTrigger('sendExcelAndDeleteRows')
.timeBased()
.onWeekDay(ScriptApp.WeekDay.TUESDAY, ScriptApp.WeekDay.WEDNESDAY, ScriptApp.WeekDay.THURSDAY, ScriptApp.WeekDay.FRIDAY)
.atHour(20)
.nearMinute(30)
.create();
}
现在我也注意到正在发生的事情。这是由于谷歌表单的工作方式造成的。测试表是一个表单响应表,pedidos 表是我在其中查询测试数据的表,以便我可以在该表上添加公式。现在,当我在pedidos表上运行此脚本时,查询公式“=QUERY(Test!A2:X100)”在脚本运行后位于b2上,它更改为“=QUERY(Test!A3:X100)”,我假设是因为在测试 cheet 中,当表单添加数据时,它会添加一行并反映在 pedidos 表上,有没有办法可以避免这种情况发生,这样就不会破坏公式?