Google apps script 如何将一列数据转换为一行数据,使用空单元格作为指示符来启动新行?

Google apps script 如何将一列数据转换为一行数据,使用空单元格作为指示符来启动新行?,google-apps-script,google-sheets,Google Apps Script,Google Sheets,首先,这是我的工作表,其中给出了两组数据的示例,以及每个数据的预期结果 这是我现在掌握的代码。它没有处于工作状态,但似乎很接近。将在我尝试不同解决方案时进行编辑 // on open, add menu and bttons to test functions function onOpen() { var spreadsheet = SpreadsheetApp.getActive(); var menuItems = [ {name: 'Analyze and flip d

首先,这是我的工作表,其中给出了两组数据的示例,以及每个数据的预期结果

这是我现在掌握的代码。它没有处于工作状态,但似乎很接近。将在我尝试不同解决方案时进行编辑

// on open, add menu and bttons to test functions
function onOpen() {
  var spreadsheet = SpreadsheetApp.getActive();
  var menuItems = [
    {name: 'Analyze and flip data selection', functionName: 'flipSelection'},
    {name: 'Check for first empty cell', functionName: 'firstEmptyCell'}
  ];
  spreadsheet.addMenu('Scripts', menuItems);
}


// put data from a column into a row. on a blank line, write to new row
function flipSelection() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var testSheet = ss.getSheetByName("test");
  var sheet = ss.getSheetByName("main");
  var range = sheet.getActiveRange();
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  var data = [];

  // check active range(current selection) for values and store them in data array
  for (var i = 1; i < numRows; i++){
    for (var j = 1; j < numCols; j++) {
      var currentValue = range.getCell(i,j).getValue();
      data.push(currentValue);
    }
  }

  // log array to verify accurate data
  for (var k = 0; k < data.length; k++){
    ss.toast(data[k].toString());
    Logger.log(data[k].toString());
  }

  // for each string in data array, write to next cell. if the string is blank, go to next row and write to next cell (recursion??)
  for (var n = 0; n < data.length; n++) {
    // Do we have data? If not, move on
    if (data[n] == "") {
      //target next empty row (need help here!)
      continue;
    }

    const colA = testSheet.getRange('A:A').getValues().join().split(",");
    const rowIndex = colA.indexOf('');
    const colIndex = firstEmptyCell(rowIndex); // assuming firstEmptyCell works correctly
    const targetCell = testSheet.getRange(rowIndex, colIndex);

    targetCell.setValue(data[n]);
  }




}


// a way to find first empty cell 
function firstEmptyCell (emptyRow) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var testSheet = ss.getSheetByName("test");
  var range = testSheet.getRange(emptyRow, 1, 1, testSheet.getMaxColumns());
  var vals = range.getValues();

  // Get the index of the first empty cell from the waarden array of values
  var emptyCell = vals[0].indexOf("");

  // log the index of empty cell
  ss.toast("The index of the first empty cell is: " + emptyCell.toString());
  Logger.log("The index of the first empty cell is: %s", emptyCell);
  return emptyCell;
}
//打开时,将菜单和btton添加到测试函数中
函数onOpen(){
var电子表格=SpreadsheetApp.getActive();
变量菜单项=[
{name:'分析和翻转数据选择',functionName:'翻转选择'},
{name:'检查第一个空单元格',functionName:'第一个空单元格'}
];
电子表格.addMenu(“脚本”,菜单项);
}
//将列中的数据放入行中。在空行上,写入新行
函数flipSelection(){
var ss=SpreadsheetApp.getActiveSpreadsheet();
var testSheet=ss.getSheetByName(“测试”);
var sheet=ss.getSheetByName(“主”);
var range=sheet.getActiveRange();
var numRows=range.getNumRows();
var numCols=range.getNumColumns();
var数据=[];
//检查值的活动范围(当前选择)并将其存储在数据数组中
对于(变量i=1;i
尝试以下代码:

function onOpen() {
  var spreadsheet = SpreadsheetApp.getActive();
  var menuItems = [
    {name: 'Analyze and flip data selection', functionName: 'flipSelection'},
  ];
  spreadsheet.addMenu('Scripts', menuItems);
}

function flipSelection()
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet= ss.getSheetByName("src");
  var destSheet= ss.getSheetByName("dest");
  //get datas
  var datas = sheet.getDataRange().getValues();
  var destDatas = [];
  var row = [];
  var max = 0;
  var i = 0;
  //start is to check if it's the beginning of parse meaning no previous data
  var start = true;
  //parse columns first then rows
  for (var c = 0; c < datas[0].length; c++)
  {
    for (var r = 0; r < datas.length; r++)
    {
      //if cell is blank or beginning of new column
      if (datas[r][c] == "" || !r)
      {
        i = 1;
        //if it's not the beginning of program then add previous row to final data array.
        if (!start)
        {
          destDatas.push(row);
        }
        //if it's a blank cell then add skip it
        if (r)
          r++;
        //create a new row with first value inside of it
        row = [datas[r][c]];
        start = false;
      }
      //if it's not the beginning of a new column and the cell is not empty
      else
      {
        //increment index columns of one
        i++;
        // Basically if there's more value than last time then set column length to column index
        if (i >= max)
          max = i;
        //add new data to row array
        row.push(datas[r][c])
      }
    }
  }
  //condition to push previous and last row into final data array
  if(row)
    destDatas.push(row);
  //set final data array length to the same size 
  for(var i = 0; i < destDatas.length; i ++)
    for (var j = (destDatas[i].length); j < max; j++)
      destDatas[i].push("");
  //set destination range and set values.
  destSheet.getRange(1, 1, destDatas.length, max).setValues(destDatas);
}
函数onOpen(){ var电子表格=SpreadsheetApp.getActive(); 变量菜单项=[ {name:'分析和翻转数据选择',functionName:'翻转选择'}, ]; 电子表格.addMenu(“脚本”,菜单项); } 函数flipSelection() { var ss=SpreadsheetApp.getActiveSpreadsheet(); var sheet=ss.getSheetByName(“src”); var destSheet=ss.getSheetByName(“dest”); //获取数据 var data=sheet.getDataRange().getValues(); var destDatas=[]; var行=[]; var max=0; var i=0; //开始是检查它是否是解析的开始,这意味着没有以前的数据 var start=true; //先分析列,然后分析行 对于(var c=0;c=max) max=i; //向行数组添加新数据 行推送(数据[r][c]) } } } //将上一行和最后一行推入最终数据数组的条件 国际单项体育联合会(世界其他地区) destDatas.push(行); //将最终数据数组长度设置为相同的大小 对于(变量i=0;i
我已请求书面许可