Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 一旦输入,是否冻结日期?_Google Apps Script_Google Sheets_Timestamp - Fatal编程技术网

Google apps script 一旦输入,是否冻结日期?

Google apps script 一旦输入,是否冻结日期?,google-apps-script,google-sheets,timestamp,Google Apps Script,Google Sheets,Timestamp,我使用一个项目计划表,其中有一个名为“状态”的列,我可以从下拉菜单中选择“完成”或“打开”。在另一个单元格中,我输入我的ECD(预期完成日期) 我想将一个任务的状态设置为“完成”,另一个名为ACD(实际完成日期)的单元格应该显示当前日期,然后冻结该单元格。今天或现在使用该功能总是会每天更改日期 是否有一个公式或脚本可以为我这样做?假设“完成”在单元格A1中,日期/时间在B1 =IF(A1="Done",IF(LEN(B1)>0,B1,NOW()),"") 但是,您需要启用迭代 此外,如果

我使用一个项目计划表,其中有一个名为“状态”的列,我可以从下拉菜单中选择“完成”或“打开”。在另一个单元格中,我输入我的ECD(预期完成日期)

我想将一个任务的状态设置为“完成”,另一个名为ACD(实际完成日期)的单元格应该显示当前日期,然后冻结该单元格。今天或现在使用该功能总是会每天更改日期

是否有一个公式或脚本可以为我这样做?

假设“完成”在单元格
A1
中,日期/时间在
B1

=IF(A1="Done",IF(LEN(B1)>0,B1,NOW()),"")
但是,您需要启用迭代


此外,如果删除“完成”,单元格将再次为空

您要查找的是宏,而不是公式。此解决方案假定您的ECD列为“A”(第1列),然后您的状态列为“B”(第2列)

步骤1)按Alt+F11,这将在VBA中打开代码编辑器

步骤2)将下面的代码复制并粘贴到公式所在的“工作表”中

步骤3)将工作簿另存为启用宏的电子表格。(xlsm)

注意:只有当只有一个单元格设置为“完成”时,才会执行此宏。通过删除第一个“if”语句的“Target.Rows.Count=1”部分,可以将其更改为处理多个单元格。如果您通过单击“完成”值并将其拖动到多个单元格来“扩展”,则可能会出现这种情况

注2:如果要分配一次日期,并防止日期不断更改,即使您再次将字段修改为“完成”。将最后一个“if”语句更改为以下内容:

If (UCASE(cell.Value) = "DONE" And Target.Worksheet.Cells(cell.row, 1).Value = "") Then
我爱你

但是不要做一个淘气的男孩,不要分享你的代码

将A列保留为空,在提交表单或编辑行时,A列将显示当前日期,并且不会更改:-)


这是由于问题(在给出答案后)发生变化而导致的与标准不匹配的投票答案,这不是正确的做法。此外,我的答案是完全功能性的,只需一个单元格公式,即使在未启用宏的情况下也可以使用。另外:否决投票应该在评论中说明原因。对不起,伙计们,我没有提到这是谷歌的工作表。所以我不能用马克罗斯。
If (UCASE(cell.Value) = "DONE" And Target.Worksheet.Cells(cell.row, 1).Value = "") Then
function onEdit() {
var dateColNum = 1 //column F
var ss1 = SpreadsheetApp.getActiveSpreadsheet();

//set date in same row as edit happens, at fixed column  
var nextCell = ss1.getActiveSheet().getRange(ss1.getActiveRange().getLastRow(), dateColNum, 1, 1)
if( nextCell.getValue() === '' ) //is empty?
    nextCell.setValue(new Date());

}