将价差 sheet 值复制到新的 sheet 每月

Copying a spreadsheet values to a new sheet monthly

我正在尝试使用 Google 脚本编辑器为我的传播sheet 创建备份功能, 我正在使用我在 Github:

中找到的以下代码
function makeCopy(){

 var formattedDate= Utilities.formatDate(new Date(),"GMT","yy:mm:dd''HH:mm:ss");

 var saveAs =  "Copy " + formattedDate;

 var destinationFolder = DriveApp.getFolderById("ID");

 DriveApp.getFileById(SpreadsheetApp.getActiveSpreadsheet().getId())
 .makeCopy(saveAs,destinationFolder);

 }

但是我有两个问题:

解释:

很遗憾:

  • importranges 不能以编程方式允许。因此,您需要设置从源 spreadsheet 获取值并将它们粘贴到新创建的(目标)spreadsheet.

  • copyTo不能在两个不同的spreadsheet之间使用,所以可以用getValuessetValues代替。

  • 逻辑是遍历源 sheets 并为每个 sheet 获取值并将它们复制到相应的目标 sheets.

补充修改点:

  • 在日期对象中,您指定了 "yy:mm:dd''HH:mm:ss"mm 给出了分钟。在第一组字符串中,我想你想得到月份,因此使用 MM 代替。还要检查有关日期的 official documentation

  • 而不是传递硬拷贝值 GMT 通过使用 getSpreadsheetTimeZone() 获取您的传播sheet 文件的时区。

通过上述修改,您得到:

const formattedDate = Utilities.formatDate(new Date(),source_ss.getSpreadsheetTimeZone(),"yy:MM:dd''HH:mm:ss");

解决方案:

function makeCopy() {
  const source_id = "SpreadsheetID"; // add the id of the spreadsheet to copy
  const source_ss = SpreadsheetApp.openById(source_id);
  const formattedDate = Utilities.formatDate(new Date(),source_ss.getSpreadsheetTimeZone(),"yy:MM:dd''HH:mm:ss");
  const saveAs =  "Copy " + formattedDate;
  const destFolder = DriveApp.getFolderById("FolderID"); // add the destination folder ID
  const file = DriveApp.getFileById(source_id).makeCopy(saveAs, destFolder);
  const target_ss = SpreadsheetApp.openById(file.getId());
  const source_sheets = source_ss.getSheets();
  const target_sheets = target_ss.getSheets();
  source_sheets.forEach((sh,i)=>{
     let values = sh.getDataRange().getValues();
     target_sheets[i].getRange(1,1,values.length,values[0].length).setValues(values);
     SpreadsheetApp.flush();
  })
}

我相信 soMario 的回答是正确的,但我认为您不需要在最后进行所有复制...

function makeCopy(source_ID) {

  // const source_id = "SpreadsheetID"; (pass the ID via a function?)

  const source_ss = SpreadsheetApp.openById(source_ID);
  const formattedDate = Utilities.formatDate(new Date(),source_ss.getSpreadsheetTimeZone(),"yy:MM:dd''HH:mm:ss");
  const saveAs =  "Copy " + formattedDate;
  const destFolder = DriveApp.getFolderById("FolderID"); // add the destination folder ID
  const file = DriveApp.getFileById(source_id).makeCopy(saveAs, destFolder);
  
  // You may want to do something with the new file's ID (like save the ID somewhere on the sheet you called this from
  // Logger.Log(file.id);
}

我很确定这不会产生任何效果:

  const target_ss = SpreadsheetApp.openById(file.getId());
  const source_sheets = source_ss.getSheets();
  const target_sheets = target_ss.getSheets();
  source_sheets.forEach((sh,i)=>{
     let values = sh.getDataRange().getValues();
     target_sheets[i].getRange(1,1,values.length,values[0].length).setValues(values);
     SpreadsheetApp.flush();
  })