【问题标题】:find the last occurrence on column A and return the value from the same row on C (Apps Script)在 A 列中找到最后一次出现并返回 C 上同一行的值(Apps 脚本)
【发布时间】:2020-05-11 02:49:27
【问题描述】:

我有一个数据表,其中包含: |货品代码 |项目 |版本|

目标是获取项目的最后一个版本并将其增加 0.1,因此如果项目的版本是 03,那么一旦调用此函数,它的新版本将是 3.1。

下面的代码在范围(数据表)中找到第一个,但不是最后一个。我需要找到该项目的最新版本并增加它:

function newVersion() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var sheet = ss.getSheetByName("ArquivoItens");
  var range = sheet.getRange(2,1,ss.getLastRow(),3).getValues();
  var editarSheet = ss.getSheetByName('EditarItem');
  var itemCode = editarSheet.getRange("W5").getValue();
  var version = editarSheet.getRange("AC4").getValue();
    for(var a = 0; a < range.length; a++){
        if(range[a].lastIndexOf(itemCode)>-1){
        Logger.log("Código: "+ itemCode);
        Logger.log("Versão: "+ range[a][2]);
        Logger.log("Produto: "+ range[a][1]);
        Logger.log(range[a].indexOf(itemCode));
        return range[a][2];
    }
  }

任何光线都值得赞赏。

【问题讨论】:

  • 确定您想要什么。在您的代码中,您使用editarSheet.getRange("W5").getValue(); 获得一个项目代码,然后如果它在您的range 中,则您的项目版本增加0.1,对吗?为什么你的函数中有返回值?它是返回到另一个函数还是您正在使用Custom function
  • 嗨,@albertovielma!这个想法是,如果用户单击确认,将调用函数 newVersion。然后,正在编辑的项目将以其版本 + 0.1 保存。感谢您的调查。
  • 感谢您提供的信息。你是说如果用户点击了确认。这意味着您正在使用Custom Menus?您能否提供一个包含一些虚拟数据的电子表格。解决错误会更容易
  • 感谢您对此进行调查。用户将看到一个弹出窗口,要求他确认。然后,代码继续运行并调用该函数。

标签: google-apps-script google-sheets lastindexof


【解决方案1】:
   function findTheLastVersionAndAdd(itemcode) {
  if(itemcode) {
    const ss=SpreadsheetApp.getActive();
    const sh=ss.getSheetByName('Sheet1');
    const sr=2;//guess start row is 2
    const vs=sh.getRange(sr,1,sh.getLastRow()-sr+1,3).getValues();
    var iObj={itemcode:''};
    vs.forEach(function(r,i){
      if(iObj.hasOwnProperty(r[0])) {
        iObj[itemcode]=i+sr;//updates the object if r[0]==itemcode
      }
    });
    return Number(sh.getRange(iObj[itemcode],3).getValue()) +.1;
  }
}

【讨论】:

  • 嗨!我不确定我是否清楚,但需要获取某个 itemCode 的最新版本。
  • 我一直在寻找所有可能的原因,但我仍然得到异常:参数 (null,number) 与 SpreadsheetApp.Sheet.getRange 的方法签名不对应。我尝试从 getActive 更改为 getActiveSpreadsheet,但在调用该函数时仍然出现此错误。谢谢!
【解决方案2】:

在您的 cmets 和解释之后,我编写了这段代码,可以帮助您实现您想要的:

function newVersion(e){
  var itemCell = e.source.getActiveCell();
  var col = itemCell.getColumn();
  // If the Column is the one where the items are then continue
  if(itemCell.getColumn() === 2){
    var ui = SpreadsheetApp.getUi();
    var result = ui.alert('Please confirm','Are you sure you want to continue?',
      ui.ButtonSet.YES_NO);
    // Process the user's response.
    if (result == ui.Button.YES) {
      // User clicked "Yes".
      // Get the item's version and increment its value
      var versionCell =  itemCell.offset(0, 1);
      var itemVersion = versionCell.getValue();
      var updatedVersion = itemVersion + 0.1;
      versionCell.setValue(updatedVersion);
    } else {
      // User clicked "No" or X in the title bar.
      ui.alert('Permission denied.');
      // Return to value previously edited
      itemCell.setValue(e.oldValue);
    }
  }
}

代码的作用是,当您更改项目中的值时,您将收到pop-up window 要求您确认。如果您确实确认,然后使用offset(rowOffset, columnOffset) 方法,您将获得项目的版本单元格,并且通过这种方式,您将能够增加它。如果您不确认,那么您的项目中的价值将恢复为旧的。注意e 代表Event Object

考虑到我使用的是Installable Trigger,要进行设置,请执行以下操作:

1)转到您的 Apps 脚本项目

2) 点击编辑->当前项目的触发器

3) 点击“+ 添加触发器”

4) 选择:

  • 选择要运行的函数 -> 函数名称

  • 选择事件源->从电子表格

  • 选择事件类型 -> 编辑时

5)点击保存

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    相关资源
    最近更新 更多