copyValuesToRange如果startColumn为整数,则不返回任何内容

问题描述 投票:0回答:1

编写脚本,其中用相同单元格中显示的值覆盖具有公式的单元格。以下代码WORKS(但为便于阅读而设置格式):

var TargetHistorySheetRow = 95; //some arbitrary integer
var HistorySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("History");

HistorySheet.getRange(TargetHistorySheetRow, HistorySheet.getRange("1:1").getValues()[0].indexOf("Allocated")+1)
   .copyValuesToRange(
                      HistorySheet, 
                      HistorySheet.getRange("1:1").getValues()[0].indexOf("Allocated")+1, 
                      HistorySheet.getRange("1:1").getValues()[0].indexOf("Allocated")+1, 
                      TargetHistorySheetRow, 
                      TargetHistorySheetRow
                      );

[(C0))中有一段重复的代码,用于动态查找特定的列号。为了便于阅读,我将该代码段移至一个变量,并在整个过程中使用了该变量。以下更新不工作,并将目标单元格更改为空白

HistorySheet.getRange("1:1").getValues()[0].indexOf("Allocated")+1;

但是,如果仅将copyValuesToRange的startColumn参数改回,则再次WORKS

var TargetHistorySheetRow = 95; //some arbitrary integer
var HistorySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("History");
var HistorySheetAllocatedColumn = HistorySheet.getRange("1:1").getValues()[0].indexOf("Allocated")+1;

HistorySheet.getRange(TargetHistorySheetRow, HistorySheetAllocatedColumn)
   .copyValuesToRange(
                      HistorySheet, 
                      HistorySheetAllocatedColumn, 
                      HistorySheetAllocatedColumn, 
                      TargetHistorySheetRow, 
                      TargetHistorySheetRow
                      );

将参数更改为静态值(例如:7)也不起作用。这是怎么回事?

google-apps-script
1个回答
0
投票

这似乎是一个错误!

您在此处描述的行为非常有趣。当您调用HistorySheet.getRange(TargetHistorySheetRow, HistorySheetAllocatedColumn) .copyValuesToRange( HistorySheet, HistorySheet.getRange("1:1").getValues()[0].indexOf("Allocated")+1, HistorySheetAllocatedColumn, TargetHistorySheetRow, TargetHistorySheetRow ); 时,根据文档,Range.copyValuesToRange(sheet, column, columnEnd, row, rowEnd)columncolumnEndrow参数rowEnd

现在经过一些测试,您可以看到以下行返回should all be Integers

number

也是:

typeof HistorySheet.getRange("1:1").getValues()[0].indexOf("ColumnHeaderC")

[然而分别记录typeof HistorySheet.getRange("1:1").getValues()[0].indexOf("ColumnHeaderC") + 1 HistorySheetTargetColumn时,会得到以下结果:

HistorySheet.getRange("1:1").getValues()[0].indexOf("ColumnHeaderC") + 1

您可以看到发生了21个串联,因为在var HistorySheetTargetColumn = (HistorySheet.getRange("1:1") .getValues()[0] .indexOf("ColumnHeaderC") + 1); Logger.log('variable = ' + HistorySheetTargetColumn); // => variable = 3 Logger.log('method call = ' + HistorySheet.getRange("1:1") .getValues()[0] .indexOf("ColumnHeaderC") + 1); // => method call = 21 运算符之前对HistorySheet.getRange("1:1").getValues()[0].indexOf("ColumnHeaderC")求值作为字符串,这意味着在+之后该值变为21而不是3,如果应该将其作为整数求值,则应该如此。

因此,您似乎在每次使用+ 1中的HistorySheetTargetColumn时都在重新评估.copyValuesToRange(),从HistorySheet.getRange("1:1").getValues()[0].indexOf("ColumnHeaderC") + 1中获得2时返回作为字符串,然后将[ C0]。这就是为什么您的单元格评估为空白的原因-因为单元格indexOf()为空白。

解决方法:

您可以同时通过在分配的1周围加上括号来解决此问题:

A21

报告问题:

我已经自由地在Google的问题跟踪器上为您报告了此情况,详细说明了该行为:

  • HistorySheet.getRange("1:1").getValues()[0].indexOf("ColumnHeaderC") + 1

您可以点击页面左上方发行编号旁边的☆,让Google知道有更多的人遇到这种情况,因此更有可能看到更快的速度。

希望对您有帮助!

参考:

© www.soinside.com 2019 - 2024. All rights reserved.