如何在 Google Apps 脚本中转置和拆分?
Posted
技术标签:
【中文标题】如何在 Google Apps 脚本中转置和拆分?【英文标题】:How to transpose and split in Google Apps Script? 【发布时间】:2019-08-19 01:00:36 【问题描述】:我正在使用 2 张纸,rawData
和 processedData
。
rawData
看起来像这样:
Title
Options
Title1
Option1, Option2, Option3, Option4
Title2
Option1, Option2, Option3, Option4, Option5
Title3
Option1, Option2, Option3
processedData
应该是这样的:
Title
Options
Title1
Option1
Title1
Option2
Title1
Option3
Title1
Option4
987654342@ @Option1
Title2
Option2
Title2
Option3
Title2
Option4
Title2
Option5
@9876543535@3 br>Title3
Option2
Title3
Option3
在 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
,如下所示:
Title
Options
Title1
Option1, Option2, Option3, Option4
Title2
Option1, Option2, Option3, Option4, Option5
Title3
Option1, 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 脚本中转置和拆分?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Apps 脚本在 Google 表格中“清除格式”