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

Я пытаюсь создать скрипт, который позволяет пользователю копировать выделенный диапазон ячеек в другой неоткрытый документ листа Google. Я могу заставить его работать, если лист, на который я копирую данные, находится в текущем документе, но я НЕ могу понять, как сделать копию данных в другую электронную таблицу.

Я пробовал openById или openbyUrl, но постоянно получаю следующую ошибку:

«Целевой диапазон и исходный диапазон должны быть в одной электронной таблице».

function copyToDifferentDocument() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();

// *** Have to figure out how to make the target a different document!!!! ***

  var target = SpreadsheetApp.openById("targetsheetIDgoeshere");
    
  /* 
  Next we need to pick the particular sheets within those spreadsheets.
  Let's say your row is on the sheet named "New Stuff", and you have a sheet in the target spreadsheet named "Archive".
  */

  var source_sheet = ss.getSheetByName("New Stuff");
  var target_sheet = target.getSheetByName("Archive");
    
  // The below makes the highlighted cells the range that will be copied.

  var source_range = source_sheet.getActiveRange();
  var last_row = target_sheet.getLastRow();
  target_sheet.insertRowAfter(last_row);
  var target_range = target_sheet.getRange("A"+(last_row+1)+":G"+(last_row+1));  
  
  // Take the highlighted rant and put it on the last row of the target sheet.
  
  source_range.copyTo(target_range);

}

Я пытаюсь скопировать выделенный диапазон на лист в другом документе листа Google.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
268
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Вы хотите скопировать активный диапазон на листе «Новые материалы» в активной электронной таблице в последнюю строку на листе «Архив» в электронной таблице «targetsheetIDgoeshere».

Если я правильно понимаю, как насчет этой модификации? Я думаю, что есть 2 шаблона для вашей ситуации.

Шаблон 1:

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

From:
target_sheet.insertRowAfter(last_row);
var target_range = target_sheet.getRange("A"+(last_row+1)+":G"+(last_row+1));

// Take the highlighted rant and put it on the last row of the target sheet.

source_range.copyTo(target_range);
To:
var values = source_range.getValues();
target_sheet.getRange(last_row + 1, 1, values.length, values[0].length).setValues(values);

Шаблон 2:

В этом шаблоне копируются как значения, так и форматы. Пожалуйста, измените следующим образом. К сожалению, copyTo() может копировать диапазон в диапазон только в той же электронной таблице. Эту ситуацию также можно увидеть в сообщении об ошибке вашего вопроса. Таким образом, в этой модификации сначала лист копируется в целевую электронную таблицу. Затем диапазон копируется.

From:
target_sheet.insertRowAfter(last_row);
var target_range = target_sheet.getRange("A"+(last_row+1)+":G"+(last_row+1));

// Take the highlighted rant and put it on the last row of the target sheet.

source_range.copyTo(target_range);
To:
if (last_row > 0) target_sheet.insertRowAfter(last_row);
var target_range = target_sheet.getRange(last_row + 1, 1);
var copiedsheet = source_sheet.copyTo(target);
copiedsheet.getRange(source_range.getA1Notation()).copyTo(target_range);
target.deleteSheet(copiedsheet);

Использованная литература:

Если я неправильно понял ваш вопрос, прошу прощения.

Tanaike - Pattern 2 - это именно то, что я искал. Работал как шарм. Большое спасибо! Теперь я перехожу к следующей части этого проекта, а именно: «Как разрешить пользователю выбирать из списка листов в целевом документе вместо того, чтобы жестко кодировать конкретный лист? (который был «архивным "в моем приведенном выше коде.)"... Еще раз спасибо!

Adam Christiansen 08.04.2019 14:21

@Адам Кристиансен Добро пожаловать. Спасибо, что дали мне знать. Я рад, что ваша проблема была решена. Что касается вашего нового вопроса, он отличается от вашего первоначального вопроса. Поэтому, пожалуйста, опубликуйте его как новый вопрос, включая подробную информацию о вашей новой проблеме. Таким образом, это поможет пользователям подумать о вашем решении. В то время, пожалуйста, закройте этот вопрос. stackoverflow.com/help/accepted-answer

Tanaike 09.04.2019 00:00

Другие вопросы по теме