2012-06-20 14 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); 
} 

数据信息是制表符分隔,正确显示了在日志中,但因为它是一个字符串,我不能使用.setValues把它写在纸张PT而且我不确定如何以任何其他方式从网址获取信息。

对于这个问题的基本性质,我很抱歉,但我对脚本非常陌生,所以任何帮助将不胜感激。

更新的代码:

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,我认为埃文的问题是不同的。埃文担心这种分裂并未考虑到行。

解决方案是使用两个拆分。首先,

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(),而不是每行都使用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]); 

注意如何在第一种情况下和在第二种情况下创建二维数组。

+0

这是有道理的。我现在遇到的一个问题是** data.split(“\ t”)**未检测到划定行尾的返回值。有没有内置的东西?我确实找到了[从CSV导入]的教程(https://developers.google.com/apps-script/articles/docslist_tutorial#section1),这是更好的方法吗? –

+0

我得到了上面提到的教程,但因为原始文件相当大,所以如果.split()可以简化它,或者如果有另一种更简单的方法,我将非常感谢你。 –

0

我想要做的最简单的事情就是将这些标签转换为别的东西,例如逗号,毕竟csv的'c'来自哪里......然后您可以随心所欲地编写它。

例: commaString = tabString.replace(\t/g,',') ;应该工作,但我不是在正则表达式的专家...如果我错了,会有人肯定改正;-)

+0

将选项卡转换为逗号可以更简单地将它写入Google表格中? –

相关问题