0

У меня есть массив объектов под названием membership:Скрипт Google Apps: как скопировать массив объектов в диапазон?

[{name: 'Linus Pauling', address: '1805 Main Street', phone: '(615) 555-1010', 
    email: '[email protected]' }, 

{name: 'Maury Povich', address: '382 North Street', phone: '(423) 555-1997', 
    email: '[email protected]'}] 

(Хотя только 4 показаны здесь, у меня действительно есть десять пар ключ/значение на члена).

Что является лучшим способом для копирования битов этого массива в диапазон ячеек в Google Таблицах? Я пытаюсь найти метод для непосредственного вызова значений объекта и использовать метод .SetValues ​​для их массового копирования, а не по одному за раз.

Чтобы получить имена всех членов в колонке А, я пробовал:

sheet.getRange(1,1,membership.length,1).setValues(membership[{member.name}]); 

... который дает Missing : after property ID.

Или:

sheet.getRange(1,1,membership.length,1).setValues([membership[name]]); 

... который дает ReferenceError: «имя» не определено.

Или:

sheet.getRange(1,1,membership.length,1).setValues([member.name]); 

... который дает "Не удается преобразовать массив в Object [] []" ошибка.

Извиняюсь за вопрос новичка. Я видел answers о том, как копировать значения из многомерного массива в диапазон листа, но не массив объектов.

+0

Возможно, это поможет вставить ряд данных из объектов JSON: https://gist.github.com/mhawksey/1442370 –

ответ

2

Вы хотите производить таблицу в виде:

name | Address | phone | email 
-----+---------+-------+------ 
.... | .... | .... | .... 

и т.д.?

Если да, то может помочь следующий фрагмент. Главное, чтобы отметить здесь, что вы не можете ожидать данный заказ при итерации через объект. то есть просто потому, что ваше представление membership списков name первых, не означает, что если вы должны были использовать for ... in петлю можно гарантия что name вернется первый - Объекты в JavaScript являются неупорядоченный.

Для обеспечения заданного порядка список фрагментов I определяет массив headings, в котором вы указываете порядок столбцов, которые вы хотите в Листе.Это используется для гарантии порядок столбцов в выводе:

var membership = [ 
    { 
    name: 'Linus Pauling', address: '1805 Main Street', phone: '(615) 555-1010', 
    email: '[email protected]' 
    }, 
    { 
    name: 'Maury Povich', address: '382 North Street', phone: '(423) 555-1997', 
    email: '[email protected]' 
    } 
]; 

// Headings in the column order that you wish the table to appear. 
var headings = ['name', 'address', 'phone', 'email']; 
var outputRows = []; 

// Loop through each member 
membership.forEach(function(member) { 
    // Add a new row to the output mapping each header to the corresponding member value. 
    outputRows.push(headings.map(function(heading) { 
    return member[heading] || ''; 
    })); 
}); 

// Write to sheets 
if (outputRows.length) { 
    // Add the headings - delete this next line if headings not required 
    outputRows.unshift(headings); 
    SpreadsheetApp.getActiveSheet().getRange(1, 1, outputRows.length, outputRows[0].length).setValues(outputRows); 
} 

Выход есть:

enter image description here

+0

Спасибо. Я совершенно не знал о методе «карты», который здесь и требовался. – Suzanne

1

Как насчет следующего сценария? Этот скрипт является контейнером, связанным с таблицей. Есть 2 шаблона. Расположение данных различна для между шаблон 1 и 2.

Pattern 1 является enter image description here

Pattern 2 enter image description here

function main() { 
    var data = [{name: 'Linus Pauling', address: '1805 Main Street', phone: '(615) 555-1010', 
    email: '[email protected]' }, {name: 'Maury Povich', address: '382 North Street', phone: '(423) 555-1997', 
    email: '[email protected]'}]; 
    var sheet = SpreadsheetApp.getActiveSheet(); 

    var result = pattern1(data); 
    var result = pattern2(data); 

    sheet.getRange('a1').offset(0, 0, result.length, result[0].length).setValues(result); 
} 

function pattern1(data){ 
    var ar = []; 
    for (var i in data){ 
    for (var key in data[i]){ 
     ar.push([key, data[i][key]]); 
    } 
    } 
    return ar; 
} 

function pattern2(data){ 
    var ar = []; 
    var keys = []; 
    var values = []; 
    for (var i in data){ 
    for (var key in data[i]){ 
     if (i == 0) keys.push(key); 
     values.push(data[i][key]); 
    } 
    if (i == 0){ 
     ar.push(keys); 
     keys = []; 
    } 
    ar.push(values); 
    values = []; 
    } 
    return ar; 
} 

Если мое понимание ваших вопросов было не так, я извиняюсь.

0

Смотрите сценарий в нижней части Simple Mail Merge Tutorial для некоторого полезного кода для извлечения данных. Скопируйте весь код из этого комментария вниз:

////////////////////////////////////////////////////////////////////////////////////////// 
// 
// The code below is reused from the 'Reading Spreadsheet data using JavaScript Objects' 
// tutorial. 
// 
///////// 

///////////////////////////////////////////////////////////////////////////////// 

// getRowsData iterates row by row in the input range and returns an array of objects. 

После того, как вы имеете, getRowsData возвращает не только данные, но и второй элемент, который представляет собой список заголовков. Используя это, вы можете изменить код из @Bardy, чтобы разрешить заголовки в любом порядке, а также другие возможные столбцы между ними.

Смежные вопросы