【问题标题】:getDisplayValue() and getValue() from a cell returns #VALUE! error most of the time单元格中的 getDisplayValue() 和 getValue() 返回 #VALUE!大多数时候出错
【发布时间】:2021-12-21 16:36:46
【问题描述】:

我已经修改了一个打卡系统的脚本,添加了一个函数,该函数从 Schedule_data 表中的 AQ1 单元格中获取一个值,并将其放在 Break_data 表的 E 列中,最后一个空行与单独单元格中的其他数据一起。 我遇到的问题是有时单元格内容被复制过来,有时我得到#VALUE!而是错误。我尝试从引用的单元格中删除公式,只留下纯文本,但得到了相同的结果。将 getValue() 更改为 getDisplayValue() 也没有改变结果。在 if/else 语句之后清除记录器也没有帮助。该错误似乎没有任何模式出现。原始脚本仍然可以正常工作,并且始终在其各自的 A、B、C、D 列中生成数据,但恐怕我对应用程序脚本的了解不够,无法有效地对其进行故障排除。

这是我目前所拥有的:

function cellRange(value) {
return 
SpreadsheetApp.getActive().getSheetByName('Schedule_data').getRange(value).getDisplayValue();
}
function setValue(cellName, value) {
SpreadsheetApp.getActive().getSheetByName('Break_data').getRange(cellName).setValue(value);
}
function getValue(cellName) {
return 
SpreadsheetApp.getActive().getSheetByName('Break_data').getRange(cellName).getValue();
}
function getNextRow() {
return SpreadsheetApp.getActive().getSheetByName('Break_data').getLastRow() + 1;
}
function addRecord(a, b, c, d, e) {
  var row = getNextRow();
  setValue('A' + row, a);
  setValue('B' + row, b);
  setValue('C' + row, c);
  setValue('D' + row, d);
  setValue('E' + row, e);
}

function pause() {
var sheet = SpreadsheetApp.getActive().getSheetByName('Break_data');
var lastRow = sheet.getLastRow();
var setColumn = 2;
var inORout = sheet.getRange(lastRow, setColumn).getValue();
Logger.log(inORout);

  if(inORout == 'Pause'){
    return;
  }
  else
   var formatDate = Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "h:mma");
   var fullDate = Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "MM/dd/yy");
   setValue('d1', Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "EEEE"));
   addRecord(getValue('d1'),'Pause',  formatDate, fullDate, cellRange('aq1'));
}

function resume() {
var sheet = SpreadsheetApp.getActive().getSheetByName('Break_data');
var lastRow = sheet.getLastRow();
var setColumn = 2;
var inORout = sheet.getRange(lastRow, setColumn).getValue();
Logger.log(inORout);

  if(inORout == 'Resume'){
    return;
  }
  else
   var formatDate = Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "h:mma");
   var fullDate = Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "MM/dd/yy");
   setValue('d1', Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "EEEE"));
   addRecord(getValue('d1'),'Resume',  formatDate, fullDate, cellRange('aq1'));
}

image of value error

尽管它在所附图像中看起来如何,但添加的 E 列与一周中的当前日期无关或与 A 列相关,而是显示项目的开始日期,有时可能持续时间比天。

【问题讨论】:

    标签: google-apps-script google-sheets copy-paste valueerror getvalue


    【解决方案1】:

    暂停或删除

    我认为它可以为你工作:

    function pauseOrResume(pr='Pause') {
      const opts = ['Pause','Resume'];
      const ss = SpreadsheetApp.getActive();
      const ash = ss.getActiveSheet();
      const sh = ss.getSheetByName('Break_data')
      const sdsh = ss.getSheetByName('Schedule_data');
      const inORout = sh.getRange(sh.getLastRow(), 2).getDisplayValue();
      if (inOrout == pr) {
        return;
      } else {
        const formatDate = Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), "h:mma");
        const fullDate = Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), "MM/dd/yy");
        sh.getRange('D1').setValue(Utilities.formatDate(new Date(), ss.getSpreadsheetTimeZone(), "EEEE"));
        ash.appendRow([sh.getRange('D1').getDisplayValue(), pr , formatDate, fullDate, sdsh.getRange('aq1').getDisplayValue()])
      }
    }
    

    将这些辅助函数附加到您的按钮或使用侧边栏按钮,我们可以使用它们传递参数。无论哪种方式都可以。就我个人而言,我不喜欢床单上的按钮,但这就是我自己。

    我把所有的getValue()和getValues()都改成了displayValue/s();

    function pause() {
      pauseOrResume();
    }
    
    function resume() {
      pauseOrResume('Resume')
    }
    

    【讨论】:

    • 我们需要一些数据来隔离问题。
    • 谢谢!我试过你的版本,结果出现了:异常:参数(字符串)与 SpreadsheetApp.Spreadsheet.getSelection 的方法签名不匹配。
    • 哦,这是我的错误。他们昨天稍微更改了编辑器中的软件,它的行为有所不同。那应该是 getSheetByName() 但是当我第一次看到你的代码时,我是新的,它可以全部完成。一开始它可能不起作用,但如果我们一起工作,如果你能解释你想要做什么,我相信我们可以让它为你工作。
    • 也许更多的上下文会有所帮助 - 暂停和恢复功能与另一张纸上的两个按钮相关联。当按下暂停按钮时,代码会查看 B 列以检查最后一行是否不包含“暂停”文本。如果没有,那么它将“暂停”放在新行中。恢复按钮也是如此。然后另一张表查看暂停和恢复之间的时间差,并通过一些公式将其添加到计划中。它不一定必须是 2 个单独的按钮,我只是不知道如何将所有内容修改为只有 1 个暂停/恢复按钮。
    • 我马上就回来,我刚起床
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多