如何避免 Google Sheets + Google Forms 添加行和破坏公式?

问题描述 投票:0回答:1

我注意到正在发生的一件事,这是由于谷歌表单的工作方式造成的。在同一工作簿中,我有一个名为 Test 的工作表,它是来自链接的谷歌表单的表单响应表,还有另一个名为 pedidos 的工作表,这是我从测试中查询数据的工作表,以便我可以在该工作表上添加公式。该脚本每天运行,因此我可以在这些工作表上获得干净的每日数据,因为这些数据仅在当天有用。我在 pedidos 表上有一个查询公式“=QUERY(Test!A2:X100)”在 b2 单元格上,当我在 pedidos 表上运行此脚本并且 google 表单再次运行时,pedidos 表中的公式更改为“=QUERY” (Test!A3:X100)”,但是测试表中的数据一直在 Test!a2 上开始,我认为这是因为在测试表中,当 google 表单添加数据时,它会添加一行,并且该行为反映在 pedidos 表上,在所以改变pedidos表上的公式,有没有办法可以避免这种情况发生,这样就不会破坏公式?我可以在这个脚本中添加一些东西来保持“=QUERY(Test!A2:X100)”完整吗?

提前感谢您对此提供的任何帮助。

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(), "dd-MM-yyyy");
  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 B & row 2
  pedidosSheet.getRange(2,3,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();
}
google-sheets scripting google-forms
1个回答
0
投票

对于这种特殊情况,您可以通过使用indirect() 代替当前的查询公式来硬编码范围

A2:X100

=indirect("Test!A2:X100")
© www.soinside.com 2019 - 2024. All rights reserved.