#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);
}
Что он делает?
- Откройте исходную электронную таблицу и выберите лист для копирования с помощью Spreadsheet.getSheetByName(имя)
- Откройте целевую электронную таблицу и выберите лист, в который будут вставлены значения, используя электронную таблицу.getSheetByName(имя)
- Скопируйте исходный лист в целевую электронную таблицу с помощью Sheet.CopyTo (электронная таблица). Этот скопированный лист будет вашим новым исходным листом, который находится в вашей целевой электронной таблице.
Скопированный лист называется «Копия [оригинального имени]» в вашей целевой электронной таблице
- Выберите диапазон, который вы хотите скопировать из нового исходного листа, затем скопируйте диапазон на лист назначения с помощью Range.CopyTo(назначение)
Я использовал этот метод, поскольку вы упомянули в своем сообщении, что вы также хотите скопировать форматирование. Вы можете использовать другие методы копирования, доступные в классе Range, в зависимости от ваших предпочтений
- Наконец, удалите новый исходный лист в целевой электронной таблице с помощью электронной таблицы.Удалить таблицу (лист)
ВЫВОД:
Исходный лист:
Целевой лист:
Комментарии:
1. Рон М., во-первых, большое тебе спасибо за код и объяснение, для меня это имеет значение. Но здесь есть одна проблема. Когда создается новый лист, все формулы объединяются, и многие значения поступают из функции IMPORTRANGE . Мне нужна копия только со значениями, потому что эти данные поступают из форм, а исходный лист будет стираться каждую неделю, поэтому мне нужна копия каждый месяц с последними данными, прежде чем удалять их. Если он поставляется с IMPORTRANGE, эти данные изменятся.
2. О, это может быть сложно, можете ли вы сначала попробовать использовать этот код
Utilities.sleep(30000); range.copyTo(destSheet.getRange("A1"),{contentsOnly:true});
, когда я попробовал это, это даст время для загрузки формулы importrange перед копированием ее значения. Но опять же, я вручную предоставил к нему доступ в первый раз, чтобы он заработал. Дайте мне знать, если вы столкнулись с подобной проблемой.3. Возможно, вы также захотите рассмотреть возможность изменения этих шагов. пример скопируйте исходный лист на фиктивный целевой лист в исходной электронной таблице (вставьте как значения), затем скопируйте этот лист в целевую электронную таблицу. Дайте мне знать, если вам нужна поддержка при реализации этого
4. Идеально, «{contentsOnly:true}); » сработало идеально. Я даже не пробовал sleep (30000), и новый лист немедленно загрузился со всеми данными, которые присутствовали на исходном листе. Еще раз спасибо, помогли мне решить эту проблему и позволили мне узнать больше.