Объедините данные в один мастер-лист Google с помощью скриптов приложений - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь объединить данные из нескольких вкладок в единый лист. Каждая вкладка представляет собой отдельную форму и имеет одинаковый формат. На сводном листе я хочу переупорядочить данные так, чтобы имя поля данных находилось в столбце, а значения данных - в строках. Я пробовал следующее:

function consolidateData(){

// defined all variables
   var sheetNames = [];
   var dataSheet = [];
   var dataValues = [];
   var conso=[];
   var header = [["Faculty Name","Faculty ID","Date of Joining"]];
   var ws = SpreadsheetApp.getActiveSpreadsheet();

 // get all sheets
   var allsheets = ws.getSheets();

 for(var s in allsheets)
 var sheet = allsheets[s];    
 sheetNames[s] = sheet.getName();
 dataSheet[s] = ws.getSheetByName(sheetNames[s]);

// writing data into new sheet
  var newSheet = ws.insertSheet().setName("Consolidated_Data");
   newSheet.getRange("A1:C1").setValues(header);

  var name = dataSheet[s].getRange("B1").getValue();
  var id = dataSheet[s].getRange("B3").getValue();
  var doj = dataSheet[s].getRange("B5").getValue();

 var faculty = [(name),(id),(doj)];//convert into array
 var facultycount = faculty.length;
  for (var i = 0; i < faculty.length; i++)

  //Loop through all rows and write them out starting on ROW2

 {
  newSheet.getRange(2 + i, 1).setValue(faculty[0]);//
  newSheet.getRange(2 + i, 2).setValue(faculty[1]);//
  newSheet.getRange(2 + i, 3).setValue(faculty[2]);// 

  }
  } 

Есть четыре вкладки, и я ожидаю увидеть результаты с каждой вкладки на вкладке Consolidated_Data. Но я видел только данные последней вкладки, которые вставлялись повторно. Кто-нибудь может помочь? Спасибо. Сводная таблица данных Пример отдельной вкладки

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Просматривая все ваши листы, вы не использовали фигурные скобки после for l oop -

for(var s in allsheets)

Таким образом, выполняется l oop, а значение s остается в последнем индексе allsheets.

Однако могу ли я предложить упрощенную версию, которую я тестировал -

function consolidateData () {

  const headers = ["Faculty Name", "Faculty ID", "Date of joining"];
  const rows = { "name": 0, "id": 2, "doj": 4 };
  const consolidatedSheetName = "Consolidated_Data";

  const ss = SpreadsheetApp.getActive();
  const sheets = ss.getSheets();
  let consolidatedValues = [];  

  // Setting headers
  consolidatedValues.push(headers); 

  // Fetching values
  for(let sheet of sheets) {

    if(sheet.getName()==consolidatedSheetName) { continue; }
    let data = sheet.getRange("B1:B5").getValues();
    let faculty = [ data[rows.name][0], data[rows.id][0], data[rows.doj][0] ];
    consolidatedValues.push(faculty);
  }

  // Adding to sheet
  let consolidatedSheet = ss.getSheetByName(consolidatedSheetName);
  if(!consolidatedSheet) {
    consolidatedSheet = ss.insertSheet().setName(consolidatedSheetName);
  }

  let range = consolidatedSheet.getRange(1, 1, consolidatedValues.length, consolidatedValues[0].length); // 1, 1, 3, 3
  range.setValues(consolidatedValues);
}
1 голос
/ 07 мая 2020

Проблема:

Здесь сценарий перезаписывает тот же диапазон:

newSheet.getRange(2 + i, 1).setValue(faculty[0]);

Решение:

Добавьте 1 для каждой добавленной строки:

newSheet.getRange(2 + i + s, 1).setValue(faculty[0]);

Или используйте sheet#appendRow()

newSheet.appendRow(faculty);

Если вы практикуете лучшие практики , ваш сценарий можно упростить следующим образом:

const consolidate = () => {
  const ws = SpreadsheetApp.getActiveSpreadsheet(),
    oldSheets = ws.getSheets(),
    newSheet = ws.insertSheet().setName('Consolidated_Data');

  newSheet.getRange(1, 1, 1 + oldSheets.length * 3, 3).setValues([
    ['Faculty Name', 'Faculty ID', 'Date of Joining'],
    ...oldSheets.map(sheet =>
      sheet
        .getRange('B1:B5')
        .getValues()
        .reduce((a, c, i) => (i % 2 === 0 ? [...a, c[0]] : a), [])
    ),
  ]);
};
...