LANG SELRCT

Google Apps Scriptのコードを書く場所  (新規作成: スプレッドシート | スクリプトエディタ

2022年8月15日月曜日

Google SpreadsheetのnotesをDocumentに書き出したい


Google SpreadsheetのnotesをまとめてDocumentに書き出したくて書いたコードです。

実行プロセス
  1. getSheetNotes():noteを取得したいシートの範囲を指定して取得します
  2. notes.join("\n"):取得したデータ(配列)を改行でつないで文字列にします
  3. createSingleSentence(str):一文ごとに分けます
    • str.replace(/(?<![a-zA-Z0-9!?])[\s ](?![a-zA-Z0-9!?])/g, ""):英数以外の不要な半角スペースを削除(もとの文章に不要な半角がなければ省略)
    • .replace(/。/g, "。\n\n"):すべての「。」のあとに改行2つ追加
  4. addTextToDocument(singleSentences):指定したドキュメントに書き出します



コード.gs
function writeNotesToDocument() {
  const notes = getSheetNotes();
  const str = notes.join("\n");
  const singleSentences = createSingleSentence(str);
  addTextToDocument(singleSentences);
}

function getSheetNotes() {
  const ssUrl = "SPREADSHEET_URL";
  const ss = SpreadsheetApp.openByUrl(ssUrl);
  const sh = ss.getSheets()[0];
  const col = "E";
  const startRow = 2;
  const endRow = 378;
  const range = sh.getRange(col + startRow + ":" + col + endRow);
  const notes = range.getNotes();
  Logger.log(notes);
  return notes;
}

function createSingleSentence(str) {
  const sigleSentence = str.replace(/(?<![a-zA-Z0-9!?])[\s ](?![a-zA-Z0-9!?])/g, "").replace(/。/g, "。\n\n");
  return sigleSentence;
}

function addTextToDocument(text) {
  const url = "DOCUMENT_URL";
  const doc = DocumentApp.openByUrl(url);
  const body = doc.getBody();
  body.appendParagraph(text);
}


参考

スプレッドシートのノートを取得する

Googleドキュメントにテキストを追加したい

正規表現で英数以外のテキストの間にある半角スペースを削除したい

Google Driveで特定フォルダ内にあるファイルの説明をDocumentに書き出したい


Google Driveの特定フォルダ内にあるファイルの説明をすべて取得してドキュメントに書き出したくて書いたコードです。

書き出す順番はファイル名を昇順で並べ替えています。

実行プロセスの概要
  1. getFileDescriptionsInFolder() :フォルダを指定してファイルをすべて取得します
  2. fileObjArray.sort(asc):ファイル名の昇順で並べ替えます
  3. createDescriptionArray(sortedArray) :説明だけの配列を作ります
  4. descriptionsArray.join("\n") :配列を改行でつなげた文字列にします
  5. addTextToDocument(str) :指定したDocumentに書き出します



コード.gs
function addFileDescriptionsToDocument() {
  const fileObjArray = getFileDescriptionsInFolder();
  const sortedArray = fileObjArray.sort(asc);
  Logger.log(sortedArray);
  const descriptionsArray = createDescriptionArray(sortedArray);
  const str = descriptionsArray.join("\n");
  addTextToDocument(str);
}

function getFileDescriptionsInFolder() {
  const folderId = "FOLDER_ID";
  const folder = DriveApp.getFolderById(folderId);
  const files = folder.getFiles();
  let array = [];
  while(files.hasNext()) {
    const file = files.next();
    const obj = {};
    obj["name"] = file.getName();
    obj["url"] = file.getUrl();
    obj["description"] = file.getDescription();
    array.push(obj);
  }
  return array;
}

function asc(a, b){
  const targetA = a.name;
  const targetB = b.name;
  if(targetA > targetB){
    return 1;
  }else if(targetA < targetB ){
    return -1;
  }else{
   return 0;
  }
}

function createDescriptionArray(sortedArray) {
  const array = [];
  const target = "description";
  for(let i = 0; i < sortedArray.length; i++){
    const description = sortedArray[i][target];
    array.push(description);
  }
  return array;
}

function addTextToDocument(description) {
  const url = "DOCUMENT_URL";
  const doc = DocumentApp.openByUrl(url);
  const body = doc.getBody();
  body.appendParagraph(description);
}



参考

Google Driveのファイルの説明をフォルダ単位で取得したい

Google Driveのファイルの説明をフォルダ単位で取得したい


ファイル単位で説明を取得する方法は
で書きました。

ここではフォルダ単位でファイルの説明を取得してみます。



コード.gs
function getFileDescriptionsInFolder() {
  const folderId = "FOLDER_ID";
  const folder = DriveApp.getFolderById(folderId);
  const files = folder.getFiles();
  let array = [];
  while(files.hasNext()) {
    const file = files.next();
    const obj = {};
    obj["name"] = file.getName();
    obj["url"] = file.getUrl();
    obj["description"] = file.getDescription();
    array.push(obj);
  }
  Logger.log(array);
}


実行すると以下のようなログが出力されます

[
  {
    name=ファイル名, 
    description=説明, 
    url=ファイルのURL
  }, 
  {
    name=ファイル名, 
    description=説明, 
    url=ファイルのURL
  }, 
]


参考

Google Driveにあるファイルの説明を読み書きしたい 

Google Driveにあるファイルの説明を読み書きしたい


ここで言うGoogle Driveにあるファイルの説明とは

ファイルの詳細にある「説明を追加」項目です。
詳細の表示・非表示は右上の「i」アイコンで切り替えられます。



説明を追加する



コード.gs
function updateFileDescription() {
  const fileId = "FILE_ID;
  const text = "テキスト入力\n次の行";
  const file = DriveApp.getFileById(fileId);
  file.setDescription(text);
}



実行結果





説明を取得する



コード.gs
function getFileDescription() {
  const fileId = "FILE_ID";
  const file = DriveApp.getFileById(fileId);
  const description = file.getDescription();
  Logger.log(description);
}



実行結果



参考

getDescription() 

setDescription(description)

2022年5月8日日曜日

Google Apps Scriptでドキュメントに画像を配置したい(フォルダ内の複数画像)


Google Apps Scriptでドキュメントに画像を配置したい では、ひとつの画像をドキュメントに配置しました。

今回は、特定のフォルダ内にある画像を一気に配置したくて書いたコードです。

画像が大きく見えるように画像サイズは1.2倍にしました。



コード.gs
const docUrl = "https://docs.google.com/document/d/ID/edit";

const FOLDER_ID = "Google Drive FOLDER ID";

function insertImages() {
  const doc = DocumentApp.openByUrl(docUrl);
  const docBody = doc.getBody();
  const docWidth = docBody.getPageWidth();
  const docHeight = docBody.getPageHeight();
  const fileIds = getFileIds();
  for(let i = 0; i < fileIds.length; i++) {
    const image = DriveApp.getFileById(fileIds[i]);
    docBody.getParagraphs()[0].insertInlineImage(0, image)
                              .setWidth(docWidth*1.2)
                              .setHeight(docHeight*1.2);
  }
}

function getFileIds() {
  let fileIds = [];
  const folder = DriveApp.getFolderById(FOLDER_ID);
  const files = folder.getFiles();
  while(files.hasNext()) {
    const file = files.next();
    const id = file.getId();
    fileIds.push(id);
  }
  return fileIds;
}



関連記事

Google Apps Scriptでドキュメントに画像を配置したい

2022年5月7日土曜日

Google Apps Scriptでドキュメントに画像を配置したい


Googleドライブにある画像ファイルをドキュメントに配置したくて書いたコードです。

画像の大きさがドキュメントのページ範囲に収まるように、getPageWidth, getPageHeightを使いました。



コード.gs
const docUrl = "https://docs.google.com/document/d/ID/edit";

const imageUrl = "https://drive.google.com/file/d/ID/view?usp=sharing";

const imageId = imageUrl.split("/d/")[1].split("/view?")[0]

const image = DriveApp.getFileById(imageId);

function myFunction() {
  const doc = DocumentApp.openByUrl(docUrl);
  const docBody = doc.getBody();
  const docWidth = docBody.getPageWidth();
  const docHeight = docBody.getPageHeight();
  docBody.getParagraphs()[0].insertInlineImage(0, image).setWidth(docWidth).setHeight(docHeight);
}


参考

insertInlineImage(childIndex, image)

Class InlineImage

Class Body

2022年4月16日土曜日

Googleスライドで文字色を一気に変更したい


スライドに配置されている図形内の文字色を#434343に一括変更したくて書いたコードです。


前提条件
SLIDE_IDで指定されたスライドのページには一つの図形があり、その図形にはテキストが入力されている



コード.gs
function changeFontColor() {
  const slideUrl = 'https://docs.google.com/presentation/d/SLIDE_ID/edit#slide=id.p';
  const slide = SlidesApp.openByUrl(slideUrl);
  const slides = slide.getSlides();

  const textColor = "#434343";
  const startPage = 0;
  const endpage =  slides.length


  for(let i = startPage; i < endpage; i++) {
    const element = slides[i].getShapes()[0];
    element.getText().getTextStyle().setForegroundColor(textColor);
  }
}



Googleスライドでテキストサイズを一気に変更したい


スライドに配置されている図形内のテキストサイズを24に一括変更したくて書いたコードです。


前提条件
SLIDE_IDで指定されたスライドのページには一つの図形があり、その図形にはテキストが入力されている



コード.gs
function changeFontSize() {
  const slideUrl = 'https://docs.google.com/presentation/d/SLIDE_ID/edit#slide=id.p';
  const slide = SlidesApp.openByUrl(slideUrl);
  const slides = slide.getSlides();

  const fontSize = 24;
  const startPage = 0;
  const endPage = slides.length;

 
  for(let i = startPage; i < endPage; i++) {
    const element = slides[i].getShapes()[0];
    element.getText().getTextStyle().setFontSize(fontSize)
  }
}



Googleスライドにページを追加してテキストの上下左右を中央に揃えたい


Googleスライドのページを自動作成したくて書いたコードです。

こういう二次元の配列があって
 [["はれ", "晴れ", "hare"],["あめ", "雨", "ame"]];


一つの配列をもとに一つのページを作りたい。

やりたいこと
  1. 高さを3等分した図形を配置してその中にテキストを入れたい
  2. ページの背景は白、枠線なし
  3. テキストは中央に揃えたい
  4. 一番上のテキストは下揃えにしたい
  5. 真ん中のテキストは上下も中央に揃えたい
  6. 一番下のテキストは上揃えにしたい
  7. 上中下それぞれのテキストの色とサイズを指定したい



コード.gs
const slideUrl = "https://docs.google.com/presentation/d/SLIDE_ID/edit#slide=id.p";
const textColor = ["#b7b7b7", "#000000", "#b7b7b7"];
const contentAlignment = SlidesApp.ContentAlignment
const fontSize = 60;
const valuesArray = [["はれ", "晴れ", "hare"],["あめ", "雨", "ame"]];

function insertNewPage() {
  const slide = SlidesApp.openByUrl(slideUrl);
  const pageWidth = slide.getPageWidth();
  const pageHight = slide.getPageHeight();
  const height = [0, pageHight/3, (pageHight/3)*2];

   for(let i = 0; i < valuesArray.length; i++) {
     const values = valuesArray[i];
     createPage(slide, pageWidth,pageHight, height, textColor, contentAlignment, values);
  }
}

function createPage(slide, pageWidth, pageHight, height, textColor, contentAlignment, values) {
  const slides = slide.getSlides();
  const newPage = slide.insertSlide(slides.length)
  const position = [contentAlignment.BOTTOM, contentAlignment.MIDDLE, contentAlignment.TOP];

  for(let i = 0; i < values.length; i++) {
    const rect = newPage.insertShape(SlidesApp.ShapeType.RECTANGLE)
    .setWidth(pageWidth)
    .setHeight(pageHight/3)
    .setTop(height[i])
    .setLeft(0);

    rect.getText().setText(values[i])
    .getTextStyle().setFontSize(fontSize).setForegroundColor(textColor[i]);

    rect.getFill().setSolidFill("#FFFFFF");
    rect.getBorder().setTransparent();
    rect.getText().getParagraphStyle().setParagraphAlignment(SlidesApp.ParagraphAlignment.CENTER);
    rect.setContentAlignment(position[i]);
  }
}



参考

Editing and styling text

setContentAlignment(contentAlignment)

Enum ContentAlignment 

Enum ParagraphAlignment


2022年2月6日日曜日

Google Apps ScriptでOAuthのScopeを設定したい


スクリプトに与えるOAuth Scopeの話です。

明示的に変更しなくてもある程度は自動判定してくれますが、手動でさらに絞りたいときにはマニフェストファイル(appsscript.json)で変更できるようです。

公式ドキュメントに記載されている以下について、2022/02/06現在のエディタUIで試してみました。


スプレッドシートのファイル名を「Hello」に変更するコード.gsを例に書いていきます。



コード.gs
function myFunction() {
  var ss = SpreadsheetApp.openById("ファイルID");
  ss.rename("Hello");
}


ファイルIDを指定して実行すると、指定したファイル名が「Hello」になります。



現在のOAuthスコープを見てみる


概要を開きます。


プロジェクトのOAuthスコープが表示されます。

https://www.googleapis.com/auth/spreadsheets
Googleドライブでスプレッドシートを表示、編集、作成、削除できるため、ファイル名を「Hello」に変更できました。



マニフェストファイル(appsscript.json)を表示してみる


「プロジェクトの設定」を開きます。


マニフェストファイルをエディタで表示するをチェックします。



エディタにappsscript.jsonが表示されて、中身を確認できるようになります。



appsscript.jsonでOAuthスコープを設定してみる

以下のようにoauthScopesを追加して、スプレッドシートを表示するだけの権限に変更してみます。

appsscript.json
{
  "timeZone": "America/New_York",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/spreadsheets.readonly"
    ]
}


