Apps 脚本 - 从电子表格中导出 JSON- 文件并替换旧文件
Apps script - export JSON-file from spreadsheet with replacement old file
我的脚本需要一些帮助,我是通过互联网帮助编写的。
我将数据从电子表格导出到 json-文件并将其保存在 google- 驱动器上,但每个新文件都不会替换旧文件。脚本创建以新文件名 (1)、(2) 等结尾的新文件:
- exp_planning.json - 我需要这个文件
- exp_planning(1).json - 这个文件和其他我不需要的文件
很高兴得到您的帮助!谢谢朋友们!))
function convertSheet2JsonText(sheet) {
// first line(title)
var colStartIndex = 1;
var rowNum = 1;
var firstRange = sheet.getRange(1, 1, 1, 15);
var firstRowValues = firstRange.getValues();
var titleColumns = firstRowValues[0];
// after the second line(data)
var lastRow = sheet.getRange("A2:A").getValues().filter(String).length;
var rowValues = [];
for(var rowIndex = 2; rowIndex <= lastRow; rowIndex ++ ) {
var strRange = sheet.getRange(2, 1, rowIndex, 1).getValue();
if(strRange != "") {
var colStartIndex = 1;
var rowNum = 1;
var range = sheet.getRange(rowIndex, colStartIndex, rowNum, 15);
var values = range.getValues();
rowValues.push(values[0]);
}
}
// create json
var jsonArray = [];
for(var i=0; i<rowValues.length; i++) {
var line = rowValues[i];
var json = new Object();
for(var j=0; j<titleColumns.length; j++) {
json[titleColumns[j]] = line[j];
}
jsonArray.push(json);
}
//return jsonArray;
Logger.log(jsonArray);
var blob,file,fileSets,obj;
var folder = DriveApp.getFoldersByName('JSON_EXPFILES').next();
fileSets = {
title: 'exp_planning.json',
mimeType: 'application/json',
"parents": [
{
"id": folder.getId(),
"kind": "drive#parentReference"
}
]
};
blob = Utilities.newBlob(JSON.stringify(jsonArray), "application/vnd.google-apps.script+json");
file = Drive.Files.insert(fileSets, blob);
Logger.log('ID: %s, File size (bytes): %s, type: %s', file.id, file.fileSize, file.mimeType);
}
function doGet() {
var sheetName = "для ТК";
var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
var json = convertSheet2JsonText(sheet);
return ContentService
.createTextOutput(JSON.stringify(json))
.setMimeType(ContentService.MimeType.JSON);
}
我找到了一种在创建新文件之前删除旧文件的方法...
var allFiles = folder.getFilesByName(fileSets.title);
while (allFiles.hasNext()) {
file = allFiles.next();
file.getParents().next().removeFile(file);
}
但是否还有关于替换旧文件的其他信息?
我相信你的目标如下。
- 当您在特定文件夹中创建
exp_planning.json
的新文件时,您想要删除特定文件夹中的现有文件,这些文件具有相同的文件名。然后,您想在文件夹中创建新文件。
修改点:
- 在您的脚本中,使用
Drive.Files.insert()
将 exp_planning.json
的文件创建到特定文件夹。在这种情况下,将创建具有相同文件名的文件。因此,需要检查现有文件并创建新文件。但是,当我看到 I found one way with deleting old file before creating new...
的脚本时,使用了 Class 文件夹的 removeFile
。这已用于从当前文件夹中删除给定的文件。在当前阶段,此方法已被弃用。 Ref
- 如果要删除文件,可以使用Class文件的
setTrashed
或Drive API. 中的“Files:delete”方法
- 而且,在
blob = Utilities.newBlob(JSON.stringify(jsonArray), "application/vnd.google-apps.script+json");
,当你想给mimeType时,请使用application/json
。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
从:
var folder = DriveApp.getFoldersByName('JSON_EXPFILES').next();
fileSets = {
title: 'exp_planning.json',
mimeType: 'application/json',
"parents": [
{
"id": folder.getId(),
"kind": "drive#parentReference"
}
]
};
blob = Utilities.newBlob(JSON.stringify(jsonArray), "application/vnd.google-apps.script+json");
file = Drive.Files.insert(fileSets, blob);
到:
var folder = DriveApp.getFoldersByName('JSON_EXPFILES').next();
var filename = 'exp_planning.json';
var files = DriveApp.getFilesByName(filename);
while (files.hasNext()) {
files.next().setTrashed(true);
}
// Drive.Files.emptyTrash(); // If you want to empty the trash box, you can also use this. But when you use this, please be careful this.
fileSets = {
title: filename,
mimeType: 'application/json',
"parents": [
{
"id": folder.getId(),
"kind": "drive#parentReference"
}
]
};
blob = Utilities.newBlob(JSON.stringify(jsonArray), 'application/json');
file = Drive.Files.insert(fileSets, blob);
- 如果要清空垃圾箱,也可以使用
Drive.Files.emptyTrash()
。但是大家在使用的时候,请注意这一点。
注:
在此修改后的脚本中,它假定 jsonArray
是您期望的正确值。请注意这一点。
当您要覆盖exp_planning.json
的现有文件时,请修改上面的“From:”脚本如下。在这个修改中,当文件存在时,文件被blob
覆盖,使用“Files:update”的方法。 Ref
var folder = DriveApp.getFoldersByName('JSON_EXPFILES').next();
var filename = 'exp_planning.json';
var files = DriveApp.getFilesByName(filename);
blob = Utilities.newBlob(JSON.stringify(jsonArray), 'application/json');
if (files.hasNext()) {
file = Drive.Files.update({}, files.next().getId(), blob);
// or DriveApp.getFileById(files.next().getId()).setContent(JSON.stringify(jsonArray));
} else {
fileSets = {
title: filename,
mimeType: 'application/json',
"parents": [
{
"id": folder.getId(),
"kind": "drive#parentReference"
}
]
};
file = Drive.Files.insert(fileSets, blob);
}
参考文献:
我的脚本需要一些帮助,我是通过互联网帮助编写的。
我将数据从电子表格导出到 json-文件并将其保存在 google- 驱动器上,但每个新文件都不会替换旧文件。脚本创建以新文件名 (1)、(2) 等结尾的新文件:
- exp_planning.json - 我需要这个文件
- exp_planning(1).json - 这个文件和其他我不需要的文件
很高兴得到您的帮助!谢谢朋友们!))
function convertSheet2JsonText(sheet) {
// first line(title)
var colStartIndex = 1;
var rowNum = 1;
var firstRange = sheet.getRange(1, 1, 1, 15);
var firstRowValues = firstRange.getValues();
var titleColumns = firstRowValues[0];
// after the second line(data)
var lastRow = sheet.getRange("A2:A").getValues().filter(String).length;
var rowValues = [];
for(var rowIndex = 2; rowIndex <= lastRow; rowIndex ++ ) {
var strRange = sheet.getRange(2, 1, rowIndex, 1).getValue();
if(strRange != "") {
var colStartIndex = 1;
var rowNum = 1;
var range = sheet.getRange(rowIndex, colStartIndex, rowNum, 15);
var values = range.getValues();
rowValues.push(values[0]);
}
}
// create json
var jsonArray = [];
for(var i=0; i<rowValues.length; i++) {
var line = rowValues[i];
var json = new Object();
for(var j=0; j<titleColumns.length; j++) {
json[titleColumns[j]] = line[j];
}
jsonArray.push(json);
}
//return jsonArray;
Logger.log(jsonArray);
var blob,file,fileSets,obj;
var folder = DriveApp.getFoldersByName('JSON_EXPFILES').next();
fileSets = {
title: 'exp_planning.json',
mimeType: 'application/json',
"parents": [
{
"id": folder.getId(),
"kind": "drive#parentReference"
}
]
};
blob = Utilities.newBlob(JSON.stringify(jsonArray), "application/vnd.google-apps.script+json");
file = Drive.Files.insert(fileSets, blob);
Logger.log('ID: %s, File size (bytes): %s, type: %s', file.id, file.fileSize, file.mimeType);
}
function doGet() {
var sheetName = "для ТК";
var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
var json = convertSheet2JsonText(sheet);
return ContentService
.createTextOutput(JSON.stringify(json))
.setMimeType(ContentService.MimeType.JSON);
}
我找到了一种在创建新文件之前删除旧文件的方法...
var allFiles = folder.getFilesByName(fileSets.title);
while (allFiles.hasNext()) {
file = allFiles.next();
file.getParents().next().removeFile(file);
}
但是否还有关于替换旧文件的其他信息?
我相信你的目标如下。
- 当您在特定文件夹中创建
exp_planning.json
的新文件时,您想要删除特定文件夹中的现有文件,这些文件具有相同的文件名。然后,您想在文件夹中创建新文件。
修改点:
- 在您的脚本中,使用
Drive.Files.insert()
将exp_planning.json
的文件创建到特定文件夹。在这种情况下,将创建具有相同文件名的文件。因此,需要检查现有文件并创建新文件。但是,当我看到I found one way with deleting old file before creating new...
的脚本时,使用了 Class 文件夹的removeFile
。这已用于从当前文件夹中删除给定的文件。在当前阶段,此方法已被弃用。 Ref - 如果要删除文件,可以使用Class文件的
setTrashed
或Drive API. 中的“Files:delete”方法
- 而且,在
blob = Utilities.newBlob(JSON.stringify(jsonArray), "application/vnd.google-apps.script+json");
,当你想给mimeType时,请使用application/json
。
当以上几点反映到你的脚本中,就会变成下面这样。
修改后的脚本:
从:var folder = DriveApp.getFoldersByName('JSON_EXPFILES').next();
fileSets = {
title: 'exp_planning.json',
mimeType: 'application/json',
"parents": [
{
"id": folder.getId(),
"kind": "drive#parentReference"
}
]
};
blob = Utilities.newBlob(JSON.stringify(jsonArray), "application/vnd.google-apps.script+json");
file = Drive.Files.insert(fileSets, blob);
到:
var folder = DriveApp.getFoldersByName('JSON_EXPFILES').next();
var filename = 'exp_planning.json';
var files = DriveApp.getFilesByName(filename);
while (files.hasNext()) {
files.next().setTrashed(true);
}
// Drive.Files.emptyTrash(); // If you want to empty the trash box, you can also use this. But when you use this, please be careful this.
fileSets = {
title: filename,
mimeType: 'application/json',
"parents": [
{
"id": folder.getId(),
"kind": "drive#parentReference"
}
]
};
blob = Utilities.newBlob(JSON.stringify(jsonArray), 'application/json');
file = Drive.Files.insert(fileSets, blob);
- 如果要清空垃圾箱,也可以使用
Drive.Files.emptyTrash()
。但是大家在使用的时候,请注意这一点。
注:
在此修改后的脚本中,它假定
jsonArray
是您期望的正确值。请注意这一点。当您要覆盖
exp_planning.json
的现有文件时,请修改上面的“From:”脚本如下。在这个修改中,当文件存在时,文件被blob
覆盖,使用“Files:update”的方法。 Refvar folder = DriveApp.getFoldersByName('JSON_EXPFILES').next(); var filename = 'exp_planning.json'; var files = DriveApp.getFilesByName(filename); blob = Utilities.newBlob(JSON.stringify(jsonArray), 'application/json'); if (files.hasNext()) { file = Drive.Files.update({}, files.next().getId(), blob); // or DriveApp.getFileById(files.next().getId()).setContent(JSON.stringify(jsonArray)); } else { fileSets = { title: filename, mimeType: 'application/json', "parents": [ { "id": folder.getId(), "kind": "drive#parentReference" } ] }; file = Drive.Files.insert(fileSets, blob); }