我在谷歌脚本中苦苦挣扎。
假设我有范围:“A1:B4”。
|列A |列B |
| name1 | value1 |
| name1 | value2 |
| name2 | value3 |
| name2 | value4 |
q
所以,我必须做一个看起来像这样的数组:
var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Arkusz1");
var range = ss.getRange("A1:B4").getValues();
var array = [[]];
我做了这个
array[0] = name1
array[0][0] = value1
array[0][1] = value2
array[1] = name2
array[1][0] = value3
array[1][1] = value4
我正处于第二个维度,我从第一个维度获得第一个字符,我无法更改其后的值,例如而不是 value1 :
for(var i = 0; i < range.length; i++)
{
array[i] = range [i][0];
for(var j = 0; j < range[i].length; j++)
{
array[i][j] = range[i][j];
}
}
我只有 n (来自name1的第一个字母)
我会很感激。
@EDIT
好的,谢谢大家的答案但不是它(或者我太愚蠢了解)。我有这个表,我需要做的是创建一个数组,其中 car1 是array[0][0]
, car2 是array[0]
等,B中的每个值是唯一的日期(array[1]
- &gt; car1 的一个日期,array[0][0]
不同的日期,但仍然是 car1 然后,在第三个维度汇总列C中的所有值,但取决于相同的日期。我希望它足够清楚。
答案 0 :(得分:1)
以下是如何做到的,
function myFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var range = ss.getDataRange().getValues();
var array = [[]];
for(var i = 0; i < range.length; i++)
{
array[i] = range [i];
}
Logger.log(array[0][0]); //prints A1
Logger.log(array[0][1]); //prints B1
}
这是我使用的电子表格示例。
答案 1 :(得分:1)
您的问题是“2D”Javascript数组(即Google Apps脚本中的数组)在第一维中没有值。第一个维度只是您正在处理的数据行,采用值数组的形式。所有数据都在这个内部数组中:
var arr = sheet.getDataRange().getValues();
for (var r = 0, numRows = arr.length; r < numRows; ++r) {
// This will log an Array, e.g. [Car1, timestamp, 1324], in a single line.
Logger.log(arr[r]);
// This loop over the inner array will log Car1, then timestamp, then 1323, each on its own line.
for (var c = 0, numCols = arr[0].length; c < numCols; ++c)
Logger.log(arr[r][c]);
}
使用Object
而非Array
似乎最容易解决您的(相当不清楚)预期用途。 Object
可以具有用户定义的属性,这些属性本身可以包含属性。例如,也许您想要组装一个Object
来映射您拥有的所有不同的汽车,然后对于每辆汽车,您想知道它们被驱动的日期,以及每个日期驱动的行驶里程数。构建这样的Object
看起来像这样:
// Create an empty Javascript Object and read data from the sheet.
var carHistory = {}, data = sheet.getDataRange().getValues();
// Remove the header row from the data array.
var headers = data.splice(0, 1)[0];
// Determine the appropriate columns needed.
var carIndex = headers.indexOf("carId");
var dayIndex = headers.indexOf("Date Driven");
var milesIndex = headers.indexOf("Miles");
// Build the object by parsing all rows of data.
for (var r = 0; r < data.length; ++r) {
var row = data[r], id = row[carIndex];
// If this car has not been seen, add it, and initialize its properties.
if (!carHistory[id]) carHistory[id] = {"total miles": 0, days: {}};
// If this day has not been seen, add it.
var drivenOn = row[dayIndex];
/* Assumption: stored a string of the date that does not
parse into a Date object (like a timestamp would) */
if (!carHistory[id].days[drivenOn]) carHistory[id].days[drivenOn] = 0;
// Increment the total and the daily miles.
var miles = row[milesIndex];
carHistory[id]["total miles"] += miles;
carHistory[id].days[drivenOn] += miles;
}
// Log the report:
for (var car in carHistory) {
Logger.log("%s drove %s total miles", car, carHistory[car]["total miles"]);
for (var day in carHistory[car].days)
Logger.log("%s drove %s on day %s", car, carHistory[car].days[day], day);
}
您应该在首选的Javascript Developer Reference中阅读有关对象的更多信息。 One such reference is MDN
答案 2 :(得分:0)
挑战在于将数组与潜在的相同值组合在一起。您可以使用递归检查来比较组合之前的数组。
function checkVal(a, b) {
// Looping through will return a blank array on the last line. Break early.
if(b !== undefined) {
// Check the first value in each array. If they're the same, combine and return.
if(a[0] == b[0]) {
a.push(b[1])
return a
}
}
}
function coerce() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet7")
// This returns a 2D array
var range = sheet.getDataRange().getValues();
// Initialize a new array
var array = [];
for(var i=0; i<range.length; i++) {
// Compare two rows
var combined = checkVal(range[i], range[i+1])
// If you get a new array, push it to [array]
if(combined) {
array.push(combined)
}
}
Logger.log(array) // Logs [[Name 1, Value 1, Value 2], [Name 2, Value 1, Value 2]]
}