首页 > 解决方案 > 如何使用单元格引用重命名新的谷歌工作表?

问题描述

所以目前,我正在尝试制作一个谷歌脚本,为每个唯一的用户名导出单独的谷歌表格——即,尝试为每个客户制作一个可定制的报告。基本上,我有一个唯一用户名列表——一个名为 uniqueUserName 的列表——我想将新工作表的名称设置为与用户名对应的“名称”。例如,假设 Sally1 在下表中。代码将搜索用户名(使用 for 循环),一旦 for 循环命中 Sally1,代码将返回 Sally Wall——即与她的用户名对应的名称。然后 Sally Wall 将成为文档的新名称。

用户名 姓名
蒂米 蒂姆·琼斯
莎莉1 莎莉墙
猫为生命 约翰·穆勒
准备好学习 辛迪·罗德尼

我尝试了以下代码:

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,非常感谢您的帮助!

标签: javascriptarraysgoogle-apps-scriptdata-science

解决方案


一个问题是您将一个函数传递给setName()方法,但它需要一个字符串。解决此问题的一种直接方法是在声明函数后立即调用该函数,同时传递参数。

另一件事是您正在尝试访问 中的属性NameUsername元素values,但是,假设您valuesgetValues()收到这些属性,则这些属性不存在。您可以通过仅使用索引来获得所需的值,就像您已经在做的那样:values[i][0]values[i][1].

此外,您不需要使用break,因为无论如何循环都会被return语句中断。

考虑到上述情况并假设有一个名为Names的工作表(其中包含您发布的名称)和另一个名为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));
}

另一种选择是使用过滤器映射来获取工作表的名称:

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);
}

推荐阅读