Google apps script 将分隔文本作为字符串写入电子表格

Google apps script 将分隔文本作为字符串写入电子表格,google-apps-script,Google Apps Script,我有一个简短的脚本,试图从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.f

我有一个简短的脚本,试图从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);
}
data中的信息以制表符分隔,并正确显示在日志中,但因为它是一个字符串,我无法使用。请设置值将其写入工作表pt,我不确定如何从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
}
Range.setValues()接受二维数组作为输入

我不知道你想做什么。如果您只想将数据写入一个单元格,那么就使用这段代码

ptSheet.getActiveRange().setValues([[data]]);
如果要将数据中的每个元素写入电子表格中的一行,则可以使用

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

请注意,在第一种情况和第二种情况下,您是如何创建二维阵列的

我想最简单的方法是将这些标签转换成其他格式,例如逗号,这毕竟是csv的“c”的来源。。。然后你可以把它写在任何你想写的地方

例如:
commaString=tabString.replace(\t/g,,)应该可以,但我不是正则表达式专家。。。如果我错了,肯定会有人纠正;-)

谢尔盖,我想埃文的问题不一样。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]); 
}

这是有道理的。我现在遇到的一个问题是data.split(“\t”)没有检测到分隔行末尾的返回值。这里面有什么东西吗?我确实找到了一个教程,这是一个更好的方法吗?我得到了上面提到的教程,但由于原始文件非常大,它正在超时,因此如果.split()你可以简化它,或者如果有其他更简单的方法,我会很感激你的提醒。将标签转换为逗号会使它更简单地写入谷歌工作表吗?这非常有效,比上面提到的教程中的功能简单得多。我仍然有一个关于脚本超时的问题(尽管如果我退出电子表格并重新打开它,所有的数据实际上已经被输入),这是我的脚本的问题还是仅仅因为我试图在工作表中写入近2000行?我在上面的原始问题中发布了我的更新脚本。为了防止超时,您可以为整个工作表准备2D数组,然后一次性使用setValues(),而不是对每一行都这样做。这将是快得多我花了一点时间,以使它正确,但得到了它的工作-张贴更新的代码。非常感谢你的帮助。