Массивы в Google Scripts - PullRequest
       4

Массивы в Google Scripts

0 голосов
/ 25 апреля 2018

Я борюсь с массивами в скриптах Google.Допустим, у меня есть диапазон: «A1: B4».| Столбец A | Столбец B || name1 | value1 || name1 | value2 || name2 | value3 || name2 | value4 |

 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

Я сделал это

 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];  
    }   
 }

ИЯ получаю второе измерение. Я получаю первые символы из первого измерения, и я не могу изменить значение после него, например. Вместо value1 on:

array[0][0]

У меня есть n только (первая буква от имени1)

Я буду признателен за любую идею.

@ EDIT
enter image description here

Хорошо, спасибо всемдля ответов, но это не так (или я слишком глуп, чтобы понять).У меня есть эта таблица, что мне нужно сделать, это сделать один массив, где car1 равно array[0], car2 равно array[1] и т. Д., И каждое значение в B уникальная дата (array[0][0] -> одна дата для car1 , array[0][1] другого дня, но все еще для car1 , а затем в третьем измерении суммируются все значения из столбца C, но с зависит от той же даты.Я надеюсь, что это достаточно ясно.

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Задача состоит в том, чтобы объединить массивы с потенциально одинаковыми значениями.Вы можете использовать рекурсивную проверку для сравнения массивов перед объединением.

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]]
}
0 голосов
/ 25 апреля 2018

Ваша проблема в том, что «2D» массив Javascript (то есть массив в Google Apps Script) не имеет значений в первом измерении. Первое измерение - это просто строка данных, с которой вы работаете, в виде массива значений. Все данные находятся в этом внутреннем массиве:

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 Справочнике разработчика. Одной из таких ссылок является MDN .

0 голосов
/ 25 апреля 2018

Вот как вы можете это сделать,

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
}

Вот образец электронной таблицы, который я использовал.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...