如何改变多个单元格值在谷歌表通过应用程序脚本

How to change multiple cell values in Google Sheets via Apps Script?

本文关键字:谷歌 脚本 应用程序 单元格 何改变 改变      更新时间:2023-09-26

我想写一个脚本来格式化打印的生产计划。我想输入单个字母,然后运行脚本将这些单个字母更改为单词,并使用边框等设置单元格的格式。

下面的if/else if/else操作可以满足我对单个单元格的要求:

    var TESTalpha = printCHSheet.getRange(4, 5, 1, 1);
    var TESTalphaData = TESTalpha.getValue();
    if (TESTalphaData == 'f') {
    TESTalpha.clear();
    TESTalpha.setValue('FAB').setBorder(true, true, true, true, true, true);
    } else if (TESTalphaData == 'p') {
    TESTalpha.clear();
    TESTalpha.setValue('PAINT').setBorder(true, true, true, true, true, true);
    } else if (TESTalphaData == 'c') {
    TESTalpha.clear();
    TESTalpha.setValue('FINISH').setBorder(true, true, true, true, true, true);
    } else {
    TESTalpha.setValue(null);
    }

最终我想将此应用于行和列中的一系列单元格,但首先我试图评估单行上的五个单元格。

下面的循环运行,但是用它找到的最后一个值替换每个单元格(供参考…5个单元格E4:I4用f/f/p/c/c):

填充
    var TESTalpha = printCHSheet.getRange(4, 5, 1, 5);
    var TESTlength = TESTalpha.getLastColumn();
    var TESTalphaData = TESTalpha.getValues();
    for (var i=0; i < TESTlength+1; i++) {
    if (TESTalphaData[0][i] == "f") {
    TESTalpha.clear();
    TESTalpha.setValue("FAB");
    } else if (TESTalphaData[0][i] == "p") {
    TESTalpha.clear();
    TESTalpha.setValue("PAINT");
    } else if (TESTalphaData[0][i] == "c") {
    TESTalpha.clear();
    TESTalpha.setValue("FINISH");
    }
    }

我在这里得到的结果是,范围E4:I4中的所有单元格都设置为FAB;然后开始画画;然后全部设置完成。相反,我想要的是FAB/FAB/PAINT/FINISH/FINISH。我知道上面的脚本正在替换所有的细胞,因为我正在编程,但我的各种修改都失败了,所以我把它贴在这里,可能朝着正确的方向前进。

我的另一个想法是运行一个循环来拼接数组,然后清除范围并设置(或push)由循环修改的新数组:

    var TESTalpha = spreadsheet.getRange("E4:I4");
    var TESTlength = TESTalpha.getLastColumn();
    for (var i=0; i < TESTlength+1; i++) {
    var TESTalphaData = TESTalpha.getValues();
    if (TESTalphaData[0][i] == "f") {
    TESTalphaData.splice([i], 1, "FAB");
    } else if (TESTalphaData[0][i] == "p") {
    TESTalphaData.splice([i], 1, "PAINT");
    } else if (TESTalphaData[0][i] == "c") {
    TESTalphaData.splice([i], 1, "FINISH");
    } 
    spreadsheet.getRange("E4:I4").clear();
    spreadsheet.getRange("E4:I4").setValues(TESTalphaData);
    }

上面的问题是(至少)它是一个2D数组,但我试图像字符串的1D数组一样拼接。

我也试过开关,但没有成功。

提前感谢您的帮助!

不要只是复制和使用它,它有注释,这样你就知道下次怎么做了:

var TESTalpha = spreadsheet.getRange("E4:I4"),
    TESTalphaData = TESTalpha.getValues();
var col = TESTalphaData[0].length; // use a meaningful name for a variable
while( --col >= 0 ) {
// Make the tests and assign the variable the array you pulled from the sheet with getValues(), it's exactly the same you need to input with setValues()
if (TESTalphaData[0][col ] == "f") {
   TESTalphaData[0][col] = 'FAB';
} else if (TESTalphaData[0][col] == "p") {
   TESTalphaData[0][col] = "PAINT";
} else if (TESTalphaData[0][col] == "c") {
   TESTalphaData[0][col] = "FINISH";
}
// Setting the values should be after the loop is complete, so I removed it from inside the for (now a while), to the end of the code
}
// No need to get the Ranges again, you already save it up there
// No need to clear the range, it will all be re-written again
TESTalpha.setValues(TESTalphaData);

部分答案(仍然需要帮助,仅在包含值的单元格周围设置边框)。这个while循环在另一个while中改变了由行和列组成的多维数组的值。非常感谢@Kriggs。

var TESTalpha = printCHSheet.getRange(4, 5, 7, 7),
    TESTalphaData = TESTalpha.getValues(),
    rowOp = TESTalpha.getNumRows();
while ( --rowOp >= 0 ) {
 var col = TESTalphaData[rowOp].length;
   while( --col >= 0 ) {
      if (TESTalphaData[rowOp][col] == "f") {
          TESTalphaData[rowOp][col] = "FAB";
      } else if (TESTalphaData[rowOp][col] == "p") {
                 TESTalphaData[rowOp][col] = "PAINT";
      } else if (TESTalphaData[rowOp][col] == "c") {
                 TESTalphaData[rowOp][col] = "FINISH";
      }
   }
}
TESTalpha.setValues(TESTalphaData);

事情是,TESTalphaData是一个数组,所以我不能设置它的边界。我可以用TESTalpha设置边界(b/c它是一个范围),但然后我得到的边界正好是每行7个单元格(正如我定义的范围)。

我怎么能运行另一个循环做这样的事情(这不起作用)?if (rangeX != null) {rangeX.setBorder(true, true, true, true, true, true);再次,一个范围不会检查值,但我不能设置值的边界,因为它们存在于数组中,除了单元格。

非常感谢您的帮助!

可以了!for循环中的for循环设置边界,如果单元格的空白为假——换句话说,如果它被填充。

for (var r = 4; r < 50; r++) {
  for (var c = 5; c < 21; c++) {
       var singleCell = printCHSheet.getRange(r, c, 1, 1);
       var singleCellBlank = singleCell.isBlank();
     if ( !singleCellBlank ) {
                  singleCell.setBorder(true, true, true, true, true, true)
     }
  }
}

我心花怒放。现在我所要做的就是格式化一些字体,将其他字母添加到else if评估中,等等,我就完成了!