【问题标题】:Google Sheets query, transpose, split, flatten?谷歌表格查询、转置、拆分、展平?
【发布时间】:2021-09-06 21:11:53
【问题描述】:

我不是程序员,但我想为我的学校做以下事情:我们有一个 Google 表格文件(从 Google 表单自动生成和实时更新),它输出如下内容:

Output from Google Form

我想在单独的表格中引用该数据并使其看起来像这样:

What I want it to look like

我已经花了几个小时挖掘我们的这个网站和其他人试图找到解决方案,但我迷失在一种我不知道的语言中......提供的任何帮助将不胜感激!

【问题讨论】:

  • 所以你想做一个反向数据透视表
  • 从我所读到的——是的。我只是不知道如何编码。有什么例子可以指点我吗?
  • 作为一个提示,我将使用 Class (它是来自 onFormSubmit 对象的 e.values[1] 作为属性名称,如果该属性不存在,那么我将创建一个并将其设为数组并以逗号分隔内容并将它们推送到该属性的数组中。我还将使用一个对象数组来保存所有属性的列表,以便稍后将它们列出来。如果属性已经存在,我只会拆分内容并将它们推送到该属性的数组中。如果您喜欢使用对象,您应该没有问题。我会将所有名称放在同一列中。
  • 如果您将数据作为表格发布以便我们可以复制它,我想有人最终会给您一个示例代码。
  • 感谢您的建议,库珀。这是我的表的链接:docs.google.com/spreadsheets/d/…

标签: google-apps-script google-sheets google-sheets-formula


【解决方案1】:

试试

={"Class","Name";ARRAYFORMULA(split(flatten(Data!B2:B4&"|"&arrayformula(trim((split(transpose(query(transpose(Data!C2:E4),,columns(Data!C2:E4))),","))))),"|"))}

【讨论】:

    【解决方案2】:

    我的 Google 表单回复表也需要同样的东西。这是一段代码。

    function findTransLoc(inId) {
      console.log('Begin findTransLoc');
      const ui = SpreadsheetApp.getUi();
    
      console.log('                    inId: ', inId );  
      const destSs = SpreadsheetApp.openById(inId)
      let srcShtNm = getTabNm(destSs)
      
      let srcSht = destSs.getSheetByName(srcShtNm);
      const destShtNm = srcShtNm + 'xd';
      let destSht = destSs.getSheetByName(destShtNm);
      if ( destSht ) {
        console.log('clearing existing destination sheet: ', destShtNm  );
        destSht.clear();
      }    else    {
        destSht = destSs.insertSheet(destShtNm);
      }
       
      var srcRng = srcSht.getDataRange();
      var srcRows = srcRng.getLastRow();
      console.log('srcRows: ', srcRows );
      var srcCols = srcRng.getLastColumn();;
      console.log('srcCols: ', srcCols );
      var srcDataArr = srcRng.getValues();
      var resultArr = [],promptList;
      for (var col = 0; col < srcCols; col++) { // Loop over array cols
        resultArr[col] = [];
        for (var row = 0; row < srcRows; row++) { // Loop over array rows
          console.log('row: ', row, ' col: ', col, ' ', srcDataArr[row][col] );
          resultArr[col][row] = srcDataArr[row][col].toString(); // Rotate
        }
      }
      console.log('resultArr: ' , JSON.stringify(resultArr) );
      destSht.getRange(1, 1, srcCols, srcRows ).setValues(resultArr);
    }
    

    我将它概括为让我选择电子表格中的任何选项卡,所以有这个代码

    function getTabNm(destSs)  {
      console.log('Begin getTabNm');
      const ui = SpreadsheetApp.getUi();
      var sheetList = [], tabNm, promptList = '', i = 1, srcSht;
      destSs.getSheets().forEach(function(val){
        tabNm = val.getName();
        promptList = promptList + i + ': ' + tabNm + '\n';
        sheetList.push([i,tabNm]);
        i++
      });
      
      console.log('promptList: ', promptList );
      console.log( JSON.stringify(sheetList) );  
      
        let result = ui.prompt(
        'Which tab do you want to work with? Enter the number?\n' +
        promptList +
        '\n_____Click close button or cancel with the X to quit.',
        ui.ButtonSet.OK_CANCEL);
    
      // Process the user's response.
      let button = result.getSelectedButton();  
      let inTxt = result.getResponseText();
      let parsed = parseInt(inTxt, 10);
      if (isNaN(parsed)) { parsed = 0; }
      console.log('inTxt: ', inTxt, ' parsed: ', parsed );
      srcShtNm = sheetList[parsed-1][1];  // zero based array
      console.log('returning  srcShtNm: ', srcShtNm ); 
      return srcShtNm;
    }
    

    如果您不想要这个,请拨打 getTabNm:

      let srcShtNm = getTabNm(destSs)
      let srcSht = destSs.getSheetByName(srcShtNm);
    

    并添加这一行以获取当前工作表。

    let srcSht = destSs.getActiveSheet();
    

    我还有很多其他的“花里胡哨”,您可能会对我的代码感兴趣。如有问题或建议,请随时复制并与我交流。

    https://docs.google.com/spreadsheets/d/1Amy8LgeCdl8RsDr98pEVXVSqrMzGqMc_VuLYQy94mC8/edit?usp=sharing

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多