Google-Apps-Script 无法使用 getDataRange().setValues() 写回数据库
Posted
技术标签:
【中文标题】Google-Apps-Script 无法使用 getDataRange().setValues() 写回数据库【英文标题】:Google-Apps-Script can not write back a database with getDataRange().setValues() 【发布时间】:2018-03-13 19:03:47 【问题描述】:我有一个从谷歌电子表格加载的数据库:
mydatabase = sheet.getDataRange().getValues()
然后我用新记录扩展:
mydatabase.push(mydatabase[x])
然后在脚本结束时,我想将整个数据库写回谷歌电子表格,但是
sheet.getDataRange().setValues(mydatabase)
给我错误,因为新数据库在加载时比原始数据库高一个记录。
有什么方法可以强制 getDataRange() 将数据库写回到工作表中?否则电子表格将有足够的行来容纳更大的数据集。
【问题讨论】:
写回数组时不能使用 getDataRange,而只需使用 getRange(1,1,array.length,array[0].length) 定义范围,如果您的数组是同质的,那么它将起作用. 好吧......老实说,我在解决方案搜索过程中也尝试了这个版本,但它也不想通过......它给了我 >>Cannot find method getRange(number ,number,number,number) 它没有。这种方法是有效的。添加的数据结构是否与现有的完全相同?我的意思是相同的行长。 OK ...它现在可以工作了...但是请帮助我理解我尝试了这么久的错误::当我从'as = SpreadsheetApp.getActiveSpreadsheet()'加载数据库时我无法使用您建议的解决方案......但是当我添加'ss = as.getSheetByName(“Sheet1”)'并且从ss.getDataRange()加载数据库时......比我能够使用ss .getRange(1,1,length,length) 并没有收到那个愚蠢的错误消息。 如果我理解正确,电子表格也是如此,而 ss 是工作表,您确定您没有混淆这两者吗?它将解释您收到的错误消息。 【参考方案1】:一般来说,要使.setValues(obj[][])
按预期工作,它所作用的Range
的大小必须与obj[][]
的大小相同。
通常,这是通过从所需的Sheet
获取新的Range
来确保的:
var ss = SpreadsheetApp.openById("some id");
var sheet = ss.getSheetByName("some name");
var db = sheet.getDataRange().getValues();
/*
* Do some operations on the obj[][] that is db
* these operations can include adding / removing rows or columns.
*/
// If db is smaller than existing "written" data, the existing data should be cleared first.
if(db.length < sheet.getLastRow() || db[0].length < sheet.getLastColumn())
sheet.clearContent();
// Write the current db back to the sheet, after acquiring the
// exact number of rows and columns needed to hold the values.
sheet.getRange(1, 1, db.length, db[0].length).setValues(db);
【讨论】:
以上是关于Google-Apps-Script 无法使用 getDataRange().setValues() 写回数据库的主要内容,如果未能解决你的问题,请参考以下文章
Google-apps-script 函数 CHAR() 和 CODE()
该脚本工作正常,但不在“google-apps-script”中
无法使用 gcc 构建 sigqueue 示例,但 g++ 可以吗?