【发布时间】:2021-05-04 22:44:50
【问题描述】:
我正在尝试自动下载 Google 表格 -> 管道分隔的文本文件。基本上,我想创建一个时间驱动的脚本以在 Google 电子表格上运行,以将其保存为带有| 分隔符的 .txt。
电子表格本身是一个单一的工作表,它使用 IMPORTRANGE 从我的主文件中提取数据以供最终用户访问。
现在我手动将其下载为.csv,在记事本中打开,用|'s“替换所有”逗号,并保存为.txt,然后将该文件上传到需要去的地方(上传无关紧要,必须是手动的)。我想为自己自动化,但也让另一个用户在我不可用时通过脚本获取最终的 .txt 文件。最重要的是,我希望它能够在没有用户输入或活动工作站的情况下运行(它应该在周日早上运行),因此它必须在时间触发的 Google Apps 脚本中。
我的 JavaScript 经验很少,所以我能想到的唯一解决方案是两个嵌套的 for 循环(sheetID 和 sheetName 保留):
var ss= SpreadsheetApp.openById(sheetID)
var pipeDelimitedString = ""
var sheet = ss.getSheetByName(sheetName)
var lastRow = sheet.getLastRow()
var lastColumn = sheet.getLastColumn()
var fileName = "PIPE DELIMITED TEST FILE"
for (var i=1;i<=lastRow;i++){
for(var j=1;j<=lastColumn;j++){
if (j==lastColumn){
pipeDelimitedString = pipeDelimitedString + "|" + sheet.getRange(i,j).getValue()+"/n"
} else {
pipeDelimitedString = pipeDelimitedString + "|" + sheet.getRange(i,j).getValue()
}
}
}
newFile = DriveApp.createFile(fileName,pipeDelimitedString);
然后是一个小脚本,将 newFile 通过电子邮件发送给其他用户(尚未编写该部分,但我在 google 上看到了很多解决方案,所以不用担心电子邮件部分)
这必须在 66 列和最多 200 行(>10k 总单元格)的工作表上运行。我在只有约 50 行的数据集上对其进行了测试,我不得不停止它。即使它确实有效,它也会占用我太多用于触发脚本的 Google Apps 脚本配额。
我确定我在这方面走错了方向。请帮忙?即使只是从哪里开始也将不胜感激。
我无法共享实际文件,只能共享一个虚拟副本,但我很确定解决方案不应该是特定于内容的?除了原始文件数据中没有逗号或管道这一事实之外,如果有帮助,只有文本和数字的混合?
【问题讨论】:
-
一次您必须对尽可能多的单元格使用
getRange().getValues()。对于工作表上的所有单元格,可能。然后你可以处理二维数组(嗯,它可以是一个经典的嵌套循环,为什么不呢?)而不用花费你的配额。要获取二维数组的元素(例如行i和列j,您可以使用符号:myCell = myArray[i][j] -
我明白了,谢谢。如果我理解正确,我的问题不在于嵌套的 for 循环,而是每次迭代我都再次调用 getValue() 函数这一事实,这比检查数组值更密集。我很感激!
-
没错。使用 Google App Script,您需要尽可能少地使用
getValue()、getValues()和setValue()、setValues()方法。
标签: google-apps-script google-sheets export-to-text