For循环 - 基于单元格值对行执行操作(Apps脚本)

时间:2017-09-07 12:19:47

标签: google-apps-script

我对Javascript相对较新,特别是循环,但我有一些我认为应该正常工作的代码。它没有返回任何错误,但是当我运行它时没有任何反应。 Stack Overflow帮助我解决了我需要的所有内容,但经过数小时的浏览和实验后,我仍然感到难过。

我认为问题出在我的循环中。我想要完成的事情(插入一系列公式并将其设置为值)并不是那么直接,但即使我尝试简单地将“B”打印到测试单元格,我仍然没有结果。

提前致谢。

function Translate(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sourceSheet = ss.getSheetByName("English Responses");
var formulasheet = ss.getSheetByName("Formula Range");
var lastRow = sourceSheet.getLastRow();
var formularange = formulasheet.getRange(1, 2, 1, 18);
var formulas = formularange.getFormulasR1C1();

for (var i = 1; i <= lastRow; i++){
var finishedRange = sourceSheet.getRange([i], 1);
var finishedValue = finishedRange.getValues();

var emptyCheckRange = sourceSheet.getRange([i], 2);
var emptyCheckValue = finishedRange.getValues();

var translationRange = sourceSheet.getRange([i], 2, 1, 18);

if (finishedValue =='A' && emptyCheckValue == ''){  
//translationRange.setFormulas(formulas);   
emptyCheckValue.setValue("B");
//translationRange.copyValuesToRange(sourceSheet, 1, 18, 1, 1); 
}}}

2 个答案:

答案 0 :(得分:0)

你的循环看起来不错。你的问题就在这一行:

emptyCheckValue.setValue("B");

emptyCheckValue是一个值而不是范围,因此setValue()将不起作用。如果您将其更改为:

,它将起作用
emptyCheckRange.setValue("B");

答案 1 :(得分:0)

根据GAS文档,'Range'类的'getValues()'方法返回二维数组值。 https://developers.google.com/apps-script/reference/spreadsheet/range#getvalues问题就出在这一行:

var emptyCheckValue = finishedRange.getValues();

如果在单元格中输入的值为“A”,则“emptyCheckValue”将为

[['A']] //Each inner array corresponds to a row in your spreadsheet.

如果你调用'getValue()'而不是'getValues()',它就会只是'A'。我想你现在可以看到为什么在'emptyCheckValue'上调用'setValue()'失败了。就像'getValue(s)()'方法一样,它属于Google表格所独有的Range类,因此您需要在“Range”类型的对象的实例上调用此方法。

你的'emptyCheckValue'变量是一个JS数组,所以你只能使用Array.prototype中的方法。要更改工作表,点的左侧变量必须属于“范围”类,例如

finishedRange.setValue('B');
// or
finishedRange.setValues([['B']]); //the 2d array must match the size of the range

最后,迭代这样的值是非常无效且性能成本高的:

var finishedRange = sourceSheet.getRange([i], 1); //brackets around 'i' are not necessary either

您可以简单地将整个数据范围读入2d数组,处理值,并在一个操作中将它们写入工作表。以下是如何在工作表中为1列执行此操作:

var valuesArray = sourceSheet.getRange(startRow, startCol, sourcesheet.getLastRow(), 1).getValues();


var processedValuesArray = valuesArray.map(function(row){

   var value = row[0];
   //do something with value

return value;

});

然后,您可以获得所需的匹配维度的目标范围,并为其写入新值:

targetRange.setValues(processedValuesArray);