Необходимо скопировать электронную таблицу на несколько листов со всеми данными и форматированием Google Sheets - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь скопировать 2-страничную таблицу на Google Диске в другую папку.

Вот где мне удалось запутаться;

function clearRange() {
  var sheet = SpreadsheetApp.getActive().getSheetByName('Internal copy');
  sheet.getRange('B3:B7').clearContent();
  sheet.getRange('D3:D5').clearContent();
  sheet.getRange('B12:C15').clearContent();
  sheet.getRange('B20:C23').clearContent();
  sheet.getRange('B28:C31').clearContent();
}

function copySpreadSheet() {
  var source = SpreadsheetApp.getActiveSheet();
  var sourceName = source.getSheetName();
  var sValues = source.getDataRange().getValues();
  var destination = SpreadsheetApp.openById('1Mcnlyknqmtf2u_TEhbWxwzYqlxGw39Sno2bOXgkErb4');
  source.copyTo('destination')
  var destinationSheet = destination.getSheetByName('Copy of '+sourceName)
  destinationSheet.getRange(1,1,sValues.length,sValues[0].length).setValues(sValues);

function main() {
  copySpreadSheet("Internal Estimate invoice Blundell");
}

Обратите внимание, что первый бит - это еще одна функция для очистки ячеек после сохранения. Это шаблон цитаты, который я хочу использовать в своем магазине, не шутя с цитатой. Я хочу, чтобы они вводили данные, сохраняли их как копию, а затем сбрасывали поля на ноль, готовые к следующей цитате.

Любая помощь будет принята с благодарностью!

**** ОБНОВЛЕНИЕ ********

Итак, я получил несколько работать. Вот мой новый код:


function copySheetValuesV4(){
  var sourceSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheets = sourceSpreadsheet.getSheets();
  var destination = SpreadsheetApp.create(sourceSpreadsheet.getName()+' Final');
    for (var i = 0; i < sourceSheets.length; i++){
      var sourceSheet = sourceSheets[i];
      if (!sourceSheet.isSheetHidden()) {
        var sourceSheetName = sourceSheet.getSheetName();
        var sValues = sourceSheet.getDataRange().getValues();
        sourceSheet.copyTo(destination)
        var destinationSheet = destination.getSheetByName('Copy of '+sourceSheetName).setName(sourceSheetName);
        destinationSheet.getRange(1,1,sValues.length,sValues[0].length).setValues(sValues);// overwrite all formulas that the copyTo preserved */

      }
    destination.getSheetByName("sheet1").hideSheet() // Remove the default "sheet1" */
  }
}

. Он делает копию в моей / корневой папке, что сейчас хорошо, однако он не копирует ни одну из формул и не копирует защищенные диапазоны.

Есть идеи?

1 Ответ

1 голос
/ 08 ноября 2019
  • Вы хотите скопировать только те листы, которые не спрятаны в новую электронную таблицу.
  • Вы хотите сохранить формат и формулы при копировании листов.
  • Для пункта назначенияВ таблице, вы хотите скрыть лист sheet1.
  • Вы хотите добиться этого с помощью Google Apps Script.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как один из нескольких ответов. В этом ответе copySheetValuesV4() изменяется.

Последовательность действий этого примера сценария следующая.

Поток:

  1. Скопируйте исходную электронную таблицу.
  2. Удалите скрытые листы.

Шаблон 1:

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

Пример сценария:

function copySheetValuesV4() {
  var sourceSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var dst = sourceSpreadsheet.copy(sourceSpreadsheet.getName()+' Final');
  var sheets = dst.getSheets();
  for (var i = 0; i < sheets.length; i++) {
    if (sheets[i].isSheetHidden()) {
      dst.deleteSheet(sheets[i]);
    }
  }
  dst.getSheetByName("sheet1").hideSheet();
}

Шаблон 2:

В этом шаблоне используется вышеуказанный поток. И, чтобы удалить историю Таблицы, в которой были удалены скрытые листы, временная Таблица копируется как выходная Таблица. Затем новая электронная таблица перемещается в указанную папку. Временная электронная таблица перемещается в корзину.

Пример сценария:

function copySheetValuesV4() {
  var folderId = "###"; // Please set the destination folder ID.

  var sourceSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var temp = sourceSpreadsheet.copy("temp");
  var sheets = temp.getSheets();
  for (var i = 0; i < sheets.length; i++) {
    if (sheets[i].isSheetHidden()) {
      temp.deleteSheet(sheets[i]);
    }
  }
  temp.getSheetByName("sheet1").hideSheet();
  var id = temp.copy(sourceSpreadsheet.getName()+' Final').getId();
  var file = DriveApp.getFileById(id);
  DriveApp.getFolderById(folderId).addFile(file);
  file.getParents().next().removeFile(file);
  DriveApp.getFileById(temp.getId()).setTrashed(true);
}

Ссылки:

Если я неправильно понял ваш вопрос, и вы не указалихочу, извиняюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...