将价差 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);
}
但是我有两个问题:
- 我无法将它与使用 IMPORT-AGE 的 sheet 一起使用。
- 我不想获得主动点差sheet,而是想使用 sheet 的 ID,但我不确定该怎么做。
解释:
很遗憾:
importranges
不能以编程方式允许。因此,您需要设置从源 spreadsheet 获取值并将它们粘贴到新创建的(目标)spreadsheet.
copyTo
不能在两个不同的spreadsheet之间使用,所以可以用getValues
和setValues
代替。
逻辑是遍历源 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();
})
我正在尝试使用 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);
}
但是我有两个问题:
- 我无法将它与使用 IMPORT-AGE 的 sheet 一起使用。
- 我不想获得主动点差sheet,而是想使用 sheet 的 ID,但我不确定该怎么做。
解释:
很遗憾:
importranges
不能以编程方式允许。因此,您需要设置从源 spreadsheet 获取值并将它们粘贴到新创建的(目标)spreadsheet.copyTo
不能在两个不同的spreadsheet之间使用,所以可以用getValues
和setValues
代替。逻辑是遍历源 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();
})