it-swarm.com.ru

Как скопировать строку из одной таблицы Google в другую таблицу Google с помощью скрипта Google Apps?

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

13
Ani

Проверьте документацию здесь:

http://code.google.com/googleapps/appsscript/service_spreadsheet.html

Предположим, вы работаете в электронной таблице, откуда копируете.

Вы должны получить дескриптор текущей таблицы и целевой таблицы. Вам нужно будет получить идентификатор для целевой таблицы. Подробности в ссылке там.

var ss = SpreadsheetApp.getActiveSpreadsheet();
var target = SpreadsheetApp.openById("abc1234567");

Далее нам нужно выбрать конкретные листы в этих таблицах. Допустим, ваша строка находится на листе с именем «New Stuff», а у вас есть лист в целевой электронной таблице с именем «Archive».

var source_sheet = ss.getSheetByName("New Stuff");
var target_sheet = target.getSheetByName("Archive");

Теперь концепция, которую используют таблицы приложений Google, - это диапазоны. Диапазон - это просто кусок клеток. Таким образом, мы должны определить дальность и дальность. Допустим, на вашем листе 7 столбцов, а вы хотите 10-й ряд.

var source_range = source_sheet.getRange("A10:G10");
var target_range = target_sheet.getRange("A1:G1");

Итак, мы собираемся взять этот ряд и поместить его в первый ряд целевого листа. Теперь для актуальной копии:

source_range.copyTo(target_range);

И вы сделали!

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

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));

Таким образом, каждый раз, когда вы копируете строку, она просто добавляется в конец листа.

20
Keith Twombley

Метод copyTo плохо документирован, поскольку он не позволяет копировать содержимое на лист в другой электронной таблице. 

Вы можете использовать getValues и setValues, как показано ниже:

function CopyDataToNewFile() {
  var sss = SpreadsheetApp.openById('0AjN7uZG....'); // sss = source spreadsheet
  var ss = sss.getSheetByName('Monthly'); // ss = source sheet
  //Get full range of data
  var SRange = ss.getDataRange();
  //get A1 notation identifying the range
  var A1Range = SRange.getA1Notation();
  //get the data values in range
  var SData = SRange.getValues();

  var tss = SpreadsheetApp.openById('8AjN7u....'); // tss = target spreadsheet
  var ts = tss.getSheetByName('RAWData'); // ts = target sheet
  //set the target range to the values of the source data
  ts.getRange(A1Range).setValues(SData);

}  
16
ubique

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

В основном решение заключается в 

  • скопировать исходный лист в целевую электронную таблицу в качестве временного исходного листа
  • скопировать данные из временного исходного листа на целевой лист
  • удалить временный исходный лист

Код:

var sss = SpreadsheetApp.openById(spreadsheet); // sss = source spreadsheet
var ss = sss.getSheetByName(sheet); // ss = source sheet
var ss_temp = ss.copyTo(targetsheet);
var tss = SpreadsheetApp.openById(spreadsheet); // tss = target spreadsheet
var ts = tss.getSheetByName(sheet); // ts = target sheet
var range2Copy = ss_temp.getRange(range);
range2Copy.copyTo(ts.getRange(range));
bss.setActiveSheet(ss_temp);
bss.deleteActiveSheet()

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

7
Stefan van Aalst

Может быть, этот пост поможет вам http://l.rw.rw/gscripts3 . Он описывает функциональность функции копирования с различными условиями (ограничение данных по диапазону, пользовательские фильтры, размещение данных для назначения с помощью методов вставки или замены). И есть рабочий пример, где вы можете попробовать это.

1
Oleg Shaydenko

Другой способ сделать это - импортировать строку (или любой диапазон) из источника в целевую электронную таблицу.

Предполагая, что вы хотите импортировать строку 3 из таблицы исходной электронной таблицы, называемой «source-могли быть с именем таблицы», поместите в первый столбец целевого местоположения следующую формулу: 

=IMPORTRANGE("source-spreadsheet-key","source-spreadsheet-sheet-name!3:3")

где "source-spreadsheet-key" - это уникальный идентификатор исходной электронной таблицы, которую вы извлекаете из ее URL.

Если вы сделаете это в первый раз, появится сообщение безопасности:

enter image description here

Просто подтвердите, и вся строка будет заполнена автоматически.

Помните, что иногда обновление импортированных ячеек занимает пару минут после внесения изменений в исходную область. Однако вы можете ускорить его, нажимая ctrl-E или ctrl-shift-E , находясь в целевой электронной таблице, в зависимости от того, что работает.

1
ellockie

Используйте range.setValues, это лучший выбор. Работает для любого диапазона на любом листе, если исходный и целевой диапазон похожи.

Вот пример кода:

function openCSV() {

  //Buscamos el archivo
  var files = DriveApp.getFilesByName("ts.csv");

  //Cada nombre de archivo es unico, por eso next() lo devuelve.
  var file = files.next();

  fileID = file.getId();

  //Abrimos la spreadsheet, seleccionamos la hoja
  var spreadsheet = SpreadsheetApp.openById(fileID);
  var sheet = spreadsheet.getSheets()[0];

  //Seleccionamos el rango  
  var range = sheet.getRange("A1:F1");
  values = range.getValues();

  //Guardamos un log del rango
  //Logger.log(values);

  //Seleccionamos la hoja de destino, que es la activeSheet 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var SSsheet = ss.getSheets()[0];

  //Seleccionamos el mismo rango y le asignamos los valores
  var ssRange = SSsheet.getRange("A1:F1");
  ssRange.setValues(values);

}
0
Pulpo

Это не работает - возвращает ошибку «Целевой диапазон и исходный диапазон должны быть в одной электронной таблице». Похоже, нам нужно сделать что-то похожее на это:

function copyRow_ (origSheetName, destSheetName, origRowNumber, destRowNumber)
{
  var origSheetObject = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(origSheetName);
  var destSheetObject = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(destSheetName);
  var origLastCol = origSheetObject.getLastColumn();
  var arrOrigData = origSheetObject.getRange(origRowNumber, 1, 1, origLastCol).getValues();
  var destlastRow = destSheetObject.getLastRow() + 1;
  if (destRowNumber)
    destlastRow = destRowNumber;
  var cont;
  for (cont = 0; cont < origLastCol; cont++)
       destSheetObject.getRange(destlastRow, 1+cont).setValue(arrOrigData[0][cont]);
}

(явно украдено из здесь )

0
Sean