#google-apps-script #google-sheets
#google-apps-script #google-таблицы
Вопрос:
У меня есть три исходных файла — Alpha, Beta, Kappa. У них одинаковые заголовки, и, по сути, я просто хочу, чтобы все они еженедельно объединялись в один файл. Я начал с Kappa, и каким-то образом это работает — он создает новую электронную таблицу и копирует информацию из файла Kappa и вставляет ее во вновь созданную электронную таблицу в виде значений.
Теперь я попробовал добавить альфа-файл в ту же электронную таблицу, чуть ниже информации, которую я скопировал из файла Kappa, используя функцию getLastRow. Я получил сообщение об ошибке, в котором говорится, что исходный диапазон и целевой диапазон должны быть в одной электронной таблице.
function RawExtractCopy() {
var version = 'ver. 4.01'
var ssnew = SpreadsheetApp.create('V5 Raw Extract ' version ); //create a spreadsheet
var ssnewsheet = ssnew.getSheetByName('Sheet1'); //get the sheet named Sheet1
ssnewsheet.insertRows(1,30000); //inserting more rows
ssnewsheet.setName('V5 Raw Extract'); //rename the sheet name of the newly created spreadsheet
var ssKappa = SpreadsheetApp.getActiveSpreadsheet(); //opens source file
var targetss = ssnew; //define created ss as the target ss
var srcSheetKappa = ssKappa.getSheetByName('KAPPA'); //get source sheet name
var targetSheet = targetss.getSheetByName('V5 Raw Extract'); //defining target sheet
var srcRangeKappa = srcSheetKappa.getRange("A1:AM30000"); //get source data
var destRangeKappa = targetss.getRange("A1"); //define target
var values = srcRangeKappa.getValues(); //line 18 to 21 is just to match source sheet and target sheet
var bGcolors = srcRangeKappa.getBackgrounds();
var colors = srcRangeKappa.getFontColors();
var fontSizes = srcRangeKappa.getFontSizes();
destRangeKappa.setValues(values);
destRangeKappa.setBackgrounds(bGcolors);
destRangeKappa.setFontColors(colors);
destRangeKappa.setFontSizes(fontSizes);
srcRangeKappa.copyTo(destRangeKappa, {contentsOnly: true});
var ssAlpha = SpreadsheetApp.openById("1gIs4vCdcGG79poDujz9t8Fq7_BWlaEiMrYUH9DTxVHs").activate();
var srcSheetAlpha = ssAlpha.getSheetByName('V5 ALPHA');
var srcRangeAlpha = srcSheetAlpha.getRange("A2:AM30000");
var destRangeAlpha = targetSheet.getRange(targetSheet.getLastRow() 1,1);
var valuesAlpha = srcRangeAlpha.getValues();
var bGcolorsAlpha = srcRangeAlpha.getBackgrounds();
var colorsAlpha = srcRangeAlpha.getFontColors();
var fontSizesAlpha = srcRangeAlpha.getFontSizes();
destRangeAlpha.setValues(values);
destRangeAlpha.setBackgrounds(bGcolors);
destRangeAlpha.setFontColors(colors);
destRangeAlpha.setFontSizes(fontSizes);
srcRangeKappa.copyTo(destRangeAlpha, {contentsOnly: true});
}
Дело в том, что он по-прежнему копирует данные из Kappa, но не прошел бета-тестирование. Может кто-нибудь, пожалуйста, быть любезным, рассказать, чего мне здесь не хватает?
Ответ №1:
Цель OP — создать дубликат трех листов в трех отдельных электронных таблицах; Alpha, Beta и Kappa. Код операционной системы работает для Kappa, но не для Alpha или Beta.
Почему этот код работает, а операционный код нет
Что ж, операционный код действительно работает, но операционная система выдает ошибки, указывая фиксированный диапазон (30000 строк в длину и около 40 столбцов в ширину). Это работает для первого листа, но не так просто для второго и третьего листов. Следующий код отличается от операционного кода в двух основных аспектах:
- диапазоны данных в Alpha, Beta, Kappa и «Raw Extract» оцениваются с помощью
getLastRow
иgetLastColumn
. Таким образом, исходный диапазон и целевой диапазон будут соответствовать друг другу. Кроме того, данные со второго и третьего листов легко добавляются на одну строку ниже предыдущей последней строки. copyTo
код изменен для копирования всего листа, а не диапазона. Причиной этого являются предыдущие четыре командыsetValues(values)
,setBackgrounds(bGcolors)
,setFontColors(colors)
иsetFontSizes(fontSizes)
, которые уже скопировали диапазон данных в «Raw Extract».
function so_55448299() {
var version = 'ver. 4.01'
var ssnew = SpreadsheetApp.create('V5 Raw Extract ' version); //create a spreadsheet
var ssnewsheet = ssnew.getSheetByName('Sheet1'); //get the sheet named Sheet1
ssnewsheet.setName('V5 Raw Extract'); //rename the sheet name of the newly created spreadsheet
// copy Kappa and data
var ssKappa = SpreadsheetApp.getActiveSpreadsheet(); //opens source file
var targetss = ssnew; //define created ss as the target ss
var srcSheetKappa = ssKappa.getSheetByName('KAPPA'); //get source sheet name
var targetSheet = targetss.getSheetByName('V5 Raw Extract'); //defining target sheet
// get the last row and column of the source sheet
var kappaLastRow = srcSheetKappa.getLastRow();
var kappaLastCol = srcSheetKappa.getLastColumn();
//Logger.log("DEBUG: Kappa Last row = " kappaLastRow ", Last column = " kappaLastCol);//DEBUG
// declare the source and target ranges
var srcRangeKappa = srcSheetKappa.getRange(1, 1, kappaLastRow, kappaLastCol); //get source data
var destRangeKappa = targetSheet.getRange(1, 1, kappaLastRow, kappaLastCol); //define target
// get values and other data
var values = srcRangeKappa.getValues(); //line 18 to 21 is just to match source sheet and target sheet
var bGcolors = srcRangeKappa.getBackgrounds();
var colors = srcRangeKappa.getFontColors();
var fontSizes = srcRangeKappa.getFontSizes();
// set values and other data
destRangeKappa.setValues(values);
destRangeKappa.setBackgrounds(bGcolors);
destRangeKappa.setFontColors(colors);
destRangeKappa.setFontSizes(fontSizes);
// duplicate the entire sheet
srcSheetKappa.copyTo(targetss);
// end copy Kappa and data
// start copy Alpha and data
var ssAlpha = SpreadsheetApp.openById("<insert code here>");
var srcSheetAlpha = ssAlpha.getSheetByName('V5 ALPHA');
// get the last row and column of the source sheet
var alphaLastRow = srcSheetAlpha.getLastRow();
var alphaLastCol = srcSheetAlpha.getLastColumn();
//Logger.log("DEBUG: Alpha Last row = " alphaLastRow ", Alpha Last Column = " alphaLastCol);//DEBUG
// get the last row and column of the target sheet
var rawLastRow = targetSheet.getLastRow();
var rawLastCol = targetSheet.getLastColumn();
Logger.log("DEBUG: Target Last row = " rawLastRow ", Target Last Column = " rawLastCol); //DEBUG
// declare the source and target ranges
var srcRangeAlpha = srcSheetAlpha.getRange(2, 1, alphaLastRow - 1, alphaLastCol);
var destRangeAlpha = targetSheet.getRange(rawLastRow 1, 1, alphaLastRow - 1, alphaLastCol);
//Logger.log("DEBUG:destRangeAlpha = " destRangeAlpha.getA1Notation());//DEBUG
// get values and other data
var values = srcRangeAlpha.getValues();
var bGcolors = srcRangeAlpha.getBackgrounds();
var colors = srcRangeAlpha.getFontColors();
var fontSizes = srcRangeAlpha.getFontSizes();
// set values and other data
destRangeAlpha.setValues(values);
destRangeAlpha.setBackgrounds(bGcolors);
destRangeAlpha.setFontColors(colors);
destRangeAlpha.setFontSizes(fontSizes);
// duplicate the entire sheet
srcSheetAlpha.copyTo(targetss);
// end copy Alpha and data
// start copy Beta and data
var ssBeta = SpreadsheetApp.openById("<insert code here>");
var srcSheetBeta = ssBeta.getSheetByName('V5 BETA');
// get the last row and column of the source sheet
var betaLastRow = srcSheetBeta.getLastRow();
var betaLastCol = srcSheetBeta.getLastColumn();
//Logger.log("DEBUG: Beta Last row = " betaLastRow ", Beta Last Column = " betaLastCol);//DEBUG
// get the last row and column of the target sheet
var rawLastRow = targetSheet.getLastRow();
var rawLastCol = targetSheet.getLastColumn();
//Logger.log("DEBUG: Target Last row = " rawLastRow ", Target Last Column = " rawLastCol);//DEBUG
// declare the source and target ranges
var srcRangeBeta = srcSheetBeta.getRange(2, 1, betaLastRow - 1, betaLastCol);
var destRangeBeta = targetSheet.getRange(rawLastRow 1, 1, betaLastRow - 1, betaLastCol);
//Logger.log("DEBUG:destRangeBeta = " destRangeBeta.getA1Notation());//DEBUG
// get values and other data
var values = srcRangeBeta.getValues();
var bGcolors = srcRangeBeta.getBackgrounds();
var colors = srcRangeBeta.getFontColors();
var fontSizes = srcRangeBeta.getFontSizes();
// set values and other data
destRangeBeta.setValues(values);
destRangeBeta.setBackgrounds(bGcolors);
destRangeBeta.setFontColors(colors);
destRangeBeta.setFontSizes(fontSizes);
// duplicate the entire sheet
srcSheetBeta.copyTo(targetss);
// end copy Beta and data
}
ОБНОВЛЕНИЕ — Одна небольшая функция
@tehhowch справедливо замечает, что более подходящим способом управления этим процессом была бы одна небольшая функция, вызываемая с несколькими параметрами из функции драйвера. Это то, что я имел в виду в то время, но (к лучшему или к худшему) Я чувствовал, что подход «длинной руки» позволит OP лучше понять, как код отличается от их собственного. Однако этот вариант призван соответствовать наблюдению техоуча. Я оставил инструкции регистратора в интересах операционной системы (что объясняет необычайную длину кода
function so_55448299_04() {
//Note#1: this function assumes that it is located in the "Kappa" sheet
//Note#2: the spreadsheet ID for Alpha and Beta cannot be assigned to a variable. they must be entered longhand BEFORE this function is processed.
//Note#3: the target sheet names are also entered longhand. BUT the number of sheets is described in the variable "usersheets"
// user defined variables
var targetVn = 'ver. 4.01';
var targetName = 'V5 Raw Extract';
var usersheets = 3;
// create the targetspreadsheet and starting sheet
var targetss = SpreadsheetApp.create(targetName " " targetVn);
var targetSheet = targetss.getSheetByName('Sheet1');
targetSheet.setName(targetName);
//loop through the usersheets
for (var i = 0; i < usersheets; i ) {
// if i==0, then process this sheet - KAPPA
if (i == 0) {
//Logger.log("DEBUG: This is KAPPA");//DEBUG
var srcss = SpreadsheetApp.getActiveSpreadsheet();
//Logger.log("DEBUG: this spreadsheet is " srcss.getName());//DEBUG
// startrow is 1 in order to include headers
var startrow = 1;
var srcSheet = srcss.getSheetByName("v5 KAPPA");
}
// if i=1, then process Alpha
else if (i == 1) {
//Logger.log("DEBUG: This is ALPHA");//DEBUG
var srcss = SpreadsheetApp.openById("<Insert code>");
//Logger.log("DEBUG: this spreadsheet is " srcss.getName());//DEBUG
// startrow is 2 in iorder to avoid duplicating headers
var startrow = 2;
var srcSheet = srcss.getSheetByName("v5 ALPHA");
}
// if i=2, then process Beta
else if (i == 2) {
//Logger.log("DEBUG: This is BETA");//DEBUG
var srcss = SpreadsheetApp.openById("<Insert code>");
//Logger.log("DEBUG: this spreadsheet is " srcss.getName());//DEBUG
// startrow is 2 in iorder to avoid duplicating headers
var startrow = 2;
var srcSheet = srcss.getSheetByName(usersheets[i]);
}
// run the subroutine to copy and paste data
// Logger.log("DEBUG: srcSheet: " srcSheet.getName() ", targetSheet: " targetSheet.getName() ", startrow: " startrow ", targetss: " targetss.getName());//DEBUG
var getresult = getData04(srcSheet, targetSheet, startrow, targetss);
}
}
function getData04(srcSheet, targetSheet, startrow, targetss) {
//get the source sheet - last row and column
var srcLastRow = srcSheet.getLastRow();
var srcLastCol = srcSheet.getLastColumn();
//Logger.log("DEBUG: Source Last row = " srcLastRow ", Last column = " srcLastCol);//DEBUG
// get the target sheet - last row and column
var targetLastRow = targetSheet.getLastRow();
var targetLastCol = targetSheet.getLastColumn();
//Logger.log("DEBUG: Target Last row = " targetLastRow ", Target Last Column = " targetLastCol);//DEBUG
// declare the source and target ranges
if (startrow == 1) {
var srcRange = srcSheet.getRange(startrow, 1, srcLastRow, srcLastCol);
var targetRange = targetSheet.getRange(startrow, 1, srcLastRow, srcLastCol);
} else {
var srcRange = srcSheet.getRange(startrow, 1, srcLastRow - 1, srcLastCol);
var targetRange = targetSheet.getRange(targetLastRow 1, 1, srcLastRow - 1, srcLastCol);
}
//Logger.log("DEBUG: srcRange = " srcRange.getA1Notation() ", target range = " targetRange.getA1Notation());//DEBUG
// get source values and other data
var values = srcRange.getValues();
var bGcolors = srcRange.getBackgrounds();
var colors = srcRange.getFontColors();
var fontSizes = srcRange.getFontSizes();
// set values and other data
targetRange.setValues(values);
targetRange.setBackgrounds(bGcolors);
targetRange.setFontColors(colors);
targetRange.setFontSizes(fontSizes);
// duplicate the entire sheet
srcSheet.copyTo(targetss);
var result = "Successful";
return resu<
}
Комментарии:
1. Я чувствую, что это должна быть одна небольшая функция, вызываемая с несколькими параметрами из функции драйвера..
2. @tehhowch Моя вина. Я сам чувствовал это и включил доработку, чтобы отразить более эффективный подход. Функция не такая «маленькая», как можно было подумать. Возможно, вы можете увидеть, как это можно улучшить.