2012-06-16 3 views
3

ПРЕДПОСЫЛКИ. Я хочу изменить расписание из недельного формата (каждая строка показывает 7 дней, дата не доступна только в неделю с yyww (например, 1225). В другом листе один столбец показывает неделю, а другой - даты.От Array до setValues ​​дает: «Невозможно преобразовать».

МЕТОД . Я беру эти два листа в двух массивах, пакет третьего массива, какие значения я поставил в третий лист

ПРОБЛЕМА Эта строка выдает сообщение об ошибке:.. «не может преобразовать в»

sheet_IndataTabell.getRange(1,1,IndataTable.length+1,7).setValues(IndataTable); 

Источник . Вы можете увидеть документ here и полную функцию ниже:

function UpdateTable() { 
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet_Indata = ss.getSheetByName("Indata"); 
var sheet_IndataTabell = ss.getSheetByName("Indata_Tabell"); 
var sheet_Calendar = ss.getSheetByName("Kalender"); 

//Get the table into arrays 
var Indata = sheet_Indata.getDataRange(); 
var CalendarTable = sheet_Calendar.getDataRange(); 

//Gets the values in the Indata to an Array 
var NumberRows = Indata.getLastRow(); 
var NumberCols = Indata.getLastColumn(); 
//Browser.msgBox(NumberRows + " " + NumberCols); 
var IndataArray = new Array(NumberRows,NumberCols); 
var IndataArray = Indata.getValues(); 

//Create an Array to store the result 
var IndataTable = new Array(((NumberCols-1)*(NumberRows-1)),7); 
//Browser.msgBox("First the IndataTable is defined as: (NumberCols-1)*(NumberRows-1) (" + (NumberCols-1)*(NumberRows-1) + ")."); 

//Gets the values in the Calendar to an Array 
var NumberRows_Cal = CalendarTable.getLastRow(); 
var NumberCols_Cal = CalendarTable.getLastColumn(); 
//Browser.msgBox(NumberRows + " " + NumberCols); 
var CalendarArray = new Array(NumberRows_Cal,NumberCols_Cal); 
var CalendarArray = CalendarTable.getValues(); 

for (i=1; i<(IndataArray.length); i++) 
{ 

    for (j=3; j<10; j++) { 

    IndataTable[i*7+j-3-7] = {}; 

    //adds the users 
    IndataTable[i*7+j-3-7][0] = IndataArray[i][1]; 

    //adds the week numbers 
    var Vecka = IndataArray[i][2]; 
    IndataTable[i*7+j-3-7][1] = Vecka; 

    //adds the hours 
    IndataTable[i*7+j-3-7][2] = IndataArray[i][j]; 

    //adds the projects 
    IndataTable[i*7+j-3-7][3] = IndataArray[i][10]; 

    //adds the day 
    var Dag = (j-2); 
    IndataTable[i*7+j-3-7][4] = Dag; 

    //Gets the date from the Calendar 
    IndataTable[i*7+j-3-7][5] = "=VLOOKUP(G" + (i*7+j-9) + ";Kalender!$B$1:C;2)+E" + (i*7+j-9) + "-1"; 

    IndataTable[i*7+j-3-7][6] = Vecka+"_"+Dag; 

    //Browser.msgBox("[" + (i*7+j-3-7) + "][n]: " + IndataTable[i*7+j-3-7][0] + ", " + IndataTable[i*7+j-3-7][1] + ", " + IndataTable[i*7+j-3-7][2] + ", " + IndataTable[i*7+j-3-7][3] + ", " + IndataTable[i*7+j-3-7][4] + ", " + IndataTable[i*7+j-3-7][5] + ", " + IndataTable[i*7+j-3-7][6]); 

    } 

} 


sheet_IndataTabell.clear(); 
//Browser.msgBox("IndataTable.length: " + IndataTable.length); 
//Browser.msgBox("IndataTable[0].length: " + IndataTable[0].length); 
//Browser.msgBox("Last row on Range: " + sheet_IndataTabell.getRange(1, 1, IndataTable.length,7).getLastRow()); 
//Browser.msgBox(IndataTable); 

sheet_IndataTabell.getRange("A1:G28").setValues(IndataTable); 

//sheet_Indata.sort(3,true); 

//Browser.msgBox("Uppdatering klar!"); 
sheet_IndataTabell.getRange("J1").setValue(Date()); 

} 

ответ

15

setValues() и getValues() всегда использовать 2 размерные массивы, даже если диапазон только одна строка с высоким, так что вы должны использовать: (. Обратить внимание на пару скобок, которые я добавил)

LINE 212  sheet_IndataTabell.getRange(1, 1, 1, 2).setValues([IndataTable_Temp]) 

Кроме того, даже если это не проблема, вам не нужно, чтобы определить размер массива перед использованием Range.getValues(), просто перенесите (NumberRows_Cal,NumberCols_Cal) вы положили в качестве параметров,

var CalendarArray = new Array() 

достаточно.

EDIT: о Вашем комментарии: Пожалуйста, добавьте эти двух Logger.log в коде в строке 225, когда вы получаете ваши 2 массивов, один из которых не полезных в setValues ​​(), и вы увидите, что случилось:

Logger.log(IndataTable);//this one contains JS objects between {} 
    Logger.log(IndataTable_Temp);// this one contains array elements between [[]] 
    //Writes the array content to the sheet 
    sheet_IndataTabell.getRange(1, 1, i, 11).setValues(IndataTable_Temp); 

EDIT2: Я сделал небольшое изменение в конце сценария, теперь данные чистые строки и массив реального 2D (смотреть снова скобки):

//Reconstruction the Array, I do not know why this is needed 
    var IndataTable_Temp = new Array(); 
    for (i=0; i<IndataTable.length; i++) { 
// Logger.log(typeof(IndataTable[i][0])) 
    IndataTable_Temp.push([ 
     IndataTable[i][0], 
     IndataTable[i][1], 
     IndataTable[i][2], 
     IndataTable[i][3], 
     IndataTable[i][4], 
     IndataTable[i][5], 
     IndataTable[i][6], 
     IndataTable[i][7], 
     IndataTable[i][8], 
     IndataTable[i][9], 
     IndataTable[i][10] 
    ]); 
    } 
    Logger.log(IndataTable) 
    Logger.log(IndataTable_Temp) 
    //Writes the array content to the sheet 
    sheet_IndataTabell.getRange(1, 1, IndataTable_Temp.length, IndataTable_Temp[0].length).setValues(IndataTable_Temp); 

    //Sets timestamp 
    sheet_IndataTabell.getRange("L1").setValue(Date()); 
+0

Спасибо за ответ, Serge. Я пробовал это, но это не сработало. Массив уже представляет собой 2D-массив (я думаю), но некоторые как в неправильном формате. То, что я закончил, - это перебрать массив и создать новый, используя формат [[a, b, c], [d, e, f]]. Это сработало, но было бы неплохо понять, почему первый массив находится в неправильном формате. Ps. Да, я сделал некоторое упрощение сейчас :) Это мой первый скрипт когда-либо;) – user1460248

+0

- это ваша онлайн-копия, обновленная с новым сценарием? –

+0

Также: не стесняйтесь использовать Logger.log (имя переменной), чтобы увидеть, например, если массив 1D или 2D .... очень полезен ;-) –

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