关联的Google表格:https://docs.google.com/spreadsheets/d/1j2P2V0SCiE7QtK7kdCorpLfYQPFRghKMw4tuCYbqce0/edit?usp=sharing
我有一个表单,可以将所有产品和数量输出到一个单元格中:
"产品:NF900XC,数量:3 产品:NF900,数量:2 产品:N1930CB,数量:2 产品:N2120,数量:1 产品:NLPCR200,数量:2 产品:N272,数量:2"
我需要各自的产品和数量以及相应的相关数据集。
我希望将内容(列O)拆分为各自的列:
W/BroadcastQueue: Reject to launch app .../10186 for broadcast: App Op 60
我在名字姓氏上使用了{{1}}命令,但我不确定在这种情况下如何将其余文本解析为行和列。
我还将在功能上复制带有时间戳的行
A栏
提交日期
对应于产品:单元格O中的数量
我希望这是有道理的。
答案 0 :(得分:2)
以下是我测试过的一些代码,它可以运行。代码删除了所有单词" Product:",并用逗号替换它们。然后代码执行与字符串" Quantity:"类似的东西,用空字符串替换它。接下来,它创建一个数组,并将数组转换为二维数组,以便可以在一个动作中写入行和列。
function convertData() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName('Form Submission');
var data = sh.getRange("O2").getValue();
//Logger.log(data);
var firstProductRemoved = data.replace("Product: ", "");
//Logger.log(firstProductRemoved);
var allProductReplacedWithComma = firstProductRemoved.replace(/Product: /g,",");
//Logger.log(allProductReplacedWithComma);
var allQuantityReplacedWithNothing = allProductReplacedWithComma.replace(/Quantity: /g,"");
//Logger.log(allQuantityReplacedWithNothing);
var dataAsArray = allQuantityReplacedWithNothing.split(",");
var outerArray = [], innerArray = [];
var i=0;
for (i=0;i<dataAsArray.length;i+=2) {
innerArray = []; //reset every loop
innerArray.push(dataAsArray[i]);
innerArray.push(dataAsArray[i+1]);
outerArray.push(innerArray);
};
//Logger.log(outerArray);
var orderItemsSh = ss.getSheetByName('Order Items');
orderItemsSh.getRange(orderItemsSh.getLastRow()+1, 15,outerArray.length, 2).setValues(outerArray);
};
答案 1 :(得分:0)
您可能对更通用的解决方案感兴趣,而不是需要依赖于知道输入字符串中特定措辞的解决方案。
此kvStringToArray()
函数将返回一个数组,该数组可以直接写入使用Range.setvalues()
的电子表格。它是纯JavaScript,因此也可以在Google Apps脚本环境之外使用。
RegExp用于连续识别输入数据中的键:值对,并且该函数假定有“行”信息可以通过重复已发现的“键”来识别。
var formInput = "Product: NF900XC, Quantity: 3 Product: NF900, Quantity: 2 Product: N1930CB, Quantity: 2 Product: N2120, Quantity: 1 Product: NLPCR200, Quantity: 2 Product: N272, Quantity: 2";
snippet.log(
JSON.stringify(
kvStringToArray(formInput)));
/**
* Convert a given string of key:value pairs into a two-dimensional
* array, with keys as headers, and "items" as rows.
* From: http://stackoverflow.com/a/34847199/1677912
*
* @param {string} str A string containing key:value pairs.
*
* @returns {string[][]} A two-dimensional array of strings.
*/
function kvStringToArray( str ) {
var re = /\s*(\w*?)\s*:\s*([^,\s]*)/g, // See https://regex101.com/r/kM7gY1/1
arr, // array to capture key:value pairs
data = [], // array to return table
row = [], // array for building table rows
headers = []; // array of unique keys, for table header
// Use a RegEx to identify individual key:value pairs
while ((arr = re.exec(str)) !== null) {
var key = arr[1]; // $1 matches key
var value = arr[2]; // $2 matches value
// Check if we should start a new row
if (headers.indexOf(key) == 0) {
data.push(row);
row = [];
}
// Save this value in row
row.push(value);
// If this is the first time we've seen this key, add it to headers.
if (headers.indexOf(key) == -1) headers.push(key);
}
data.push(row); // save last row
data.unshift(headers); // add headers
return data;
}
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>