0

Google 스프레드 시트를 사용하여 빠르고 쉽게 데이터베이스를 사용할 수 있습니다. 사용자가 양식을 제출하면 양식이 저장되어 저장됩니다.추가 된 시간에 대한 시간 소인을 작성하고 고유 한 점증 적 사용자 ID를 작성하려고합니다. 또한 마지막으로 변경된 열을 포함하십시오.

은 내가 Google 애플리케이션 스크립트를 통해 자동 업데이트하기 위해 노력하고있어 세 개의 열이 있습니다

  1. A '사용자 ID'(이 자동으로 새로운 행이 추가 될 때 생성되어야한다 안 변경 될 수 있어야 함)
  2. 행이 추가되었을 때의 시간 소인 그냥 'createdAt'열
  3. 행이 변경된 마지막 시간을 나타내는 'lastChanged'열.

How can I run a script only when someone adds new rowsDetermining the last row in a single column의 조언을 사용했지만 여전히 문제가 있습니다.

지금은 onEdit 이벤트에서 실행하고 있습니다. 그러나 'lastChanged'열이이 이벤트에 의해 트리거되어야하는 유일한 열일 것으로 보이고 다른 열은 changeType=='INSERT_ROW'과 같이 사용해야합니다. 사용자 세부 정보가 (Zapier를 통해) 제출되면 행이 추가되므로 onEdit가 userId 및 createdAt를 설정하는 데 작동하지 않습니다.

나는 또한 userID를 생성하는 나의 방법이 이상적이라고 생각하지 않는다.

여기까지 내가 지금까지 가지고있는 곳입니다.

function onEdit(e) { 

var userId = 1 // column A 
var createdTime = 2 //column B 
var lastChangedTime = 24 //column X 

var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = e.source.getSheets()[1]; //gets the second sheet 
var editedCell = sheet.getActiveCell(); //gets the edited cell 

var Avals = ss.getRange("A2:A").getValues(); 
var Alast = Avals.filter(String).length; 

//set date in same row as edit happens, at fixed column 
ss.getActiveSheet().getRange(ss.getActiveRange().getLastRow(), lastChangedTime, 1, 1).setValue(new Date()); 

//set the created time 
ss.getActiveSheet().getRange(ss.getActiveRange().getLastRow(), createdTime, 1, 1).setValue(new Date()); 
//set the userID 
ss.getActiveSheet().getRange(ss.getActiveRange().getLastRow(), userId, 1, 1).setValue(Alast+1); } 

답변

0

원본 포스터에서 업데이트 - 가장 우아한 것은 아니지만 제 목적을위한 해결책이 있습니다. 비판 & 제안을 매우 환영합니다 :) 가스를 통해 동적 수식을 삽입하는 가장 좋은 방법을 알아 냈어에 지금

...

function onChange(e) { 

var userId = 1 // column A 
var createdTime = 2 //column B 
var lastChangedTime = 24 //column X 

var ss = SpreadsheetApp.getActiveSpreadsheet(); 
var sheet = e.source.getSheets()[1]; //gets the second sheet 

var Avals = ss.getRange("A2:A").getValues(); //gets all the values of column A 
var Alast = Avals.filter(String).length; //puts all values in a string and gets the length 

var now = new Date(); 

if (e.changeType == "INSERT_ROW") { 

//set the created time 
ss.getActiveSheet().getRange(ss.getActiveRange().getLastRow(), createdTime, 1, 1).setValue(new Date()); 
//set the userID 
ss.getActiveSheet().getRange(ss.getActiveRange().getLastRow(), userId, 1, 1).setValue(Alast+1); 

//set lastChangedTime when the row is created 
ss.getActiveSheet().getRange(ss.getActiveRange().getLastRow(), lastChangedTime, 1, 1).setValue(now); 
    } 

    if (e.changeType == "EDIT") { 

//set date in same row as edit happens, at fixed column 
ss.getActiveSheet().getRange(ss.getActiveRange().getLastRow(), lastChangedTime, 1, 1).setValue(new Date()); 

    } 
} 
+0

그것은 당신이 당신의 솔루션을 공유 정말 괜찮아요하지만 이후 이런 종류의 기술해야한다 솔루션 적용 방법/이유. –

+0

@ Rubén onEdit()가이 문제를 관리하는 가장 효과적인 방법이 아니라 onChange (그리고 스크립트가 찾고있는 문서의 다른 종류의 변경 사항 지정)가 더 나은 목적을 제공한다는 것을 깨달은 것처럼 작동합니다. 이제이 방법을 사용하면 행 추가 여부 또는 셀 편집 여부에 따라 다른 작업을 실행할 수 있습니다. –

+0

설명은 대답에 포함되어야합니다. 코멘트는 일시적인 것입니다 :) –