问题描述
我试图弄清楚如何将文本从Google表格的特定列导出到Google Drive .txt文件。我正在尝试从所有列导出所有文本,因此Google驱动器上的每个列都会有一个不同的.txt文件。也将要跳过前2行。 我发现了:
function savetoTextfile() {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getActiveSheet();
var range = sheet.getRange(1,1,sheet.getLastRow(),sheet.getLastColumn());
var rows = range.getValues();
var folder = DriveApp.getFoldersByName("folderName").next();
var files = folder.getFiles();
while(files.hasNext()) files.next().setTrashed(true);
rows.forEach(function(row,index) {
folder.createFile("row" + index + ".txt",row.join(","));
});
}
此功能为所有行而不是列创建文本文件,并且在结果txt文件中添加很多“,”。我无法弄清楚如何进行更改,因此它将对列进行处理,基本上我希望该功能为列创建txt文件(例如:D3至D100,E3至E100,F3至E100,依此类推)。 还希望在工作表上进行任何更改时更新文本文件。
谢谢:)
解决方法
转置数组:
getValues()返回一个2D数组,其中外部数组中的每个元素对应于一行。您想要一个2D数组,其中外部数组元素对应于列。也就是说,您需要转置2D数组。
一种简单的方法可以在this answer中找到:
array[0].map((_,colIndex) => array.map(row => row[colIndex]));
其他问题:
- 如果要跳过前两行,则范围(在getRange中定义)的起始行应为
3
而不是1
,并相应地更正行数(请参见下面的代码示例)。 - 它添加了很多
,
,因为您是这样写的(请参见row.join(",")
)。相反,如果您希望每个值都占一行,请改用\n
(请参见下面的代码示例)。 - 更新文本文件将需要您安装onEdit触发器,该触发器将在每次编辑电子表格时触发功能
saveToTextfile
。由于此功能需要授权,因此它不是简单的触发器,而是installable one。如果您在安装时遇到问题,请发布一个新问题(每个问题应针对一个特定问题,而不是针对其中几个问题)。
代码示例:
function saveToTextfile() {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getActiveSheet();
var firstRow = 3; // Skip first two rows => start at 3rd
var range = sheet.getRange(firstRow,1,sheet.getLastRow() - firstRow + 1,sheet.getLastColumn());
var rows = range.getValues();
var columns = rows[0].map((_,colIndex) => rows.map(row => row[colIndex]));
var folder = DriveApp.getFoldersByName("folderName").next();
var files = folder.getFiles();
while(files.hasNext()) files.next().setTrashed(true);
columns.forEach(function(column,index) {
folder.createFile("column" + index + ".txt",column.join("\n")); // New line
});
}