Google apps script 将分隔文本作为字符串写入电子表格
我有一个简短的脚本,试图从URL中获取数据,并将其写入现有电子表格的工作表中。脚本如下: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
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(),而不是对每一行都这样做。这将是快得多我花了一点时间,以使它正确,但得到了它的工作-张贴更新的代码。非常感谢你的帮助。