【问题标题】:String ranges in Google Apps ScriptGoogle Apps 脚本中的字符串范围
【发布时间】:2020-05-28 01:05:51
【问题描述】:

我有一张工作表,我需要从中获取值并在新工作表中设置,其中一个值要求我在索引 20,26 处对字符串值进行切片。我可以使用 .getValue().slice(20,26) 和 .setValue() 来实现这一点。但是,在所有行中都设置了相同的数据,这是可以预料的,因为我只得到一个数据单元格。为了解决这个问题,我尝试了一个失败的 for 循环。

当我尝试 .getValues().slice(20,26) 时,它返回一个空数组,并引发以下错误:数据中的行数与范围内的行数不匹配。数据有 0 但范围有 20。

我的代码如下,欢迎任何指导。

function pj() {
 // Get Active spreadsheet.
   var sheet = SpreadsheetApp.getActiveSpreadsheet();
 //Get last row processed and update
   var startRow =sheet.getSheetByName("Index").getRange("A1").getValue();
   startRow++;
// Get payments sheet.
var paymentSheet = sheet.getSheetByName("Payments");
var clientSheet = sheet.getSheetByName("Client Details");
var lastRow = paymentSheet.getLastRow();
//Inputs
var firstName = paymentSheet.getRange(startRow, 3, (lastRow-startRow+1), 1).getValues();
var lastName= paymentSheet.getRange(startRow, 4, (lastRow-startRow+1), 1).getValues();
var paymentId = paymentSheet.getRange(startRow, 14, (lastRow-startRow+1), 1).getValues().slice(20,26);
}

//Outputs
clientSheet.getRange(2,1,(lastRow-startRow+1),1).setValues(firstName);
clientSheet.getRange(2,8, (lastRow-startRow+1),1).setValues(paymentId);



//Update the last row processed
sheet.getSheetByName('Index').getRange("A1").setValue(lastRow);
}  

请查看我正在使用的工作表的图片,因为您将看到 N 列包含一个付款 ID,其中包含客户的唯一标识符,我需要提取该标识符以便将此数据上传到 Salesforce。问题似乎是 Logger.log 在通过数组时正确报告字符串,但将长度报告为 1。我尝试以各种方式更改该列的格式,文本、数字等,但它没有似乎对报告的长度没有任何影响。我假设这就是拆分功能不起作用的原因,但我不确定它为什么会发生?Sheet

【问题讨论】:

  • 您能否分享您正在处理的电子表格的副本(不含敏感信息)以及您期望的结果?
  • getValues 返回一个数组数组,因此您需要对其进行索引。外部数组是行,内部数组是列。正如所料,它是从 0 开始的。

标签: google-apps-script


【解决方案1】:

我猜到了很多,但它应该看起来像这样:

function pj() {
  var ss=SpreadsheetApp.getActive();
  var isht=ss.getSheetByName("Index");
  var startRow=isht.getRange("A1").getValue()+1;
  var psht=ss.getSheetByName("Payments");
  var csht=ss.getSheetByName("Client Details");
  var lastRow=psht.getLastRow();
  var prg=psht.getRange(startRow,1,psht.getLastRow()-startRow+1,14);
  var pvals=prg.getValues();
  pvals.forEach(function(r,i){
    csht.getRange(i+2,1).setValue(r[2]);
    csht.getRange(i+2,2).setValue(r[3]);
    csht.getRange(i+2,8).setValue(r[13].slice(20,26));
  });
  isht.getRange("A1").setValue(csht.getLastRow());
}

【讨论】:

  • 你是一个绝对的传奇:) 这已经困扰了我一个多星期。我会很感激解释我哪里出错了?
  • var paymentId = paymentSheet.getRange(startRow, 14, (lastRow-startRow+1), 1).getValues().slice(20,26); } Slice 不适用于 2D 数组,即使在这种情况下,它仍然无法为您提供所需的东西。您将不得不遍历对每个单独的单元格字符串进行切片的数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多