Linked Google Sheet: https://docs.google.com/spreadsheets/d/1j2P2V0SCiE7QtK7kdCorpLfYQPFRghKMw4tuCYbqce0/edit?usp=sharing
I have a form that outputs all products and qua
You might be interested in a more general solution, rather than one that needs to rely on knowing the specific phrased in the input strings.
This kvStringToArray()
function will return an array that can be written directly to a spreadsheet use Range.setvalues()
. It's pure JavaScript, so it can also be used outside of the Google Apps Script environment.
A RegExp is used to successively identify key:value pairs in the input data, and the function assumes that there are "rows" of information that can be identified by repeats of already-discovered "keys".
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>
Here is some code that I've tested and it works. The code removes all the words "Product: ", and replaces them with a comma. Then the code does something similar with the string "Quantity: ", replacing it with an empty string. Next it creates an array, and converts the array to a two dimensional array, so that the rows and columns can be written all in one action.
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);
};