2013-02-22 7 views
1

스크립트로 생성 된 배열이 있는데 다음 배열을 새 배열에 복사 한 후 다음 함수를 사용하여 scriptDb에 저장하려고합니다.ScriptDb에 배열을 저장할 때 오류가 발생했습니다.

Invalid argument. Expected a javascript map object.

합니까 ScriptDb에이 배열을 저장하는 문제가있다 : 그것은 var id = db.save(copyArray);에 도달 할 때

function copyAndStore (currentArray) { 
    var db = ScriptDb.getMyDb(); 
    var copyArray = []; 
    for (var i in currentArray) { 
    copyArray.push(currentArray[i]); 
    } 
    var id = db.save(copyArray); 
    return id; 
} 

이 복사 모든 것이 제대로하지만 난 오류가? 도움에 미리 감사드립니다.

+0

'currentArray'의 내용은 무엇입니까? –

+0

currentArray는 여러 부서 (이름, 멤버 수, 월간 방문수 등)에 대한 정보 및 통계가 포함 된 개체의 배열입니다. –

+1

네이티브 Date 객체를 저장하려고하지 마십시오. 침묵하고 모호한 오류가 발생할 수 있습니다. – Jonathon

답변

5

@Thomas가 말했듯이지도 객체에 배열을 저장할 수 있습니다.

개체를 ScriptDB에 넣기 전에 복사 작업을 수행 할 필요가 없습니다. 단순히 db.save({myArray})으로 배열을 저장하고 ID를 기억할 수 있습니다.

다음은 최소한의 코드를 보여줍니다. 저장된 배열을 검색하는 두 가지 방법을 제시합니다. 하나는 ID로, 사용자가 계획했던 것처럼 보이지만, 두 번째 방법은 "키"값을 쿼리에 사용하는 것입니다. 나중에 코드에서 ScriptDB의 내용을 가져올 것으로 예상되는 경우이 방법을 사용하면 저장된 배열의 ID를 어떻게 든 기억할 필요가 없습니다. 여기

function saveArray (currentArray) { 
    var db = ScriptDb.getMyDb(); 
    return db.save({type: "savedArray", data:currentArray}).getId(); 
} 

function loadArrayById (id) { 
    var db = ScriptDb.getMyDb(); 
    return db.load(id).data; 
} 

function loadArrayByType() { 
    var db = ScriptDb.getMyDb(); 
    var result = db.query({type: "savedArray"}); 
    if (result.hasNext()) { 
    return result.next().data; 
    } 
    else { 
    return []; 
    } 
} 

function test() { 
    var arr = ['this','is','a','test']; 
    var savedId = saveArray(arr); 
    var loaded1 = loadArrayById(savedId); 
    var loaded2 = loadArrayByType(); 
    debugger; // pause if running debugger 
} 

은 디버거 일시 정지에서 볼 수있는 내용은 다음과 같습니다

Screenshot of debugger

참고가 모두 loaded1loaded2이 동일 저장된 개체에서 배열을 당겨지도 태그 data를 사용하여 소스 배열 arr.

+0

이것은 정확하게 필요한 것입니다. 정말 고마워요. –

+0

+1 디버거 용입니다. 나는 공백 (0)을 흩어지게하고 그들에 브레이크를 추가/제거하는 경향이있다. – Jonathon

1

ScriptDb은지도 개체 만 저장합니다. 그러나 배열이 포함 된지도를 저장할 수 있습니다!

배열을 사용하여 db.saveBatch을 사용하여 한 번의 호출로 여러 객체를 저장할 수 있습니다.

+0

죄송합니다.이 기능을 사용하지 않으므로 저장하려는 배열이 포함 된지도를 만드는 방법은 무엇입니까? 스프레드 시트에서 부서에 대한 원시 데이터를 저장하기 위해 스크립트의 앞부분에'db.saveBatch'를 사용합니다. –

+1

'var myObj = {array : YOUR_ARRAY, id : SOME_IDENTIFIER};'와 같은 객체를 정의하기 만하면 나중에 식별자를 얻을 수 있습니다. 그럼 그냥'db.save (myObj); 할 수 있습니다. –

관련 문제