Создать резервную копию таблицы со значениями и форматом только в указанной подпапке c - PullRequest
0 голосов
/ 13 января 2020

Я пытался объединить два сценария, чтобы создать сценарий, который можно запускать по требованию с помощью пользовательского меню. Мне бы хотелось, чтобы скрипт выполнял следующие действия:

  1. Сделайте копию только со значениями и форматом (без формул и importrange) из существующей электронной таблицы.
  2. Назовите копию такой же в качестве исходной электронной таблицы + отметка времени в формате «гггг-мм-дд».
  3. Поместите копию в указанную подпапку c.
  4. Также, чтобы иметь возможность создавать копию по требованию, используя для этого пользовательскую кнопку меню.
  5. И, наконец, пользовательскую кнопку меню для быстрого доступа к указанной подпапке.

До сих пор я нашел два сценария, которые могут выполнять части этой задачи, но не смогли объединить их в один сценарий. Возможно ли это?

См. Приведенный ниже код для двух сценариев:

SCRIPT 1

// Program: Archive GSheet with Date Stamp
// Programmer: Michael Fryar
// Date: 19 September 2017
// Google Apps Script to copy Google Sheet to subfolder with date stamp in name

// Add Custom Menu
function onOpen() {
  var ui = SpreadsheetApp.getUi();

  ui.createMenu('Archive')
      .addItem('Archive a copy with timestamp', 'archiveCopy')
      .addItem('Open folder', 'openArchive')
      .addToUi();
}

// Define function to copy sheet to subfolder with date stamp in name
// Building on https://gist.github.com/abhijeetchopra/99a11fb6016a70287112
function archiveCopy() {

  // Replace "spreadsheetId" with the ID of the Google Sheet you wish to copy
  var file = DriveApp.getFileById("ID")

  // Replace "folderId" with the ID of the folder where you want the copy saved
  var destination = DriveApp.getFolderById("ID");

  // Get timezone for datestamp
  var timeZone = Session.getScriptTimeZone();

  // Generate datestamp and store in variable formattedDate as year-month-date
  var formattedDate = Utilities.formatDate(new Date(), timeZone , "yyyy-MM-dd");

  // Replace "file_name" with the name you want to give the copy
  var name = formattedDate + " Copy";

  // Archive copy of "file" with "name" at the "destination"
  file.makeCopy(name, destination);
}

// Define function to open archive folder in new tab
// Building on https://www.youtube.com/watch?v=2y7Y5hwmPc4
function openArchive() {

  // Replace "folderId" with the ID of the folder where you want copies saved
  var url = "https://drive.google.com/drive/folders/"

  // HTML to open folder url in new tab and then close dialogue window in sheet
  var html = "<script>window.open('" + url + "');google.script.host.close();</script>";

  // Push HTML into user interface
  var userInterface = HtmlService.createHtmlOutput(html);
  SpreadsheetApp.getUi().showModalDialog(userInterface, 'Opening Archive Folder');
} 

SCRIPT 2

function copyEntireSpreadsheet() {
  var id = "ID"; // Please set the source Spreadsheet ID.

  var ss = SpreadsheetApp.openById(id);
  var srcSheets = ss.getSheets();
  var tempSheets = srcSheets.map(function(sheet, i) {
    var sheetName = sheet.getSheetName();
    var dstSheet = sheet.copyTo(ss).setName(sheetName + "_temp");
    var src = dstSheet.getDataRange();
    src.copyTo(src, {contentsOnly: true});
    return dstSheet;
  });
  var destination = ss.copy(ss.getName() + " - " + new Date().toLocaleString());
  tempSheets.forEach(function(sheet) {ss.deleteSheet(sheet)});
  var dstSheets = destination.getSheets();
  dstSheets.forEach(function(sheet) {
    var sheetName = sheet.getSheetName();
    if (sheetName.indexOf("_temp") == -1) {
      destination.deleteSheet(sheet);
    } else {
      sheet.setName(sheetName.slice(0, -5));
    }
  });
}

UPDATE!

Я нашел другой сценарий, который мог бы выполнять нужные мне части и, наконец, смог объединить их вместе. Сценарий публикации ниже, чтобы помочь другим в поисках чего-то похожего:

function onOpen() {
  var ui = SpreadsheetApp.getUi();

  ui.createMenu('Archive')
      .addItem('Archive copy with timestamp', 'Archive')
      .addItem('Open folder', 'openArchive')
      .addToUi();
}

function Archive() {
  var spreadsheetId = "###"; // Please set the source Spreadsheet ID.
  var destFolderId = "###";  // Please set the destination folder ID.

  // Copy each sheet in the source Spreadsheet by removing the formulas as the temporal sheets.
  var ss = SpreadsheetApp.openById(spreadsheetId);
  var tempSheets = ss.getSheets().map(function(sheet) {
    var dstSheet = sheet.copyTo(ss).setName(sheet.getSheetName() + "_temp");
    var src = dstSheet.getDataRange();
    src.copyTo(src, {contentsOnly: true});
    return dstSheet;
  });

  // Get timezone for datestamp
  var timeZone = Session.getScriptTimeZone();

  // Generate datestamp and store in variable formattedDate as year-month-date
  var formattedDate = Utilities.formatDate(new Date(), timeZone , "yyyy-MM-dd");

  // Copy the source Spreadsheet.
  var destination = ss.copy(ss.getName() + " " + formattedDate);

  // Delete the temporal sheets in the source Spreadsheet.
  tempSheets.forEach(function(sheet) {ss.deleteSheet(sheet)});

  // Delete the original sheets from the copied Spreadsheet and rename the copied sheets.
  destination.getSheets().forEach(function(sheet) {
    var sheetName = sheet.getSheetName();
    if (sheetName.indexOf("_temp") == -1) {
      destination.deleteSheet(sheet);
    } else {
      sheet.setName(sheetName.slice(0, -5));
    }
  });

  // Move file to the destination folder.
  var file = DriveApp.getFileById(destination.getId());
  DriveApp.getFolderById(destFolderId).addFile(file);
  file.getParents().next().removeFile(file);
}

// Define function to open archive folder in new tab
// Building on https://www.youtube.com/watch?v=2y7Y5hwmPc4
function openArchive() {

  // Replace "folderId" with the ID of the folder where you want copies saved
  var url = "https://drive.google.com/drive/folders/folderid"

  // HTML to open folder url in new tab and then close dialogue window in sheet
  var html = "<script>window.open('" + url + "');google.script.host.close();</script>";

  // Push HTML into user interface
  var userInterface = HtmlService.createHtmlOutput(html);
  SpreadsheetApp.getUi().showModalDialog(userInterface, 'Opening Archive Folder');
}
...