Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在Google Sheets中仅对筛选行的范围使用setValue(getRange用于非隐藏单元格)?_Javascript_Google Apps Script_Google Sheets_Filter_Range - Fatal编程技术网

Javascript 如何在Google Sheets中仅对筛选行的范围使用setValue(getRange用于非隐藏单元格)?

Javascript 如何在Google Sheets中仅对筛选行的范围使用setValue(getRange用于非隐藏单元格)?,javascript,google-apps-script,google-sheets,filter,range,Javascript,Google Apps Script,Google Sheets,Filter,Range,我想知道,如果有经过筛选的行,如何使用setValue,这样只有显示的行(C1+C的最后一行)才能得到一个值 x(){ var sheet = SpreadsheetApp.getActiveSheet(); var lastRow = sheet.getLastRow(); sheet.getRange(C2, lastRow).setValue('x'); } 更新 它起作用了,但速度很慢。我已经测试了下面的代码,它运行得很快。它必须从显示的第二行开始。下面的解决方案可以使用过

我想知道,如果有经过筛选的行,如何使用setValue,这样只有显示的行(C1+C的最后一行)才能得到一个值

x(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  sheet.getRange(C2, lastRow).setValue('x');
}
更新 它起作用了,但速度很慢。我已经测试了下面的代码,它运行得很快。它必须从显示的第二行开始。下面的解决方案可以使用过滤器,也可以不使用过滤器。尚未运行的是第二行(C2)。复制的值始终插入其中。此外,如果可能的话,我想不使用辅助单元格进行复制。是否可以复制copypaste函数(getValue)的setValue

目标是在C列的当前可见(而不是隐藏或不可见的过滤)单元格中放置一个x。为此,我只需要知道如何将第二个可见单元格指定为getRange值(例如使用偏移量),因为其余单元格(结束单元格:lastRow)正在工作(正确的选择和输入,只有C2,每次,如果我使用此脚本,C2中有一个x):

第一行是固定的。如何为getRange使用第一个visibile not fixed行(第二行)?如果最后一行是隐藏的,并且使用了脚本,则不会在那里设置x,可能是因为“C”+lastRow。这起作用。只有C2受影响

这是解决办法
  • 您希望使用
    setValue
    将值放入筛选列(列“C”)的显示行中
  • 过滤器是基本过滤器
如果我的理解是正确的,那么这个答案呢?请把它看作是几种可能的答案之一

修改点:
  • 在这种情况下,您可以使用
    isRowHiddenByFilter
    通过过滤器检索显示行和隐藏行的行号。
    • isRowHiddenByFilter
      true
      时,该行处于隐藏状态
    • isRowHiddenByFilter
      false
      时,将显示该行
  • 范围列表是根据检索到的行号创建的,用于
    setValue
修改脚本:
var sheet=SpreadsheetApp.getActiveSheet();
var lastRow=sheet.getLastRow();
var范围=[];
对于(变量i=0;i
  • 运行脚本时,
    x
    的值被放入列“C”的显示行中
  • 如果
    If(!sheet.isrowhidenbyfilter(i+1)){
    修改为
    If(sheet.isrowhidenbyfilter(i+1)){
    ,则
    x
    的值放入隐藏行
参考资料:

如果我误解了您的问题,并且这不是您想要的方向,我很抱歉。

我发现getDataRange比getRange快。如何将其集成到函数中?可能与手动插入一样快。@user8652270感谢您的回答。我不得不为我的英语技能差道歉。不幸的是,我无法理解d关于您的回答。我理解您的问题,因为
您想使用setValue将值放入筛选列(列“C”)的显示行中.
。我的理解不正确吗?如果我的理解不正确,我可以向您询问您的问题吗?我希望通过正确理解您的问题来思考您的问题。因此,如果您能够合作解决您的问题,我很高兴。以上我已发送了一些更新、更快解决方案的信息(请查找更新)@user8652270谢谢你的回答。首先,我能问你我对你的问题的理解是否正确吗?我必须为我的英语水平低下道歉。我看到了你更新的问题。但很遗憾,我无法理解你想做什么。我能问你你的目标吗?@user8652270如果你想设置
x从第2行开始,请在我的答案脚本中将(VARI=0;i
修改为(VARI=1;i。但不幸的是,我不确定我是否能正确理解你的目标。因此,如果这不是你想要的结果,我道歉。
function x() {
  var spreadsheet = SpreadsheetApp.getActive();
  var lastRow = spreadsheet.getLastRow();
  spreadsheet.getRange('C2:'+'C'+lastRow).activate();
  spreadsheet.getRange('C1').copyTo(spreadsheet.getActiveRange(), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
};
spreadsheet.getRange('C2:'+'C'+lastRow).activate();
var s = SpreadsheetApp.getActive().getActiveSheet();

function x() {
  var lastRow = s.getLastRow();
  for(var row = 2; s.isRowHiddenByFilter(row); ++row);
  var range = s.getRange('C'+row+':C'+lastRow);
  s.getRange('F1').copyTo(range, SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false);
}
var sheet = SpreadsheetApp.getActiveSheet();
var lastRow = sheet.getLastRow();
var ranges = [];
for (var i = 0; i < lastRow; i++) {
  if (!sheet.isRowHiddenByFilter(i + 1)) {
    ranges.push("C" + (i + 1));
  }
}
sheet.getRangeList(ranges).setValue('x');