从电子表格复制到另一个具有动态标题的电子表格

copy from spreadsheet to another spreadsheet with dynamic title

我目前正在做一个项目,我需要将数据从一个特定的 sheet 中的一个跨页 sheet 复制到另一个带有动态标题的跨页sheet ( text有日期)。 使用 ID 或名称移动数据是可以的,但使用新创建的 spreadsheet 似乎很麻烦。 所有功能都将在同一个应用程序脚本中: 创建 复制

function titleAsDate() {

  var currentDate = Utilities.formatDate(new Date(), "GMT+8", "dd-MM-yyyy HH:mm:ss")
  SpreadsheetApp.create("Report of the " + currentDate)
}

function copyWithValues() {
  let spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  let sourceSheet = spreadSheet.getSheetByName('Sources');
  
  let sourceRange = sourceSheet.getDataRange();
  let sourceValues = sourceRange.getValues();
  
  let rowCount = sourceValues.length;
  let columnCount = sourceValues[0].length;
  
  let targetSheet = spreadSheet.getSheetById('Target');
  let targetRange = targetSheet.getRange(1, 1, rowCount, columnCount);
  
  targetRange.setValues(sourceValues);
}

解释:

  • SpreadsheetApp.create(name) returns a spreadsheet 对象所以你可以直接使用这个函数的输出而不需要额外的代码。

  • 新生成的 spreadsheet 将有一个 sheet,名称为 Sheet1,就像您手动创建新的 spreadsheet 文件一样。因此,您可以使用 sheet.setName(name) function to change the name of the sheet to Target. Also this function returns a sheet 对象 (targetSheet),该对象随后可用于设置值。

解决方案:

这是一个函数中的所有代码:

function copyWithValues() {
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const sourceSheet = spreadSheet.getSheetByName('Sources');
  const sourceRange = sourceSheet.getDataRange();
  const sourceValues = sourceRange.getValues();
  
  const currentDate = Utilities.formatDate(new Date(), "GMT+8", "dd-MM-yyyy HH:mm:ss"); // new code
  const targetSpreadsheet = SpreadsheetApp.create("Report of the " + currentDate); // new code
  
  let rowCount = sourceValues.length;
  let columnCount = sourceValues[0].length;
  
  let targetSheet = targetSpreadsheet.getSheetByName('Sheet1').setName("Target"); // new code
  let targetRange = targetSheet.getRange(1, 1, rowCount, columnCount);
  
  targetRange.setValues(sourceValues);
}

如果你想使用titleAsDate作为一个辅助函数,它会被copyWithValues调用,那么你可以使用这段代码并且只执行copyWithValues:

// helper function, used by copyWithValues
function titleAsDate() {
  const currentDate = Utilities.formatDate(new Date(), "GMT+8", "dd-MM-yyyy HH:mm:ss");
  return SpreadsheetApp.create("Report of the " + currentDate); // new code
}

// main function, you should execute this function
function copyWithValues() {
  const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  const sourceSheet = spreadSheet.getSheetByName('Sources');
  const sourceRange = sourceSheet.getDataRange();
  const sourceValues = sourceRange.getValues();
  
  const targetSpreadsheet = titleAsDate(); // new code
  
  let rowCount = sourceValues.length;
  let columnCount = sourceValues[0].length;
  
  let targetSheet = targetSpreadsheet.getSheetByName('Sheet1').setName("Target"); // new code
  let targetRange = targetSheet.getRange(1, 1, rowCount, columnCount);
  
  targetRange.setValues(sourceValues);
}