Я работаю с 2 электронными таблицами Google, которые в основном делают одно и то же, но содержат разные данные, поэтому каждый раз, когда я делаю обновления для одного, мне приходится делать одни и те же обновления для другого. Иногда изменения являются сложными, поэтому я подумал, что я бы автоматизировал копирование изменений с «родительского листа» на дочерний. Это работает путем поиска столбцов с одинаковыми именами и их перемещения туда, где они должны быть, а также путем замены дочерних формул родительскими формулами под теми же заголовками и, наконец, копирования значений данных в дочернем листе в новые столбцы, к которым они принадлежат.
Я дошел до того, что это более или менее работает, но проблема заключается в копировании остального содержимого ячейки.
Если я перемещаю данные между листами в электронной таблице, я могу просто скопировать исходный диапазон в другой диапазон, но при перемещении данных между электронными таблицами, потому что нет функции copyRangeBetweenSpreadsheets, я должен все переместить в переменные. Сначала формулы, затем значения, затем проверка данных, затем форматирование и условное форматирование. Это будет очень медленно и в конечном итоге истечет время, когда дочерняя таблица станет большой.
Есть ли ярлык, где я могу загрузить все данные в один контейнер, чтобы упростить процесс?
Отредактировано для добавления кода. Вот оно:
function updateChildSheets(){
updateChildSheet('13_8O0xMjy_9KLGEWkfXpyIrG88bZ9Yr25eu7DRHC_V4','Links',1);
}
function updateChildSheet(childSID,sheet,ParentHeaderRow) { //Parent Header row is the row containing the heading names for each column and is not necessarily thie first row of the sheet
//sheet is the sheet name inside the Parent and Child sheets to update
var ss = SpreadsheetApp.getActiveSpreadsheet();
var parentSheet = ss.getSheetByName(sheet);
//var childSID = Browser.inputBox('Remote Sheet to Update');
var childSS = SpreadsheetApp.openById(childSID);
var childSheet = childSS.getSheetByName(sheet);
var childSheetMaxCols = childSheet.getMaxColumns();
var childSheetMaxRows = childSheet.getMaxRows();
var childSheetHeadings = childSheet.getRange(ParentHeaderRow+':'+ParentHeaderRow).getValues();
var parentSheetHeadings = parentSheet.getRange(ParentHeaderRow+':'+ParentHeaderRow).getValues();
var parentSheetMaxCols = parentSheet.getMaxColumns();
var parentSheetMaxRows = parentSheet.getMaxRows();
var parentSheetFormulas = parentSheet.getRange(1,1,parentSheetMaxRows,parentSheetMaxCols).getFormulas();
var virtualSheetArr = [];
//Create the new sheet headings
var headingRow =[];
for (var i in parentSheetHeadings[0]) headingRow.push(parentSheetHeadings[0][i]);
// create the correct length (the number of rows in the child sheet)
var dummyRow=[];
virtualSheetArr.push(headingRow);
//create empty rows equal to the length of data in child sheet
for (var i in virtualSheetArr[0]) dummyRow.push('');
for (var i=0; i<childSheetMaxRows-1; i++) {
virtualSheetArr.push(dummyRow.slice())
}
//find childHeading and copy rows below into VirtualArr
//for each column in source sheet
Loop1:
for (var headingCol=0; headingCol<virtualSheetArr[0].length; headingCol++){
//Locate column in the child sheet (childSheetCol)
var columnFound=false;
for (var childSheetCol=0; childSheetCol<childSheetMaxCols; childSheetCol++){
//if the column in child sheet matches the column in source sheet
if (virtualSheetArr[0][headingCol] == childSheetHeadings[0][childSheetCol]) {
columnFound=true;
break;
}
}
if(!columnFound) continue;
//get both formulas and values from child sheet and save them to a 2D array using identical columns from the parent Sheet
var childColValues = childSheet.getRange(1,childSheetCol+1,childSheetMaxRows,1).getValues();
var childColFormulas = childSheet.getRange(1,childSheetCol+1,childSheetMaxRows,1).getFormulas();
for(var i=1; i<childColValues.length;i++){
if(childColFormulas[i][0]!='') { //If a parent cell comtains a formula, save the new parent formula to the target cell
virtualSheetArr[i][headingCol] = parentSheetFormulas[i][headingCol];
//if a cell contains Arrayformula() remove any values found below it
if(/arrayformula/i.test(virtualSheetArr[i][headingCol])){
for(var j=i+1; j<childColValues.length; j++){
childColValues[j][0]='';
}
}
}
else if(childColValues[i][0]!='') virtualSheetArr[i][headingCol] = childColValues[i][0];
}
}
//Temporarily place the output in a test sheet to view output
var testsheet = childSS.getSheetByName('testsheet');
testsheet.clearContents().getRange(ParentHeaderRow,1,virtualSheetArr.length,(virtualSheetArr[0].length)).setValues(virtualSheetArr);
if(ParentHeaderRow>1) {
var parentSheetOtherHeadings = parentSheet.getRange(1+':'+(ParentHeaderRow-1))
testsheet.getRange(1,1,parentSheetOtherHeadings.length,parentSheetOtherHeadings[0].length).setValues(parentSheetOtherHeadings);
}
}