Лучший способ скопировать все содержимое ячейки между электронными таблицами - PullRequest
0 голосов
/ 25 марта 2019

Я работаю с 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);
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...