Apps 脚本 - 从电子表格中导出 JSON- 文件并替换旧文件

Apps script - export JSON-file from spreadsheet with replacement old file

我的脚本需要一些帮助,我是通过互联网帮助编写的。

我将数据从电子表格导出到 json-文件并将其保存在 google- 驱动器上,但每个新文件都不会替换旧文件。脚本创建以新文件名 (1)、(2) 等结尾的新文件:

很高兴得到您的帮助!谢谢朋友们!))

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);
      }
    

参考文献: