停止脚本再次创建相同的文件 or/and 覆盖现有文件
Stop script from creating same file again or/and overwriting existing one
编辑
我把标题改成了更好的。
来自:停止脚本再次创建相同的文件
To: 停止脚本再次创建相同的文件 or/and 覆盖现有文件
在 Tanaike this post by Cooper and 的帮助下,我制作了一个这样的脚本。
问题
当我 运行 代码 1 次 AND 运行 AGAIN 又出现了另一个文件。
我怎样才能阻止这个?如果我已经有了第二个文件,我不希望脚本创建它。
function excel2SheetsAndSorting4LED(){
sta56160812();
loadSortSheetsInFolder();
}
// this from Tanaike
function sta56160812() {
// const folderId = "xxxxx"; // Please set the folder ID.
var sourceFldrId = "xxxxx"; // ID of SOURCE folder
var destinationFldrId = "zzzzz"; // ID of DESTINATION folder (can be the same folder)
const folder = DriveApp.getFolderById(sourceFldrId);
const files = folder.getFiles();
while(files.hasNext()) {
const file = files.next();
if (file.getMimeType() == MimeType.MICROSOFT_EXCEL || file.getMimeType() == MimeType.MICROSOFT_EXCEL_LEGACY) {
var name = file.getName().split('.')[0];
var resource = {
title: name + '_converted',
parents: [{id: destinationFldrId}],
mimeType: MimeType.GOOGLE_SHEETS
};
var spreadsheet = Drive.Files.copy(resource, file.getId());
// var sheet = SpreadsheetApp.openById(spreadsheet.id).getSheets()[0];
// var value = sheet.getDataRange().getValues();
// Logger.log(value)
}
}
}
// and this from Cooper:
function loadAndSortSpreadsheetsInFolder() {
const values = [
[1, 'where Col5<>0', "=COUNTA(K4:K)",'', "=COUNTA(M4:M)", "=COUNTA(N4:N)"],
[2, "=IF(K2=FALSE,,\" and Col5<=95\")", '', '', '', ''],
[3, "=QUERY(SORT({A3:B,C3:C+0,D3:D,E3:G+0,Y3:AF},3,0,5,1),J1&J2,1)", '', '', '', '']
];
const destinationFldrId = "zzzzz"; // ID of DESTINATION folder (can be the same folder) //
const fldr = DriveApp.getFolderById(destinationFldrId);
let files = fldr.getFilesByType(MimeType.GOOGLE_SHEETS);
while (files.hasNext()) {
let file = files.next();
let id = file.getId();
let ss = SpreadsheetApp.openById(id);
let sh = ss.getSheets()[0].copyTo(ss);
sh.setTabColor("ff0000");
ss.moveActiveSheet(1);
let rg1 = sh.getRange("I1:Y").clear();
let rg2 = sh.getRange(1, 9, values.length, values[0].length).setValues(values);
let rg3 = sh.getRange(2,11).insertCheckboxes();
}
}
而且脚本很慢,因为它首先创建所有文件然后写入它们。
我怎样才能让它在目标中创建,打开文件一次,写入,关闭,转到下一个?
谢谢。
我相信你的目标如下。
- 当你运行
sta56160812()
的功能时,当转换后的Spreadsheet的相同文件名存在时,你不想创建新的Google传播sheet.
- 您想在
sta56160812()
的函数中包含 loadAndSortSpreadsheetsInFolder()
的函数。
修改点:
- 在这种情况下,根据您的脚本,我建议检查目标文件夹中
var name = file.getName().split('.')[0] + '_converted'
的文件名。
- 根据你的问题,当目标文件夹中存在相同的文件名时,我不确定你想要做什么。所以在这个答案中,我想用
const file = files.next()
. 覆盖现有文件
- 为了在
sta56160812()
的函数中包含loadAndSortSpreadsheetsInFolder()
的函数,修改了sta56160812()
中的while循环
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
请修改您的sta56160812()
如下。
从:
while(files.hasNext()) {
const file = files.next();
if (file.getMimeType() == MimeType.MICROSOFT_EXCEL || file.getMimeType() == MimeType.MICROSOFT_EXCEL_LEGACY) {
var name = file.getName().split('.')[0];
var resource = {
title: name + '_converted',
parents: [{id: destinationFldrId}],
mimeType: MimeType.GOOGLE_SHEETS
};
var spreadsheet = Drive.Files.copy(resource, file.getId());
// var sheet = SpreadsheetApp.openById(spreadsheet.id).getSheets()[0];
// var value = sheet.getDataRange().getValues();
// Logger.log(value)
}
}
到:
while (files.hasNext()) {
const file = files.next();
if (file.getMimeType() == MimeType.MICROSOFT_EXCEL || file.getMimeType() == MimeType.MICROSOFT_EXCEL_LEGACY) {
var name = file.getName().split('.')[0] + '_converted';
var existingFile = DriveApp.getFilesByName(name);
var spreadsheetId;
if (existingFile.hasNext()) {
var id = existingFile.next().getId();
spreadsheetId = Drive.Files.update({}, id, file.getBlob()).id;
} else {
var resource = {
title: name,
parents: [{ id: destinationFldrId }],
mimeType: MimeType.GOOGLE_SHEETS
};
spreadsheetId = Drive.Files.copy(resource, file.getId()).id;
}
// Below script is from loadAndSortSpreadsheetsInFolder().
const values = [
[1, 'where Col5<>0', "=COUNTA(K4:K)",'', "=COUNTA(M4:M)", "=COUNTA(N4:N)"],
[2, "=IF(K2=FALSE,,\" and Col5<=95\")", '', '', '', ''],
[3, "=QUERY(SORT({A3:B,C3:C+0,D3:D,E3:G+0,Y3:AF},3,0,5,1),J1&J2,1)", '', '', '', '']
];
let ss = SpreadsheetApp.openById(spreadsheetId);
let sh = ss.getSheets()[0].copyTo(ss);
sh.setTabColor("ff0000");
ss.moveActiveSheet(1);
let rg1 = sh.getRange("I1:Y").clear();
let rg2 = sh.getRange(1, 9, values.length, values[0].length).setValues(values);
let rg3 = sh.getRange(2,11).insertCheckboxes();
}
}
- 并且,在此修改中,请从
excel2SheetsAndSorting4LED()
中删除 loadSortSheetsInFolder();
。
注:
- 如果您不想覆盖现有文件,请从上面修改的脚本中删除
var id = existingFile.next().getId();
和 spreadsheet = Drive.Files.update({}, id, file.getBlob());
。
- 此修改后的脚本假定在您的环境中,驱动器 API 已在高级 Google 服务中启用。请注意这一点。
参考:
已添加 1 个:
根据您的以下回复,
I am very sorry for the confusion. My english also are not very good (I hope is better when I have more time to think). Stop the script from creating the same file again AND also NOT overwrite existing converted file with same name is the more detailed question. Like before script: Source folder= file01.xlsx, file02.xlsx. Destination folder= file01_converted, file03, file04. After script: Destination folder: file01_converted (old file), file02_converted (new file), file03, file04. I hope I make it clear now and sorry again for the confusion. Thank you @Tanaike
在上述情况下,我了解到 file01_converted (old file)
的 (old file)
和 file02_converted (new file)
的 (new file)
不包含在文件名中。如果我的理解是正确的,在这种情况下,我认为删除 if 语句中的脚本 when existingFile.hasNext()
是合适的。修改后的脚本如下
修改后的脚本:
请修改您的sta56160812()
如下。
从:
while(files.hasNext()) {
const file = files.next();
if (file.getMimeType() == MimeType.MICROSOFT_EXCEL || file.getMimeType() == MimeType.MICROSOFT_EXCEL_LEGACY) {
var name = file.getName().split('.')[0];
var resource = {
title: name + '_converted',
parents: [{id: destinationFldrId}],
mimeType: MimeType.GOOGLE_SHEETS
};
var spreadsheet = Drive.Files.copy(resource, file.getId());
// var sheet = SpreadsheetApp.openById(spreadsheet.id).getSheets()[0];
// var value = sheet.getDataRange().getValues();
// Logger.log(value)
}
}
到:
while (files.hasNext()) {
const file = files.next();
if (file.getMimeType() == MimeType.MICROSOFT_EXCEL || file.getMimeType() == MimeType.MICROSOFT_EXCEL_LEGACY) {
var name = file.getName().split('.')[0] + '_converted';
var existingFile = DriveApp.getFilesByName(name);
if (!existingFile.hasNext()) {
var resource = {
title: name,
parents: [{ id: destinationFldrId }],
mimeType: MimeType.GOOGLE_SHEETS
};
var spreadsheetId = Drive.Files.copy(resource, file.getId()).id;
// Below script is from loadAndSortSpreadsheetsInFolder().
const values = [
[1, 'where Col5<>0', "=COUNTA(K4:K)",'', "=COUNTA(M4:M)", "=COUNTA(N4:N)"],
[2, "=IF(K2=FALSE,,\" and Col5<=95\")", '', '', '', ''],
[3, "=QUERY(SORT({A3:B,C3:C+0,D3:D,E3:G+0,Y3:AF},3,0,5,1),J1&J2,1)", '', '', '', '']
];
let ss = SpreadsheetApp.openById(spreadsheetId);
let sh = ss.getSheets()[0].copyTo(ss);
sh.setTabColor("ff0000");
ss.moveActiveSheet(1);
let rg1 = sh.getRange("I1:Y").clear();
let rg2 = sh.getRange(1, 9, values.length, values[0].length).setValues(values);
let rg3 = sh.getRange(2,11).insertCheckboxes();
}
}
}
- 在这种情况下,当目标文件夹中存在相同的文件名时,
if (!existingFile.hasNext()) {}
的脚本不是 运行。
添加了 2 个:
根据您的以下回复,
Beautiful. Can you add the last thing from here? How can I move new tab ss.getSheets()[0].copyTo(ss) from 2nd tab position to first?
示例脚本:
将 ss.getSheets()[0].copyTo(ss)
创建的新 sheet 移动到第一个选项卡的简单示例脚本如下。
function myFunction() {
const ss = SpreadsheetApp.openById("###"); // or .getActiveSpreadsheet();
const newSheet = ss.getSheets()[0].copyTo(ss);
ss.setActiveSheet(newSheet);
ss.moveActiveSheet(0);
}
编辑
我把标题改成了更好的。
来自:停止脚本再次创建相同的文件
To: 停止脚本再次创建相同的文件 or/and 覆盖现有文件
在 Tanaike this post by Cooper and
问题
当我 运行 代码 1 次 AND 运行 AGAIN 又出现了另一个文件。
我怎样才能阻止这个?如果我已经有了第二个文件,我不希望脚本创建它。
function excel2SheetsAndSorting4LED(){
sta56160812();
loadSortSheetsInFolder();
}
// this from Tanaike
function sta56160812() {
// const folderId = "xxxxx"; // Please set the folder ID.
var sourceFldrId = "xxxxx"; // ID of SOURCE folder
var destinationFldrId = "zzzzz"; // ID of DESTINATION folder (can be the same folder)
const folder = DriveApp.getFolderById(sourceFldrId);
const files = folder.getFiles();
while(files.hasNext()) {
const file = files.next();
if (file.getMimeType() == MimeType.MICROSOFT_EXCEL || file.getMimeType() == MimeType.MICROSOFT_EXCEL_LEGACY) {
var name = file.getName().split('.')[0];
var resource = {
title: name + '_converted',
parents: [{id: destinationFldrId}],
mimeType: MimeType.GOOGLE_SHEETS
};
var spreadsheet = Drive.Files.copy(resource, file.getId());
// var sheet = SpreadsheetApp.openById(spreadsheet.id).getSheets()[0];
// var value = sheet.getDataRange().getValues();
// Logger.log(value)
}
}
}
// and this from Cooper:
function loadAndSortSpreadsheetsInFolder() {
const values = [
[1, 'where Col5<>0', "=COUNTA(K4:K)",'', "=COUNTA(M4:M)", "=COUNTA(N4:N)"],
[2, "=IF(K2=FALSE,,\" and Col5<=95\")", '', '', '', ''],
[3, "=QUERY(SORT({A3:B,C3:C+0,D3:D,E3:G+0,Y3:AF},3,0,5,1),J1&J2,1)", '', '', '', '']
];
const destinationFldrId = "zzzzz"; // ID of DESTINATION folder (can be the same folder) //
const fldr = DriveApp.getFolderById(destinationFldrId);
let files = fldr.getFilesByType(MimeType.GOOGLE_SHEETS);
while (files.hasNext()) {
let file = files.next();
let id = file.getId();
let ss = SpreadsheetApp.openById(id);
let sh = ss.getSheets()[0].copyTo(ss);
sh.setTabColor("ff0000");
ss.moveActiveSheet(1);
let rg1 = sh.getRange("I1:Y").clear();
let rg2 = sh.getRange(1, 9, values.length, values[0].length).setValues(values);
let rg3 = sh.getRange(2,11).insertCheckboxes();
}
}
而且脚本很慢,因为它首先创建所有文件然后写入它们。
我怎样才能让它在目标中创建,打开文件一次,写入,关闭,转到下一个?
谢谢。
我相信你的目标如下。
- 当你运行
sta56160812()
的功能时,当转换后的Spreadsheet的相同文件名存在时,你不想创建新的Google传播sheet. - 您想在
sta56160812()
的函数中包含loadAndSortSpreadsheetsInFolder()
的函数。
修改点:
- 在这种情况下,根据您的脚本,我建议检查目标文件夹中
var name = file.getName().split('.')[0] + '_converted'
的文件名。 - 根据你的问题,当目标文件夹中存在相同的文件名时,我不确定你想要做什么。所以在这个答案中,我想用
const file = files.next()
. 覆盖现有文件
- 为了在
sta56160812()
的函数中包含loadAndSortSpreadsheetsInFolder()
的函数,修改了sta56160812()
中的while循环
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
请修改您的sta56160812()
如下。
while(files.hasNext()) {
const file = files.next();
if (file.getMimeType() == MimeType.MICROSOFT_EXCEL || file.getMimeType() == MimeType.MICROSOFT_EXCEL_LEGACY) {
var name = file.getName().split('.')[0];
var resource = {
title: name + '_converted',
parents: [{id: destinationFldrId}],
mimeType: MimeType.GOOGLE_SHEETS
};
var spreadsheet = Drive.Files.copy(resource, file.getId());
// var sheet = SpreadsheetApp.openById(spreadsheet.id).getSheets()[0];
// var value = sheet.getDataRange().getValues();
// Logger.log(value)
}
}
到:
while (files.hasNext()) {
const file = files.next();
if (file.getMimeType() == MimeType.MICROSOFT_EXCEL || file.getMimeType() == MimeType.MICROSOFT_EXCEL_LEGACY) {
var name = file.getName().split('.')[0] + '_converted';
var existingFile = DriveApp.getFilesByName(name);
var spreadsheetId;
if (existingFile.hasNext()) {
var id = existingFile.next().getId();
spreadsheetId = Drive.Files.update({}, id, file.getBlob()).id;
} else {
var resource = {
title: name,
parents: [{ id: destinationFldrId }],
mimeType: MimeType.GOOGLE_SHEETS
};
spreadsheetId = Drive.Files.copy(resource, file.getId()).id;
}
// Below script is from loadAndSortSpreadsheetsInFolder().
const values = [
[1, 'where Col5<>0', "=COUNTA(K4:K)",'', "=COUNTA(M4:M)", "=COUNTA(N4:N)"],
[2, "=IF(K2=FALSE,,\" and Col5<=95\")", '', '', '', ''],
[3, "=QUERY(SORT({A3:B,C3:C+0,D3:D,E3:G+0,Y3:AF},3,0,5,1),J1&J2,1)", '', '', '', '']
];
let ss = SpreadsheetApp.openById(spreadsheetId);
let sh = ss.getSheets()[0].copyTo(ss);
sh.setTabColor("ff0000");
ss.moveActiveSheet(1);
let rg1 = sh.getRange("I1:Y").clear();
let rg2 = sh.getRange(1, 9, values.length, values[0].length).setValues(values);
let rg3 = sh.getRange(2,11).insertCheckboxes();
}
}
- 并且,在此修改中,请从
excel2SheetsAndSorting4LED()
中删除loadSortSheetsInFolder();
。
注:
- 如果您不想覆盖现有文件,请从上面修改的脚本中删除
var id = existingFile.next().getId();
和spreadsheet = Drive.Files.update({}, id, file.getBlob());
。 - 此修改后的脚本假定在您的环境中,驱动器 API 已在高级 Google 服务中启用。请注意这一点。
参考:
已添加 1 个:
根据您的以下回复,
I am very sorry for the confusion. My english also are not very good (I hope is better when I have more time to think). Stop the script from creating the same file again AND also NOT overwrite existing converted file with same name is the more detailed question. Like before script: Source folder= file01.xlsx, file02.xlsx. Destination folder= file01_converted, file03, file04. After script: Destination folder: file01_converted (old file), file02_converted (new file), file03, file04. I hope I make it clear now and sorry again for the confusion. Thank you @Tanaike
在上述情况下,我了解到 file01_converted (old file)
的 (old file)
和 file02_converted (new file)
的 (new file)
不包含在文件名中。如果我的理解是正确的,在这种情况下,我认为删除 if 语句中的脚本 when existingFile.hasNext()
是合适的。修改后的脚本如下
修改后的脚本:
请修改您的sta56160812()
如下。
while(files.hasNext()) {
const file = files.next();
if (file.getMimeType() == MimeType.MICROSOFT_EXCEL || file.getMimeType() == MimeType.MICROSOFT_EXCEL_LEGACY) {
var name = file.getName().split('.')[0];
var resource = {
title: name + '_converted',
parents: [{id: destinationFldrId}],
mimeType: MimeType.GOOGLE_SHEETS
};
var spreadsheet = Drive.Files.copy(resource, file.getId());
// var sheet = SpreadsheetApp.openById(spreadsheet.id).getSheets()[0];
// var value = sheet.getDataRange().getValues();
// Logger.log(value)
}
}
到:
while (files.hasNext()) {
const file = files.next();
if (file.getMimeType() == MimeType.MICROSOFT_EXCEL || file.getMimeType() == MimeType.MICROSOFT_EXCEL_LEGACY) {
var name = file.getName().split('.')[0] + '_converted';
var existingFile = DriveApp.getFilesByName(name);
if (!existingFile.hasNext()) {
var resource = {
title: name,
parents: [{ id: destinationFldrId }],
mimeType: MimeType.GOOGLE_SHEETS
};
var spreadsheetId = Drive.Files.copy(resource, file.getId()).id;
// Below script is from loadAndSortSpreadsheetsInFolder().
const values = [
[1, 'where Col5<>0', "=COUNTA(K4:K)",'', "=COUNTA(M4:M)", "=COUNTA(N4:N)"],
[2, "=IF(K2=FALSE,,\" and Col5<=95\")", '', '', '', ''],
[3, "=QUERY(SORT({A3:B,C3:C+0,D3:D,E3:G+0,Y3:AF},3,0,5,1),J1&J2,1)", '', '', '', '']
];
let ss = SpreadsheetApp.openById(spreadsheetId);
let sh = ss.getSheets()[0].copyTo(ss);
sh.setTabColor("ff0000");
ss.moveActiveSheet(1);
let rg1 = sh.getRange("I1:Y").clear();
let rg2 = sh.getRange(1, 9, values.length, values[0].length).setValues(values);
let rg3 = sh.getRange(2,11).insertCheckboxes();
}
}
}
- 在这种情况下,当目标文件夹中存在相同的文件名时,
if (!existingFile.hasNext()) {}
的脚本不是 运行。
添加了 2 个:
根据您的以下回复,
Beautiful. Can you add the last thing from here? How can I move new tab ss.getSheets()[0].copyTo(ss) from 2nd tab position to first?
示例脚本:
将 ss.getSheets()[0].copyTo(ss)
创建的新 sheet 移动到第一个选项卡的简单示例脚本如下。
function myFunction() {
const ss = SpreadsheetApp.openById("###"); // or .getActiveSpreadsheet();
const newSheet = ss.getSheets()[0].copyTo(ss);
ss.setActiveSheet(newSheet);
ss.moveActiveSheet(0);
}