首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Google添加了一个永久的时间戳

Google添加了一个永久的时间戳
EN

Stack Overflow用户
提问于 2022-09-15 12:09:26
回答 1查看 37关注 0票数 0

我正在设置一个工作表,根据任务的进度,一个人将能够在不同的时间选中一个复选框。因此,对于许多不同的任务,每行有5个复选框。

现在,我们的想法是,当你检查其中一个复选框时,在接下来的几个单元格中会出现一条消息。因此,消息构建在3个单元格中。第一个单元格只是文本,第二个单元格是日期,第三个单元格是时间。此外,这些单元格每个有5个段落(每个复选框一个)。

当我试图使时间戳停留在输入时的时候,问题就出现了。就像现在一样,每次我更新Google页面的任何部分时,时间都会发生变化。

我把我的公式设置如下:

关于短信:

代码语言:javascript
代码运行次数:0
运行
复制
=IF($C4=TRUE,"Insert text 1 here","")&CHAR(10)&IF($E4=TRUE, "Insert text here","")&CHAR(10)&IF($G4=TRUE, "Insert text 3 here","")&CHAR(10)&IF($I4=TRUE, "Insert text 4 here,"")&CHAR(10)&IF($K4=TRUE, "Insert text 5 here","")

日期:

代码语言:javascript
代码运行次数:0
运行
复制
=IF($C4=TRUE,(TEXT(NOW(),"mmm dd yyyy")),"")&CHAR(10)&IF($E4=TRUE,(TEXT(NOW(),"mmm dd yyyy")),"")&CHAR(10)&IF($G4=TRUE,(TEXT(NOW(),"mmm dd yyyy")),"")&CHAR(10)&IF($I4=TRUE,(TEXT(NOW(),"mmm dd yyyy")),"")&CHAR(10)&IF($K4=TRUE,(TEXT(NOW(),"mmm dd yyyy")),"")

就目前而言:

代码语言:javascript
代码运行次数:0
运行
复制
=IF($C4=TRUE,(TEXT(NOW(),"HH:mm")),"")&CHAR(10)&IF($E4=TRUE,(TEXT(NOW(),"HH:mm")),"")&CHAR(10)&IF($G4=TRUE,(TEXT(NOW(),"HH:mm")),"")&CHAR(10)&IF($I4=TRUE,(TEXT(NOW(),"HH:mm")),"")&CHAR(10)&IF($K4=TRUE,(TEXT(NOW(),"HH:mm")),"")

一切看起来都是这样的:

如果有人能帮我把这件事做好,以便在选中这些框后插入日期和时间,这样它们就不会再次改变,我将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2022-11-11 08:42:20

请注意,您的斗争与不断变化的日期时间。在过去的一年里,我和你一样挣扎,我找到了一个很好的解决方案。但是它需要用应用程序脚本做一些“肮脏的工作”。

我的案例中的一些背景

  • 我在电子表格中有多个表来运行并生成时间戳。
  • 我想跳过我的第一张纸而不运行,在其中生成时间戳。
  • 我想要每个编辑,即使我从Excel粘贴的每个值都要生成时间戳
  • 我希望时间戳是单独的,每一行都有自己的时间戳,精确到每一秒。
  • 我不希望在编辑任何其他行时对整个工作表时间戳进行全面刷新
  • 我有一个必须填充值的列,以证明是否需要为该特定行生成时间戳。
  • 我只想在专用列上指定时间戳。
代码语言:javascript
代码运行次数:0
运行
复制
function timestamp() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const totalSheet = ss.getSheets();

  for (let a=1; a<totalSheet.length; a++) {
    let sheet = ss.getSheets()[a];
    let range = sheet.getDataRange();
    let values = range.getValues(); 

    function autoCount() {
      let rowCount;
      for (let i = 0; i < values.length; i++) {
        rowCount = i
        if (values[i][0] === '') {
          break;
        }
      }
      return rowCount
    }

    rowNum = autoCount()

    for(let j=1; j<rowNum+1; j++){
      if (sheet.getRange(j+1,7).getValue() === '') {
        sheet.getRange(j+1,7).setValue(new Date()).setNumberFormat("yyyy-MM-dd hh:mm:ss");
      }
    }
  }
}

解释

  1. 首先,我用getSheets()制作了一个getSheets(),并使用一个for循环运行它。即识别该电子表格中的工作表总数。注意,在这里,我让let a=1;假设所有的JavaScript都一样,从0开始,值1跳过第一个工作表,然后在第二个工作表上运行
  2. 然后,您将注意到循环中有一个函数let sheet = ss.getSheets()[a]。请注意,如果您在const变量中的值不断地更改,则不应该使用let,所以使用let会很好。
  3. 然后,您将看到一个function autoCount()。也就是说,创建一个for循环来计数在其中编辑了值的行数。if (values[i][0] === '')将导航脚本,搜索具有值的整个工作表,查看行i和列0。在这里,0表示工作表的第一列,而i是工作表的行。是的,它的工作方式就像一个带有json感觉的panda对象。
  4. 然后,通过运行autoCount()找到被编辑的行数。给它一个rowNum变量来包含结果。
  5. 然后,将该rowNum传递到一个新的for循环中,并使用if (sheeet.getRange(j+1,7).getValue() === '')来确定哪一行没有使用时间戳进行编辑。请注意,这里的7表示工作表的第7列是我需要时间戳的地方。
  6. for循环中,是以指定的("yyyy-MM-dd hh:mm:ss")格式对日期进行setValue。你可以随意编辑成你喜欢的任何风格。
  7. ohya,请记住部署以激活触发器,事件类型为On Change。这并不限于编辑,但是对于所有类型的更改,,包括粘贴

下面是一张截图,介绍一下它的样子:

最后,请注意我的一些背景,然后才决定是否有解决办法为您的情况工作。干杯,快乐编码~!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73730882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档