Google 프레젠테이션 그룹 작업

슬라이드의 그룹화된 요소의 특정 문자열을 변경하는 코드를 작성했습니다.
상당히 의외로 빠져 포인트가 있어 더 이상 쓰고 싶지 않기 때문에 메모.

실제로 스프레드 시트 정보를 반영한다는 사용법을하고 있습니다.

그룹화하지 않고 처리하는 것도 가능하지만,
그룹화하는 것이 지정된 슬라이드에서 getPageElements()취득하는 요소수가 적고, 그룹내의 구조와 처리 내용이 동일하면,
그룹화하는 이점은 있을까 생각합니다.

그룹 내의 특정 문자 변경



원래 getTitle에서 했지만 객체가 바뀌면 제목이 사라지기 때문에,
나열된 텍스트가 일치하면 변경할 코드로 변경했습니다.


function myFunction() {
  const pre = SlidesApp.getActivePresentation();
  const slide = pre.getSlides()[1]; //2ページ目取得
  const elems = slide.getPageElements();

  for(const elem of elems) {
    if(elem.getPageElementType().toString() == 'GROUP') {
      replaceText_(elem);
    }
  }
}

/**
* グループのオブジェクトを渡して、各子要素のテキストが一致した場合に置換
*
* @param {Object} グループのオブジェクト
*/
function replaceText_(groupElem) {
  const elemsInGroup = groupElem.asGroup().getChildren();
  let text;

  for(const elem of elemsInGroup) {
    console.log(elem.getPageElementType().toString());
    if (elem.getPageElementType().toString() !== 'SHAPE') continue;
    text = elem.asShape().getText();

    switch (text.asString()) {
      case 'PJ名\n':
        text.replaceAllText(text.asString(), 'PJ名_変更');
        break;
      case '氏名\n':
        text.replaceAllText(text.asString(), '氏名_変更');
        break;
      case 'しめい\n':
        text.replaceAllText(text.asString(), 'しめい_変更');
        break;
      case '目標\n':
        text.replaceAllText(text.asString(), '目標_変更');
        break;
      case '実績\n':
        text.replaceAllText(text.asString(), '実績_変更');
        break;
      case '達成率\n':
        text.replaceAllText(text.asString(), '達成率_変更');
        break;
    }
  }
}


이유는 모르지만 각 텍스트 뒤에 줄 바꿈이 들어간다는
수수께끼 사양이 있었기 때문에 일치 조건에 \n를 추가했습니다.

if 문을 아래와 같이 처리해도 괜찮습니다.
if(/PJ名\s/.test(text.asString())) {
  //処理
} else if (/氏名\s/.test(text.asString())) {
  //処理
}

사진을 교체하는 경우


function myFunction() {
  const pre = SlidesApp.getActivePresentation();
  const slide = pre.getSlides()[1]; //2ページ目取得
  const elems = slide.getPageElements();

  for(const elem of elems) {
    if(elem.getPageElementType().toString() == 'GROUP') {
      replaceText_(elem);
    }
  }
}

/**
* グループのオブジェクトを渡して、各子要素のテキストが一致した場合に置換
*
* @param {Object} グループのオブジェクト
*/

function replaceText_(groupElem) {
  const elemsInGroup = groupElem.asGroup().getChildren();
  let text;

  const pictureObj = getPictures_('フォルダID');

  for(const elem of elemsInGroup) {
    console.log(elem.getPageElementType().toString());
    if (elem.getPageElementType().toString() === 'SHAPE') {
      text = elem.asShape().getText();

      switch (text.asString()) {
        case 'PJ名\n':
          text.replaceAllText(text.asString(), 'PJ名_変更');
          break;
        case '氏名\n':
          text.replaceAllText(text.asString(), '氏名_変更');
          break;
        case 'しめい\n':
          text.replaceAllText(text.asString(), 'しめい_変更');
          break;
        case '目標\n':
          text.replaceAllText(text.asString(), '目標_変更');
          break;
        case '実績\n':
          text.replaceAllText(text.asString(), '実績_変更');
          break;
        case '達成率\n':
          text.replaceAllText(text.asString(), '達成率_変更');
          break;
      }
    } else if (elem.getPageElementType().toString() === 'IMAGE') {      
      elem.asImage().replace(pictureObj['写真の名前']);
    }
  }
}


/**
* フォルダ内の名前とBlobデータをオブジェクトで返す
* 
* @param {String} フォルダID
* @return {Object} key:拡張子を除いた写真の名前, value:写真のblobオブジェクト
*/
function getPictures_(folderId) {

  const folder = DriveApp.getFolderById(folderId);
  const files = folder.getFiles();

  const obj = {};

  while (files.hasNext()) {
    const file = files.next();
    obj[file.getName().replace(/\..+/g, '')] = file.getBlob();
  }

  return obj;
}

좋은 웹페이지 즐겨찾기