如何在 Google Apps 脚本中转置和拆分?

Posted

技术标签:

【中文标题】如何在 Google Apps 脚本中转置和拆分?【英文标题】:How to transpose and split in Google Apps Script? 【发布时间】:2019-08-19 01:00:36 【问题描述】:

我正在使用 2 张纸,rawDataprocessedData

rawData 看起来像这样:

TitleOptionsTitle1Option1, Option2, Option3, Option4Title2Option1, Option2, Option3, Option4, Option5Title3Option1, Option2, Option3

processedData 应该是这样的:

TitleOptionsTitle1Option1Title1Option2Title1Option3Title1Option4987654342@ @Option1Title2Option2Title2Option3Title2Option4Title2Option5@9876543535@3 br>Title3Option2Title3Option3

在 Google 表格中,我会使用公式 =TRANSPOSE(SPLIT(rawData!B2,",",TRUE,TRUE)) 以我需要的格式获取第一个标题的选项。

我正在尝试创建一个 Google Apps 脚本,它可以获取rawData 的每一行并将其转换为processedData 中显示的格式。

function formatData() 
  // File
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // Get rawData sheet
  var rawData = ss.getSheetByName('rawData');

  // Get processedData sheet
  var processedData = ss.getSheetByName('processedData');

  // Get range that contains titles, get its values
  var titlesRange = rawData.getRange('A2:A');
  var titlesRangeValues = titlesRange.getValues();

  // Get range that contains options, get its values
  var optionsRange = rawData.getRange('B2:B');
  var optionsRangeValues = optionsRange.getValues();

  // Get number of rows in rawData sheet
  var titlesCount = GSheetsUtils.getRowsData(rawData);

  // Get last row in processedData sheet
  var lastRow = processedData.getLastRow();

  // Copy each title to processedData and format the options
  for (var i = 0; i<titlesCount.length; i++) 
    processedData.getRange(lastRow + 1,1).setValue(titlesRangeValues[i][0]);
    processedData.getRange(lastRow + 1,2).setValue(optionsRangeValues[i][0]);
    lastRow++;
  

执行此代码将填充processedData,如下所示:

TitleOptionsTitle1Option1, Option2, Option3, Option4Title2Option1, Option2, Option3, Option4, Option5Title3Option1, Option2, Option3

如何让脚本拆分和转置选项,但为每个选项编写相同的标题?

提前谢谢你。

PS:代码可能效率不高,我认为它缺乏任何最佳实践,这是我第一次使用 Google Apps 脚本,所以如果有人有任何指示,我将不胜感激。我一直在浏览 Google 的文档,但我需要继续阅读。

【问题讨论】:

【参考方案1】:

解决这个问题的一种方法是

    拆分选项值 然后构建一个包含两列和 13 行(在本例中)的输出数组

Best practices 建议尽量减少对工作表的调用。

因此,您的脚本的以下变体可以完成上述所有操作:

function formatData() 

  // File
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // Get rawData sheet
  var rawData = ss.getSheetByName('rawData');

  // Input data
  var data = rawData.getRange("A2:B").getValues(); // Gets titles and options in a single call to the sheet

  // Initialise an array that will hold the output
  var outputArray = [];

  // Name a variable to hold the data from each set of options
  var options;

  // Start looping through the data
  for (var row = 0; row < data.length; row++) 

    // Split the options into an array: "Option1, Option2, Option3" ---> [Option1, Option2, Option3]
    options = data[row][1].split(", ");

    // Loop through the array of split options and place each of them in a new row
    for (var element = 0; element < options.length; element++) 

      outputArray.push([data[row][0], // Place the title in a new row
                        options[element]]); // Place one option in the 2nd column of the row

     // Options loop ends here

   // Data loop ends here

  // Get processedData sheet
  var processedData = ss.getSheetByName('processedData');

  // Get last row in processedData sheet
  var lastRow = processedData.getLastRow();

  // Post the outputArray to the sheet in a single call
  processedData.getRange(lastRow + 1, 1, outputArray.length, outputArray[0].length).setValues(outputArray);

【讨论】:

感谢您的帮助,这正是我所需要的。 如果我只想打印一次标题而不是为每个选项打印一次,我该怎么做?我想我需要将它移到选项循环之外,但是第一个 .push() 使用一行打印标题,第二个 .push() 转到下一行打印选项。

以上是关于如何在 Google Apps 脚本中转置和拆分?的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 T-SQL 中转置和创建枢轴

如何通过 Apps 脚本在 Google 表格中“清除格式”

在Python中转置和乘以列表

Google Apps 脚本:Google 表格分组

如何在 Google Apps 脚本中使用服务帐户对 Google 表格进行身份验证

如何使用 Google Apps 脚本在个人 Google 云端硬盘和团队云端硬盘之间移动文件?