2012-06-20 4 views
1

URL에서 데이터를 가져 와서 기존 스프레드 시트의 시트에 쓰려고하는 짧은 스크립트가 있습니다. 다음과 같이 스크립트입니다 :스프레드 시트에 문자열로 구분 된 텍스트 쓰기

function urlDataImport() { 
    var input = "https://reports.acc-q-data.com/clientreports/ecaldwell_201206192722/ecaldwell_20122722.txt"; 
    // The code below gets the HTML code. 
    var response = UrlFetchApp.fetch(input); 
    var data = response.getContentText(); 
    Logger.log(data); 
    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    var ptSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("pt"); 
    ptSheet.getActiveRange().setValues(data); 
} 

데이터의 정보 탭으로 구분하고 로그에 제대로 표시되지만이 문자열이기 때문에 내가 시트 PT에 기입 할 .setValues을 사용할 수 없습니다 다른 방법으로 URL에서 정보를 얻는 방법을 모르겠습니다.

이 질문의 초보적인 특성으로 인해 불편을 끼쳐 드려 죄송합니다. 스크립트 작성에 익숙하지 않으므로 도움을 받으실 수 있습니다.

업데이트 된 코드 :

function ptDataImport() { 
    var input = "https://reports.acc-q-data.com/clientreports/ecaldwell_201206192722/ecaldwell_2012062.txt"; 
    var response = UrlFetchApp.fetch(input); // Get the data from the URL as an object. 
    var data = response.getContentText(); // Convet the object to text 
    var dataSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("pt"); // Get the sheet to write the data to 
    var rows = data.split('\n'); // Splits the text into rows 
    dataSheet.clear(); 
    var dataSet = new Array(); 
    for (var i in rows){ 
    dataSet[i] = rows[i].split('\t'); // Split the rows into individual fields and add them to the 2d array 
    } 
    dataSet.pop(); // Had a blank row at the bottom that was giving me an error when trying to set the range - need to make this conditional somehow 
    var numColumns = dataSet[0].length; 
    var numRows = dataSet.length; 
    var lastRow = dataSet[(numRows -1)]; 
    dataSheet.getRange(1,1,numRows,numColumns).setValues(dataSet); // Get a range the size of the data and set the values 
} 

답변

2

@Serge, 나는 에반의 질문은 다른 생각 해결됩니다에 대한이야 만약 내가 ... 정규식의 전문가 아니에요. Evan은 분할이 행을 고려하지 않을까 우려합니다.

그 해결책은 두 개의 스플릿을 사용하는 것입니다. 첫째,

var rows = data.split('\n'); 

그리고 의미가 다음

for (var i in rows){ 
    tmp = rows[i].split('\t'); // Use Serge's method if this doesn't work 
    /* Get the range here */ 
    range.setValues([tmp]); 
} 
+0

위의 코드는 위의 튜토리얼의 기능보다 훨씬 뛰어났습니다. 나는 여전히 스크립트 시간에 문제가있다. (비록 스프레드 시트를 빠져 나가서 데이터를 다시 열어 본다면 모든 것이 실제로 마비된다.)이 스크립트는 내 스크립트에 문제가있다. 시트에 2000 행? 위의 원래 질문에 업데이트 된 스크립트를 게시했습니다. –

+0

시간 초과를 방지하려면 전체 시트에 대해 2D 배열을 준비한 다음 모든 행에 대해 수행하지 말고 한 번에 setValues ​​()를 사용합니다. 이것은 훨씬 더 빠를 것입니다. – Srik

+0

업데이트를 얻으려면 약간 시간이 걸리지 만 제대로 작동해야합니다. 업데이트 된 코드를 게시하십시오. 도와 줘서 고마워. –

1

Range.setValues ​​()는 입력으로서 2-D 어레이 걸린다.

당신이하고 싶은 것이 확실하지 않습니다. 당신이 원하는 모든 셀에 데이터 쓰기의 경우 스프레드 시트의 행 데이터의 각 요소를 작성하려는 경우, 다음

을 사용할 수 있습니다, 코드

ptSheet.getActiveRange().setValues([[data]]); 

이 조각을 사용하여

var tmp = data.split(DELIMITER); 
/* Get the correct range here */ 
range.setValues([tmp]); 

첫 번째 경우와 두 번째 경우에서 2 차원 배열을 만드는 방법에 유의하십시오.

+0

. 내가 지금 가지고있는 한 가지 문제는 ** data.split ("\ t") **가 행의 끝을 구분하는 리턴을 감지하지 못한다는 것입니다. 거기에 뭔가가 내장되어 있습니까? [CSV에서 가져 오기] (https://developers.google.com/apps-script/articles/docslist_tutorial#section1)에 대한 자습서를 찾았습니까? 더 좋은 방법입니까? –

+0

나는 위에 언급 한 튜토리얼을 작업 할 수 있지만 원래 파일이 상당히 크기 때문에 시간이 초과됩니다. .split()이 단순화 할 수 있거나 또 다른 간단한 방법이 있다면 머리를 고맙게 생각할 것입니다. –

0

내가 할 수있는 가장 쉬운 방법은 그 탭을 다른 것, 예를 들어 쉼표로 변환하는 것입니다. 그게 바로 csv의 'c'가 나온 곳입니다. 그러면 원하는 곳 어디에서나 쓸 수 있습니다.

Exemple : commaString = tabString.replace(\t/g,',') ; 일을해야하지만, 내가 잘못 누군가가 반드시이 ;-)

+0

은 탭을 쉼표로 변환하여 Google 시트에 간단하게 작성합니다. –

관련 문제