【问题标题】:How to rename a new google sheet using cell references?如何使用单元格引用重命名新的谷歌工作表?
【发布时间】:2021-07-08 08:41:40
【问题描述】:

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

Username Name
Timmy Tim Jones
Sally1 Sally Wall
catsforlife John Mueller
ready2learn Cindy Rodney

我已经尝试了以下代码:

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

【问题讨论】:

  • 澄清一下,当您说“为每个唯一用户名导出单独的 google 表格的 google 脚本”时,您的意思是您正在使用 makeCopy() 方法导出 google 表格的单独副本基于用户名具有唯一文件名的文件?您能否也分享完整的代码以确保我们了解整个逻辑并减少我们的任何假设?
  • Values 和 uniqueName 未定义或至少我们不知道它们来自哪里,并且您的代码实际上并未设置工作表名称,因此我们可能需要按顺序查看调用此函数的代码了解您尝试完成的工作

标签: javascript arrays google-apps-script data-science


【解决方案1】:

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

另一件事是您试图访问values 中元素的属性NameUsername,但是,假设您从getValues() 收到values,这些属性不存在。您只需使用索引即可获得所需的值,就像您已经在做的那样: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));
}

另一种选择是使用filtermap 来获取工作表的名称:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    相关资源
    最近更新 更多