如何使用单元格引用重命名新的 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 中元素的属性 NameUsername,但是,假设您从 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);
}