Google Sheet копирование и вставка значений и форматирование между разными листами

#google-sheets #copy-paste

#google-sheets #копировать-вставить

Вопрос:

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

 function copiarValores2(){
  var source = SpreadsheetApp.openById('1hWTdUNhTEohOqg-UGNGV4XwY7nDOX5Ys9piz256QeIc');
  var sourceS = source.getSheets()[0];
  var range = sourceS.getRange('A1:S230');
  var destination = SpreadsheetApp.openById('15zvklK7NAEBKQcusTwYPEmlH3BNw0t-6MlgQ1fqBuPs');
  var destSheet = destination.getSheets()[0];
  range.copyValuesToRange(destSheet,1,20,1,230)
}
 

Запустив этот скрипт, я получаю следующую ошибку:

 Exception: Target sheet and source range must be on the same spreadsheet.
 

Я не знаю, как это исправить.
Спасибо за внимание и помощь.

Ответ №1:

Поскольку невозможно напрямую скопировать диапазон в другую электронную таблицу, вы можете использовать этот обходной путь:

Пример кода:

 function copiarValores2() {
  var source = SpreadsheetApp.openById('1PTRabYcpVY6hLNvUByj9ZJAouogc-uMCMhiexxxxx');
  var sourceS = source.getSheetByName("Sheet1");
  var destination = SpreadsheetApp.openById('1RPQ7WOTOZZSirf60kP6nULhViCdsuGHcOxxxxxx');
  var destSheet = destination.getSheetByName("Sheet1");

  //Copy source sheet to destination spreadsheet
  newSource = sourceS.copyTo(destination);
  //Get the range from the newly copied sheet
  var range = newSource.getRange('A1:S230');

  //Copy to the destination sheet, starting from cell A1
  range.copyTo(destSheet.getRange("A1"));

  //Delete copied source sheet
  destination.deleteSheet(newSource);
}
 

Что он делает?

  1. Откройте исходную электронную таблицу и выберите лист для копирования с помощью Spreadsheet.getSheetByName(имя)
  2. Откройте целевую электронную таблицу и выберите лист, в который будут вставлены значения, используя электронную таблицу.getSheetByName(имя)
  3. Скопируйте исходный лист в целевую электронную таблицу с помощью Sheet.CopyTo (электронная таблица). Этот скопированный лист будет вашим новым исходным листом, который находится в вашей целевой электронной таблице.

Скопированный лист называется «Копия [оригинального имени]» в вашей целевой электронной таблице

  1. Выберите диапазон, который вы хотите скопировать из нового исходного листа, затем скопируйте диапазон на лист назначения с помощью Range.CopyTo(назначение)

Я использовал этот метод, поскольку вы упомянули в своем сообщении, что вы также хотите скопировать форматирование. Вы можете использовать другие методы копирования, доступные в классе Range, в зависимости от ваших предпочтений

  1. Наконец, удалите новый исходный лист в целевой электронной таблице с помощью электронной таблицы.Удалить таблицу (лист)

ВЫВОД:

Исходный лист:

введите описание изображения здесь

Целевой лист:

введите описание изображения здесь

Комментарии:

1. Рон М., во-первых, большое тебе спасибо за код и объяснение, для меня это имеет значение. Но здесь есть одна проблема. Когда создается новый лист, все формулы объединяются, и многие значения поступают из функции IMPORTRANGE . Мне нужна копия только со значениями, потому что эти данные поступают из форм, а исходный лист будет стираться каждую неделю, поэтому мне нужна копия каждый месяц с последними данными, прежде чем удалять их. Если он поставляется с IMPORTRANGE, эти данные изменятся.

2. О, это может быть сложно, можете ли вы сначала попробовать использовать этот код Utilities.sleep(30000); range.copyTo(destSheet.getRange("A1"),{contentsOnly:true}); , когда я попробовал это, это даст время для загрузки формулы importrange перед копированием ее значения. Но опять же, я вручную предоставил к нему доступ в первый раз, чтобы он заработал. Дайте мне знать, если вы столкнулись с подобной проблемой.

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

4. Идеально, «{contentsOnly:true}); » сработало идеально. Я даже не пробовал sleep (30000), и новый лист немедленно загрузился со всеми данными, которые присутствовали на исходном листе. Еще раз спасибо, помогли мне решить эту проблему и позволили мне узнать больше.