Тёмный

하마터면 열심히 엑셀할 뻔 했다! 6. 앱스 스크립트(매크로)로 구글 시트에게 일시키기 

중년코딩
Подписаться 7 тыс.
Просмотров 25 тыс.
50% 1

Опубликовано:

 

26 окт 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 36   
@user-aheb7s5hdhf
@user-aheb7s5hdhf 4 года назад
구글시트 강의를 한국말로 들을 수 있어서 너무 좋아요
@legacycoder
@legacycoder 4 года назад
도움이 되셨다니 기쁩니다!
@연탄재-x3j
@연탄재-x3j 4 года назад
예전에 구글시트에서 트리거가 되는 것을 우연히 알게되어, 프로그램도 못하는데, 다른 분의 시트를 한참 뜯어서 매일 결과물을 메일로 발송하게 하는데 성공했어요. 이것 땜에 엑셀로 못갑니다. 강의 감사합니다.
@박도신-z2d
@박도신-z2d 4 года назад
최고예요!!!
@ehdehddl542
@ehdehddl542 2 года назад
좋은 강의 감사드립니다. 질문이 세 개 있는데요, 첫째, 스크립트로 다른 시트의 데이터를 가져와서 본래 시트의 셀을 채우는데 참조 방식으로(데이터 복사가 아니라) 가지고 오려면 어떻게 해야 할까요? (그러면 다른 시트의 데이터가 변경되도 바로 갱신되고 데이터 절약도 할 수 있어서요.) 둘째는 가지고 온 데이터에 웹링크가 있는데 이게 문자열로 읽혀지고 적혀져서 링크 활성화를 하려면 셀 안으로 굳이 들어가서 엔터를 눌러줘야 합니다. 이거 자동으로 활성화 시킨채로 셀 안에 채워지는 방법은 뭘까요? 셋째, 기본적인 것인데, 셀 사이즈를 그냥 딱 일정하게 하고 싶은데 데이터를 다른 시트로부터 가져왔을 때(이미 서식 메뉴 아래 줄바꿈을 자르기로 했음에도 불구하고) 셀 사이즈가 커진채로 줄바꿈 자르기가 되어 나타납니다... ㅜㅜ 어찌할 수 없을까요?
@legacycoder
@legacycoder 2 года назад
1. 앱스스크립트로 값이 아닌 수식을 넣어주면 됩니다. setFormula() 메소드를 사용하세요. developers.google.com/apps-script/reference/spreadsheet/range#setformulaformula 2. RichTextValue로 해당 셀을 설정하시면 됩니다. 여기를 참조하세요. spreadsheet.dev/add-links-to-a-cell-in-google-sheets-using-apps-script 3. 셀 사이즈를 나중에 조정하시는 법을 추천드립니다.
@trustsophie
@trustsophie 3 года назад
질문이 있습니다. 1. 제가 키워드를 입력하면 검색사이트 검색결과가 출력되도록 했습니다. 첫 키워드 결과가 50개, 두 번째 키워드 결과가 30개입니다. 첫번째 결과를 실행한 후, 두번째 키워드를 검색하면 두번째 검색결과 30개가 출력되는데, 그 다음 행에 첫번째 검색결과 후반부 20개가 살아있습니다. 이런 일을 방지하기 위해 해당시트의 특정영역을 지우고 시작했으면 좋겠는데요. 방법이 있을까요? 2. 구글 스크립트를 실행하려면 구글 스크립트 메뉴로 가서 실행버튼을 눌러야 합니다. 그냥 스프레드 시트 화면에서 실행할 수 있는 방법이 궁금합니다. 7분 30분에 버튼만드는 법이 나오는데, 제 스크립트에서 안 되네요. 앞에 버튼 관련 코드 다음에 똑같은 함수가 sheet2, sheet3에서 나오는데 반복해서 나와서 그럴까요?function onOpen() { SpreadsheetApp. getUi() // DocumentApp or SlidesApp or FormApp .createMenu ( 'Dialog' ) .addItem ("RU-vidScraper",'RU-vidScraper') .addToUI (); } 버튼을 한개만 만들려고 해서 .add item을 한 번만 입력했는데요. 알 수 없는 오류가 발생했다는 메시지가 뜹니다.
@legacycoder
@legacycoder 3 года назад
2. TypeError: SpreadsheetApp.getUi(...).createMenu(...).addItem(...).addToUI is not a function -> addToUI가 아니라 addToUi로 마지막 i가 소문자여야 합니다. 억울하지만 컴퓨터가 알아먹을 수 있도록 해줘야 합니다. 1. 시트 전체 혹은 범위를 지우거나 시트의 특정 부분을 "이름이 있는 범위"로 지정해 두고 매번 시트를 열 때마다 지우도록 할 수 있겠죠. SpreadsheetApp.getActive().getSheetByName('시트1').getRange('A2:Z').clear(); 를 onOpen() 함수 안에 넣어두면 시트가 열릴 때마다 지워질 거에요. 별도의 함수로 만들어 두고 메뉴나 버튼을 연결할 수도 있겠죠. getRange를 getNamedRange로 해서 이름이 지정된 범위를 지워줄 수도 있습니다.
@wooin2u
@wooin2u 2 года назад
구글시트를 엑셀처럼 사용하다가 시리즈 강의 듣고 도움 많이 받고있습니다. 감사합니다.
@legacycoder
@legacycoder 2 года назад
도움이 되셨다니 감사합니다.
@ssangchoo1004
@ssangchoo1004 3 года назад
중년코딩님 항상 감사한 마음으로 유튜브와 블로그 잘 보고 있습니다! 여기저기 찾다가 도저히 안되서 문의드립니다.ㅜ 스크립트로 이메일을 보내고 싶은데요. 예를 들어 a2:c5셀까지의 내용을 a1에 있는 이메일주소로 보내고 싶습니다. 더 나아가서 a2:c5셀까지 data만 가지 않고 이미지파일이나 pdf파일로도 전송이 가능할까요? 너무 어려운 부분일까요? 바쁘실텐데 염치불구하고 질문 남깁니다. 언제나 가정에 평화가 깃들길 바랍니다.
@legacycoder
@legacycoder 3 года назад
너무 늦은 답변 죄송합니다. "내용"을 텍스트로 보내는 것은 여러가지 방법으로 가능합니다. 해당 시트가 공개되어 있거나 웹에 개시되어 있다면 URL을 통해 시트의 내용을 메일에 embed할 수도 있을 것입니다. 앱스스크립트나 zapier같은 툴을 사용할 수도 있습니다. pdf 파일 전송은 시트의 특정 범위를 pdf로 변환하여 구글 드라이브에 저장한 뒤 메일에 첨부하는 방식으로 해결할 수 있습니다. 제 책의 앱스스크립트 부분에 자세히 설명되어 있습니다. 예제는 gsheet.github.io 에서도 확인하실 수 있고 간단한 스크립트이니, 앱스스크립트를 이해하신다면 예제만 보셔도 쉽게 따라하실 수 있을 것입니다. 참고로 구글 시트는 URL에 ?range=B15 와 같이 파라미터를 통해 셀 주소를 참조할 수 있습니다. 이 방식이 B15:C18 같은 범위에도 적용이 되는지, pdf 방식의 export에도 적용이 되는지는 기억이 확실하지 않습니다. 범위 참조보다 pdf로 변환할 내용만 한개의 시트로 모아놓는 게 더 편할 것입니다. 나중에 시트 구조가 살짝 바뀌더라도 문제가 생길 여지가 적구요. 그리고 이미지 파일로 바꾸는 건 어렵습니다. 저는 그래서 파이썬으로 브라우저를 띄우고 이미지 캡처를 한 뒤에 전송하는 방법도 사용해 봤지만 추천하지 않습니다. 도움이 되셨길 바라며 추가적인 궁금증이 있으시면 또 질문 주십시오.
@ssangchoo1004
@ssangchoo1004 3 года назад
@@legacycoder 상세한 답변 감사드립니다. 책을 구매하고 아직 스크립트쪽을 완독하지 못했네요! 책에서도 도움 많이 얻고 있습니다. 퇴근하면 정독하고 공부한 후 궁금증 생기면 또 질문하겠습니다.^^ 감사드립니다.
@jinyoungyu8345
@jinyoungyu8345 4 года назад
맨땅에 헤딩을 지금도 하고 있지만.. 처음에 이 영상을 봤다면 너무너무 좋았을 것 같습니다ㅠㅠ 앱스 스크립트를 시작할 때 시간을 확 줄일 수 있을 것 같아서 너무 좋은 강의라고 상각합니다! 많이 많이 공유하겠습니다. 새복 많이 받으세요 :)
@legacycoder
@legacycoder 4 года назад
감사합니다. 앱스스크립트는 깊게 들어가기도 겉만 훑기도 애매해서 고민했는데 좋은 말씀 해주시니 마음이 좀 놓이네요. 새해 복 많이 받으세요!
@oneglobal8387
@oneglobal8387 4 года назад
기다렸습니다..
@legacycoder
@legacycoder 4 года назад
연말이라 술자리가 많았습니다. ㅎㅎ
@김상완-j8d
@김상완-j8d 4 года назад
멋짐
@trustsophie
@trustsophie 3 года назад
알려주신 대로 타이핑 잘못한 거 고치니 버튼이 추가되었습니다. 감사합니다. ^^; 그런데 다른 문제가 생겼어요. 1. 'Run code를 누르면 RU-vidScraper 함수 메뉴가 나옵니다. RU-vidScraper를 눌러야 실행이 되는데, 클릭 한 번에 스크립트가 실행되게 하는 방법은 없을까요? 2. button 추가 , sheet 2 3 의 기존검색결과 지우기 --> 새로 크롤링 순으로 짜여져 있는데요. sheet2,3 의 기존검색결과 지우기는 되는데, 자동으로 새로 크롤링이 안 되네요. ㅠㅠ youtubeScraper 버튼을 눌러야 실행됩니다. 자동으로 되는 크롤링이 되는 법이 궁급합니다. 어떤 경우든지, 검색결과가 출력될 때 기존 검색결과를 지우고 시작했으면 좋겠습니다. 그러면 youtubescraper 함수 밑에 지워주기를 해야하는데 그렇게 하니 에러가 나네요 3. 크롤링 결과물의 열을 바꾸고 싶은데요. return 이하 순서를 바꾸면 될 줄 알았는데 안 되네요. 제가 원하는 것은 날짜,제목,채널명 ~ 순으로 나오는 것입니다. e.id.videoId 대신 e.snippet.publishedAt, 으로 바꿔도 안 되는데 .. 다른 방법으로 해야 하는 것일까요? //button 추가 function onOpen() { SpreadsheetApp. getUi() .createMenu ('Run code') .addItem ("RU-vidScraper",'RU-vidScraper') .addToUi (); SpreadsheetApp.getActive().getSheetByName('sheet2').getRange('A4:Z').clear(); SpreadsheetApp.getActive().getSheetByName('sheet3').getRange('A4:Z').clear(); } function RU-vidScraper() { var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2"); var keyword = sh1.getRange("B1").getValue(); var results = RU-vid.Search.list('id,snippet', {q:keyword, maxResults:50}); //Video ID Published Date Channel ID "Video Title //" Description Thumbnail URL Channel Title var items = results.items.map(function(e){ return [e.id.videoId, e.snippet.publishedAt, e.snippet.channelId, e.snippet.title, e.snippet.description, e.snippet.thumbnails["default"].url, e.snippet.channelTitle] }) sh1.getRange(4, 1, items.length, items[0].length).setValues(items) var sh1 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet3"); var keyword = sh1.getRange("B1").getValue(); var results = RU-vid.Search.list('id,snippet', {q:keyword, maxResults:50}); //Video ID Published Date Channel ID "Video Title //" Description Thumbnail URL Channel Title var items = results.items.map(function(e){ return [e.id.videoId, e.snippet.publishedAt, e.snippet.channelId, e.snippet.title, e.snippet.description, e.snippet.thumbnails["default"].url, e.snippet.channelTitle] }) sh1.getRange(4, 1, items.length, items[0].length).setValues(items) }
@legacycoder
@legacycoder 3 года назад
한 번 클릭으로 해결하려면 버튼을 써야 합니다. 열 때 실행을 하려면 onOpen함수 안에서 자동으로 실행할 함수인 RU-vidScrapper를 호출해줘야 합니다. onOpen함수 마지막에 RU-vidScrapper();를 넣어보세요.
@taehyeonkim8044
@taehyeonkim8044 4 года назад
선생님, 혼자서 이거저거 찾아보고 해보다가 너무 어려워서 바쁘실텐데 불구하고 질문 남깁니다. 학생들이 각 반에서 구글 설문지로 응답한 내용을 출석 시트에 정말 간단한 트리거를 사용하여 응답이 새로 들어올 때마다 학번순으로 정렬되게는 만들었습니다. 제가 하고 싶은 것은 한 반에 30명이고 그 명단(학번과 이름)이 있는 상태에서 현재 응답한 학생이 25명이라면 응답을 하지 않은 5명을 일일이 찾아내지 않고 이름만 따로 산출되게 만들 수 있는지가 궁금합니다. 요약하자면 실시간으로 수업에 아직 과제를 제출하지 않은 학생들을 반환되도록 만들고 싶은데 가능할까요? 가능한지의 여부와 방향만 조금 제시해주시면 제가 열심히 찾아보겠습니다ㅠㅠ
@legacycoder
@legacycoder 4 года назад
응답하지 않은 학생 명단은 FILTER(학생 전체 명단, 응답 여부 체크 배열)나 QUERY(학생 전체 명단, "SELECT * WHERE 응답 < 1")과 같은 식으로 처리하면 쉽게 불러 올 수 있을 것입니다. 설문지 응답 시트와 응답하지 않은 명단을 어떻게 구성할지에 따라 응답여부체크를 어떻게 만들지가 달라질 테니 이 부분만 고민하시면 됩니다. 설문지 응답 시트를 설문지(과제)마다 따로 만들지, 한 설문지로 모든 과제를 한꺼번에 관리할지. 응답하지 않은 사람 명단은 과제마다 별도의 시트로 만들지 등등을 고민해 보세요. 그런데 저는 안 써봤지만 구글 클래스룸을 이용하시면 과제 관리하는 기능도 쉽게 처리할 수 있지 않을까요?
@taehyeonkim8044
@taehyeonkim8044 4 года назад
@@legacycoder 감사합니다 선생님. 현재는 구글 클래스룸에 제가 제작한 수업 영상과 학습 자료를 올리고 매 시간마다 구글 설문지(퀴즈 형식)를 통해서 형성평가를 진행합니다. 그래서 설문지 제출이 되어야 출석으로 인정받는 형태입니다. 10개 반 각각의 클래스룸에 따로 게시물을 올려야 해서 "수업 주제: 매크로" 라는 식의 스프레드 시트를 만들고 각 반별로 시트를 나눠서 1반 시트 ~ 10반 시트에 응답한 학생의 학번, 이름, 풀이 내용 등만 수집되는 형태로 운영이 되고 있어요. 학생들이 설문지도 제출하고 클래스룸에서 과제 완료도 눌러주면 좋은데 아무리 이야기해도 둘 다 꼬박꼬박 챙겨서 하는 학생들이 잘 없어서.. 설문지 제출 여부로만 확인하고 있습니다. 사실 눈으로 확인해도 금방 하는데 스프레드 시트 공부도 할겸 이것저것 해보는 중이라 일부러 여러 기능 건드려보고 있는 중입니다. 스프레드 시트는 강의 자료가 별로 없는데 보관함에 넣어두고 도움 많이 받고 있습니다.
@ssangchoo1004
@ssangchoo1004 2 года назад
중년코딩님~ 질문 한가지만 더 드려도 될까요 새벽에 알람이 울리지는 않을까 걱정이긴 하지만 ㅠㅠ 새벽까지 붙잡고 있는데 해결되지 않는 문제가 하나 있네요. function input() { var spreadsheet = SpreadsheetApp.getActiveSheet(); var hang = spreadsheet.getRange('ah1').getValue(); spreadsheet.getRange(hang,1).activate(); } ah1 셀에는 데이터가 있는 가장 아래쪽의 행번호를 나오게 한 후에 (함수로) 위의 스크립트를 적용했는데요. 실행을 하면 잘 됩니다. 하지만! ㅠ 도형을 만들어서 스크립트 할당을 하게 되면 가장 마지막 셀로 이동은 하지만 바로 활성화가 되지 않네요 ㅠ 타이핑을 하면 먹히지가 않네요. 도형쪽으로 activate가 되는거 같습니다. 혹~!시 이 문제에 대한 해결책을 알고 계실까요?
@legacycoder
@legacycoder 2 года назад
답이 늦었습니다. 스크립트 종료 후 바로 입력을 할 수 없는 이유는 눈에 안 보이는 팝업이 떠 있는 상태이기 때문입니다. esc키를 누르고 입력을 하시면 됩니다. 아래 시트에서 관련 내용을 확인하실 수 있습니다. docs.google.com/spreadsheets/d/1BKlcjmaKtQXAw9UmQObtMCYXs_EvTCZk0JKA4QkF-g8/edit#gid=0
@ningbbang
@ningbbang 3 года назад
영상보고 책 구매 결정했습니다. 감사합니다~
@legacycoder
@legacycoder 2 года назад
감사합니다! 열심히 게을러지세요.
@MrMagLee
@MrMagLee 3 года назад
안녕하세요.... 구글 스프레드시트의 활용에 대해 전적으로 '중년코딩'님의 영상을 보고 배워가면서 작업이 있는데요. 순환종석성을 피할 수 없는 상황에 접했습니다. 제의 부족한 생각으로 순환종석성에 빠진 참조 영역 중 한 부분만이라도 스크립트로 하면 해결 될 것 같은데 제가 스크립트는 완전 무지라서요. 혹시 다음의 수식을 스크립트로 하려면 어떻게 코딩해야 해야 할지 도움좀 부탁드려 될까요? =if((D$3:D="판매완료")*(A3""),index(FILTER(P$3:P,(row(A$3:A)
@legacycoder
@legacycoder 3 года назад
답변이 늦었습니다. 위 수식을 어떤 상황에서 어떤 문제를 해결하기 위해 사용하시는 것인지는 질문만으로는 이해하기 어렵습니다. 이 수식을 A, D, B, P열에 사용하지 않는 경우라면 참조가 나오지는 않을 것 같은데, 지금 그렇게 사용을 하셔야 하는 상황인가요? 스크립트를 사용해서 순환참조를 해결하는 것은 반복계산을 통해 해를 찾는 방식이고 기본 원리는 스프레드시트 설정에서 반복계산 옵션을 켜주는 것과 다르지 않습니다. 따라서 특정 셀의 값이 아닌 한 열 전체의 값을 순환참조로 처리하려는 경우에는 적합하지 않을 것 같습니다. 또한 구글 스프레드시트에는 해찾기 기능이 없어서 원하는 방식으로 구현이 어려울 듯 합니다.
@MrMagLee
@MrMagLee 3 года назад
@@legacycoder 제가 도움을 청하는 입장인데 최소한의 예도 갖추지 못했네요. 죄송합니다. 간단히 관련 시트 링크를 공유드려 봅니다. 가능하신 시간 할애 해주실 수 있으면 잠시 봐주세요. docs.google.com/spreadsheets/d/1eLXuN57PyWjeTQr5-hXTKs_8GDQvZMg9_Qg9wAlk0oM/edit?usp=sharing
@legacycoder
@legacycoder 3 года назад
@@MrMagLee 수식 수정하고 코멘트 남겼습니다.
@kangsamsung
@kangsamsung 2 года назад
메크로, 중간 딜레이 어떻게 해야 할까? maxResults:3000 DELLY:3000 ????
@oneglobal8387
@oneglobal8387 4 года назад
벌써 마지막이라니.. AIP개념과 구글시트 활용하는 예시 번외편 한번 요청 드려 봅니다!
@legacycoder
@legacycoder 4 года назад
넵. 5분 단위의 짤막한 기능소개 영상들을 준비중입니다.
@MeTooYuToo
@MeTooYuToo 3 месяца назад
Bgm 때문에 강의 집중이 안되네요 ㅎ
@legacycoder
@legacycoder 3 месяца назад
좋은 bgm 추천 부탁드립니다.ㅎㅎ
Далее
엑셀 매크로만들기
10:19
Просмотров 107 тыс.
Физика пасты Карбонара 🧪🔬
00:57
Embedded Macros
16:48
Просмотров 1,1 тыс.