https://www.googleapis.com/auth/spreadsheets.readonly
Googleスプレッドシートを表示するだけで、それ以外の編集・作成・削除はできなくなります。



もう一度プロジェクトのOAuthスコープを見てみる



https://www.googleapis.com/auth/spreadsheets
だったのが
https://www.googleapis.com/auth/spreadsheets.readonly
に変更されて、表示するだけしかできなくなりました。


この状態でコードを実行すると、編集権限がないため、以下のようなエラーが出ます。


Required permissions: https://www.googleapis.com/auth/spreadsheets
と出ているので、OAuthスコープにそれを追加してやるとエラーが解消されます。

2022年1月3日月曜日

GASでAPIを作ってPOSTでpayloadを渡したい


MISSION
Google Apps ScriptのWebアプリにpayloadでデータを渡したい


KEY
eventObject.postData.contents


PROCESS 
Google Apps Scriptでpayloadを受け取るWebアプリを作る(api.gs)

そのWebアプリにpayloadを渡すコードを書く(コード.gs)


STEPS

STEP1
Apps Scriptの新規プロジェクトを作成します


STEP2
api.gsをコピーして貼り付けます


STEP3
const FOLDER_ID = "フォルダID" の右辺に、出力先となるGoogleドライブのフォルダIDを入れます


STEP4
Webアプリケーションとして導入します


STEP5
もう一つ新規でApps Scriptのプロジェクトを作成します


STEP6
コード.gsをコピーして貼り付けます


STEP7
const url = 'api.gsのWebアプリURL' の右辺に、STEP4で導入したWebアプリのURLを入れます


STEP8
createData()を実行します


Googleドライブの指定したフォルダにpayloadで渡したデータが保存されます。
ログにsuccessと保存したデータが表示されます。

最新の投稿

Google SpreadsheetのnotesをDocumentに書き出したい

Google SpreadsheetのnotesをまとめてDocumentに書き出したくて書いたコードです。 実行プロセス getSheetNotes():noteを取得したいシートの範囲を指定して取得します notes.join("\n"):取得したデータ(...