如何使用单元格引用重命名新的 google sheet?
How to rename a new google sheet using cell references?
所以目前,我正在尝试制作一个 google 脚本,为每个唯一的用户名导出单独的 google sheets -- 即尝试制作一个可定制的报告每个客户。基本上,我有一个唯一用户名列表——一个名为 uniqueUserName 的列表——我想将新 sheet 的名称设置为与用户名对应的“名称”。例如,假设 Sally1 在下面 table。该代码将搜索用户名(使用 for 循环),一旦 for 循环命中 Sally1,该代码将 return Sally Wall——即与她的用户名对应的名称。 Sally Wall 将成为文档的新名称。
用户名
姓名
提米
蒂姆·琼斯
莎莉1
莎莉沃尔
猫的一生
约翰·穆勒
ready2learn
辛迪·罗德尼
我试过以下代码:
newSheet.setName(function(uniqueName, values){
for (var i=0; i < values.length; i++) {
if (values[i][0].Username === uniqueName) {
return values[i][1].Name;
break;
}
}
});
(我加入了 break 函数,因为如果某人的名字出现两次,我不想复制他们的名字两次。)
我必须如何调整此代码才能达到这些目的?这是在正确的轨道上吗?
老实说,我研究这段代码已经有一段时间了,尽可能多地查找堆栈溢出、YouTube,非常感谢您的帮助!
一个问题是您将一个函数传递给 setName() 方法,但它需要一个字符串。解决此问题的一种直接方法是在函数声明后立即调用它,同时传递参数。
另一件事是您正在尝试访问 values
中元素的属性 Name
和 Username
,但是,假设您从 getValues(),这些属性不存在。您可以通过使用索引来获得所需的值,就像您已经在做的那样:values[i][0]
和 values[i][1]
.
此外,您不需要使用 break
,因为无论如何循环都会被 return
语句中断。
考虑到上述情况并假设有一个名为 Names 的 sheet(具有您发布的名称)和另一个名为 Report Template,您可以将代码更改为:
function newNamedSheetTest() {
const uniqueName = 'Sally1';
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const values = spreadsheet.getSheetByName('Names').getDataRange().getValues();
const newSheet = spreadsheet.getSheetByName('Report Template').copyTo(spreadsheet);
newSheet.setName(function (uniqueName, values) {
for (let i = 0; i < values.length; i++) {
if (values[i][0] === uniqueName) {
return values[i][1];
}
}
}(uniqueName, values));
}
另一种选择是使用 filter and map 获取 sheet:
的名称
function newNamedSheetTestShort() {
const uniqueName = 'Sally1';
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const values = spreadsheet.getSheetByName('Names').getDataRange().getValues();
const newSheetName = values.filter(row => row[0] === uniqueName).map(row => row[1]);
const newSheet = spreadsheet.getSheetByName('Report Template').copyTo(spreadsheet);
newSheet.setName(newSheetName);
}
所以目前,我正在尝试制作一个 google 脚本,为每个唯一的用户名导出单独的 google sheets -- 即尝试制作一个可定制的报告每个客户。基本上,我有一个唯一用户名列表——一个名为 uniqueUserName 的列表——我想将新 sheet 的名称设置为与用户名对应的“名称”。例如,假设 Sally1 在下面 table。该代码将搜索用户名(使用 for 循环),一旦 for 循环命中 Sally1,该代码将 return Sally Wall——即与她的用户名对应的名称。 Sally Wall 将成为文档的新名称。
用户名 | 姓名 |
---|---|
提米 | 蒂姆·琼斯 |
莎莉1 | 莎莉沃尔 |
猫的一生 | 约翰·穆勒 |
ready2learn | 辛迪·罗德尼 |
我试过以下代码:
newSheet.setName(function(uniqueName, values){
for (var i=0; i < values.length; i++) {
if (values[i][0].Username === uniqueName) {
return values[i][1].Name;
break;
}
}
});
(我加入了 break 函数,因为如果某人的名字出现两次,我不想复制他们的名字两次。)
我必须如何调整此代码才能达到这些目的?这是在正确的轨道上吗?
老实说,我研究这段代码已经有一段时间了,尽可能多地查找堆栈溢出、YouTube,非常感谢您的帮助!
一个问题是您将一个函数传递给 setName() 方法,但它需要一个字符串。解决此问题的一种直接方法是在函数声明后立即调用它,同时传递参数。
另一件事是您正在尝试访问 values
中元素的属性 Name
和 Username
,但是,假设您从 getValues(),这些属性不存在。您可以通过使用索引来获得所需的值,就像您已经在做的那样:values[i][0]
和 values[i][1]
.
此外,您不需要使用 break
,因为无论如何循环都会被 return
语句中断。
考虑到上述情况并假设有一个名为 Names 的 sheet(具有您发布的名称)和另一个名为 Report Template,您可以将代码更改为:
function newNamedSheetTest() {
const uniqueName = 'Sally1';
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const values = spreadsheet.getSheetByName('Names').getDataRange().getValues();
const newSheet = spreadsheet.getSheetByName('Report Template').copyTo(spreadsheet);
newSheet.setName(function (uniqueName, values) {
for (let i = 0; i < values.length; i++) {
if (values[i][0] === uniqueName) {
return values[i][1];
}
}
}(uniqueName, values));
}
另一种选择是使用 filter and map 获取 sheet:
的名称function newNamedSheetTestShort() {
const uniqueName = 'Sally1';
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const values = spreadsheet.getSheetByName('Names').getDataRange().getValues();
const newSheetName = values.filter(row => row[0] === uniqueName).map(row => row[1]);
const newSheet = spreadsheet.getSheetByName('Report Template').copyTo(spreadsheet);
newSheet.setName(newSheetName);
}